Neo4j 具有选择标准的不定长度遍历图

问题描述 投票:0回答:1

我有一个长度未知的图表。我需要能够从一个节点开始并遍历整个链的长度。我可以使用如下所示的量化路径模式来做到这一点

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.

neo4j cypher
1个回答
0
投票

在问题的开头,您似乎描述了以下内容,您只想返回绿色箭头后面的路径:

follow the green arrow 1

执行此操作需要将关系与先前迭代中的节点进行比较。您可以使用谓词函数来做到这一点:

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

但是阅读你的第二个查询,也许你的意思更像是这样的:

follow the green arrow 2

在这种情况下此查询将起作用:

MATCH (a {name: 'A'})
MATCH p = (a)-[{name: a.name}]->+()
RETURN p

正如您建议的错误消息,第一个节点变量

a
需要绑定在前面的
MATCH
子句中。

© www.soinside.com 2019 - 2024. All rights reserved.