从图形获取文本格式的路径 [英] Get Path in text format from Graph

查看:16
本文介绍了从图形获取文本格式的路径的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在我的图表中,数据如下所示。

其中a、b、c、d是节点,R1、R2、R3、R4是关系。

a-r1->b
b-r2->a
b-r2->c
c-r1->b
d-r3->a
a-r1->d like this.

我正在使用以下Cypher获取最大深度为3的路径。

MATCH p=(n)-[r*1..3]-(m) WHERE n.id=1 and m.id=2  RETURN p 
这里返回p是路径,我想以这样的文本格式显示路径。

示例:假设路径长度为3。 a-r1->b-r2->c以文本格式表示。

这可能吗?

推荐答案

差不多。我会给你大部分答案,但我自己答不完。也许会有另一个密码向导出现并改进答案,但这是我为您准备的。

match p=(n)-[r*1..3]-(m) 
WHERE id(n)=1 AND id(m)=2
WITH extract(node in nodes(p) | coalesce(node.label, "")) as nodeLabels,
     extract(rel in relationships(p) | type(rel)) as relationshipLabels
WITH reduce(nodePath="", nodeLabel in nodeLabels | nodePath + nodeLabel + "-") as nodePath,
     reduce(relPath="", relLabel in relationshipLabels | relPath + relLabel + "-") as relPath
RETURN nodePath, relPath
LIMIT 1;

编辑-在您的问题中指定WHERE条件n.id=1 and m.id=2。请注意,这可能不是您想要的。节点ID通常使用WHERE id(n)=1 AND id(m)=2检查。从技术上讲,ID不是节点属性,所以我对其进行了更改。

好的,我们要匹配路径。然后,我们将使用extract函数从节点中提取label属性,并创建名为nodeLabels的集合。我们将对关系类型执行相同的操作。这里reduce所做的是将这些集合中的每个单独字符串向下累加为单个字符串。因此,如果您的节点是a、b和c,您将得到一个看起来像a-b-c-nodePath字符串。同样,您的关系字符串类似于r1-r2-r3-

现在,我知道您想要交错,并且您更喜欢像a-r1-b-r2-c这样的输出。这就是我看到的问题.

通常,我采用的方法是使用FOREACH迭代节点标签集合。因为您知道路径是什么,所以比节点少一个关系,理想情况下(在伪代码中)我想做这样的事情:

buffer = ""
foreach x in range(0, length(nodeLabels)) | 
   buffer = buffer + nodeLabels[idx] + "-" + relLabels[idx] + "->")

这将是一种简化为您想要的字符串的方式。您不能使用reduce函数,因为它不提供获取您在集合中的哪个索引的方法。这意味着您可以迭代其中一个集合,但不能同时迭代另一个集合。这个FOREACH伪代码将不起作用,因为我认为FOREACH的第二部分必须是图形上的变异操作,您不能像我在这里所做的那样仅仅使用它来累加字符串,或者像extract函数那样使用它。

据我所知,你可能会被困在这里。希望有人能证明我在这一点上是错的--我不是百分之百肯定。

最后,在此之后的另一种方法是,如果有一个路径函数提取节点/关系对,而不是像我上面使用的那样,仅单独使用nodes()relationships(),那么您可以使用该函数迭代一个集合,而不是像我上面的代码那样混洗两个集合,但以失败告终。遗憾的是,我不认为有这样的路径函数,所以这就是我认为您可能陷入困境的更多原因。

现在,实际上,您总是可以用java或其他语言执行此查询,返回路径,然后使用您想要构建此字符串的任何编程语言的全部功能。但是纯粹的密码呢?我很怀疑。

这篇关于从图形获取文本格式的路径的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆