我有一个长度未知的图表。我需要能够从一个节点开始并遍历整个链的长度。我可以使用如下所示的量化路径模式来做到这一点
MATCH (:Station { name: 'Station A' })((:Station)-[:NEXT]->(:Station)){1,}(a:Station))
RETURN *
但是,返回所有节点还不够。在特定节点上,我有许多指向其他节点的 NEXT 关系。通过从前一个节点中提取名称属性,并将其与所有关系上的名称属性进行比较,可以确定要采取的正确路径。举个例子:
(:Station {name:"Station A"})-[:NEXT]->(:Station {name:"Station B"})
在名为“Station B”的 Station 节点,我有 3 个 NEXT 关系
[:NEXT {name:"Station A}]
[:NEXT {name:"Station B}]
[:NEXT {name:"Station C}]
正确的遍历是[:NEXT {name:"Station A}],因为B之前的节点是名称为“Station A”的节点
最终,我需要返回一条不定长度的链。在图表的每个步骤中,要采取的正确路径是由前一个节点上的值确定的。我如何通过 Cypher 查询来实现这一点?
谢谢你
我尝试了以下方法:
MATCH (a:Station { name: 'Station A' })((:Station)-[:NEXT {name:a.name}]->(:Station)){1,}(a:Station)) 返回*
但是出现以下错误
From within a quantified path pattern, one may only reference variables, that are already bound in a previous
比赛clause.
在问题的开头,您似乎描述了以下内容,您只想返回绿色箭头后面的路径:
执行此操作需要将关系与先前迭代中的节点进行比较。您可以使用谓词函数来做到这一点:
MATCH p = (:Station {name: 'A'}) ((n)-[r:LINK]-(:Station))+
WHERE all(i IN range(0, size(r) - 2) WHERE n[i].name = r[i+1].name)
RETURN p
但是阅读你的第二个查询,也许你的意思更像是这样的:
在这种情况下此查询将起作用:
MATCH (a {name: 'A'})
MATCH p = (a)-[{name: a.name}]->+()
RETURN p
正如您建议的错误消息,第一个节点变量
a
需要绑定在前面的MATCH
子句中。