Graph Neo4J Cypher-寻找两条路径的汇合点

Graph Neo4J Cypher-寻找两条路径的汇合点,graph,path,neo4j,cypher,Graph,Path,Neo4j,Cypher,这更多的是一个“如何”的问题,可以有不同的方法,但试图找到解决此需求的最有效的方法 我有一个图,其中有充当分叉节点的节点,即它们生成两条路径,这些路径稍后在其他节点相遇,我知道分叉节点(下面示例中的节点a)的节点id和属性,并且希望知道两条路径相遇的节点(下面示例中的节点B) 注意-这些路径可以是可变长度的,即一个路径可以有6个节点,而另一个路径只有2个节点,例如 NodeA -[]-> Node 1 -[]-> Node 2 -[]-> Node 3 -[]-> Nod

这更多的是一个“如何”的问题,可以有不同的方法,但试图找到解决此需求的最有效的方法

我有一个图,其中有充当分叉节点的节点,即它们生成两条路径,这些路径稍后在其他节点相遇,我知道分叉节点(下面示例中的节点a)的节点id和属性,并且希望知道两条路径相遇的节点(下面示例中的节点B)

注意-这些路径可以是可变长度的,即一个路径可以有6个节点,而另一个路径只有2个节点,例如

NodeA -[]-> Node 1 -[]-> Node 2 -[]-> Node 3 -[]-> Node 4 -[]-> Node 5 -[]-> Node 6 -[]-> Node B -[]-> Node C -[]-> Node D -[]-> Node E
NodeA -[]-> Node 7 -[]-> Node 8 -[]-> Node B -[]-> Node C -[]-> Node D -[]-> Node E
因此,如果你看到节点A生成两条路径,最终在节点B处再次相遇,那么我想让节点B知道节点A,请建议我们如何在Cypher中实现这一点

谢谢,
Deepesh

我将假设您通过它的
id
属性知道节点
a
,并且它是
1234
。此外,您可能希望在此处使用标签。我不确定你是否在使用它们,所以我把它们漏掉了

MATCH
  (a)-[*1..10]->(b),
  (a)-[*1..10]->(b)
WHERE a.id = 1234
RETURN b
您也可以返回路径的长度,但这将得到结果。还请注意,您可以调整路径的最大长度(本例中为
10
),作为查询性能的折衷(这取决于图形的结构)

编辑:

此外,如果这不起作用,您可能需要执行以下操作:

MATCH
  path1 = (a)-[*1..10]->(b),
  path2 = (a)-[*1..10]->(b)
WHERE a.id = 1234 AND path1 <> path2
RETURN b
匹配
路径1=(a)-[*1..10]->(b),
路径2=(a)-[*1..10]->(b)
其中a.id=1234,路径1路径2
返回b

我的问题的答案如下(感谢Brian-更新他的答案,限制为1)

匹配
路径1=(a)-[*1..10]->(b),
路径2=(a)-[*1..10]->(b)
其中a.id=1234,路径1路径2
返回b限制1

添加LIMIT 1以仅返回交叉点节点,否则它还会返回交叉点节点后面的所有节点。

这是一个简洁的问题,我喜欢你的答案。(我指的是第二个)。我想你必须说
path1path2
,否则你的第一个查询可能会两次遍历同一条路径。但另一个纠结是,在你的第二个查询中,路径不必在A处发散。假设我们有(A->n1->n3->B),然后(A->n1->n2->n4->B)。注意路径如何在n1之前不发散,在A处不发散。您的查询不会捕捉到这种情况,但我不确定这对OP是否重要。这是一个好的观点。在这种情况下,我认为您可能需要在路径上使用nodes()方法,尽管我不知道您是否可以在cypher中的数组上进行交集。至于
path1path2
,我非常确定,当您在
匹配的不同部分指定具有相同标签的两个节点时,cypher将自动为您执行交集(我想可能以前没有),但我不确定path1是否会发生这种情况可能
path1=最短路径((a)-[*1..10]>(b))对于这两条路径来说,这是一个有趣的问题。你能澄清一下吗?你是在寻找从A开始发散的路径吗?或者,如果他们沿着路径在其他地方分岔,并且在那之前分享一些步骤,可以吗?如果路径重叠(在中间的某个地方共享一个步骤),可以吗??在节点A之前,它的一条路径可能类似于X>Y>Z>A等。在节点A,它分成两条路径,然后它们在某个节点B相遇,路径的长度是可变的,所有这些节点之间的关系名称是[:NEXT],以回答您关于“如果它们沿着路径在其他地方发散”的问题-不,因为它们的分歧点将是节点“A”,但思路很好-谢谢你的提问
MATCH
path1 = (a)-[*1..10]->(b),
path2 = (a)-[*1..10]->(b)
WHERE a.id = 1234 AND path1 <> path2
RETURN b LIMIT 1