首页 文章

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

提问于
浏览
3

这更像是一个“如何”的问题,可能有不同的方法,但试图找到最有效和最有效的方法来解决这个要求 .

我有一个图表,其中有节点作为fork节点,即它们产生两个路径,这些路径后来在其他节点相遇,我知道fork节点的节点id和属性(下面的例子中的Node A)并且想要知道两条路径相遇的节点(前面的节点B) .

注意 - 这些路径可以是可变长度的,即一个可以有6个节点而另一个只有2个节点,例如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处再次相遇,那么我想让Node B了解节点A,请提示我们如何在Cypher中执行此操作 .

谢谢,Deepesh

2 回答

  • 1

    我将假设您通过它的 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
    
  • 3

    我的问题的答案如下(感谢Brian - 用LIMIT 1更新他的答案)

    MATCH
    path1 = (a)-[*1..10]->(b),
    path2 = (a)-[*1..10]->(b)
    WHERE a.id = 1234 AND path1 <> path2
    RETURN b LIMIT 1
    

    添加LIMIT 1仅返回交叉点节点,否则它也返回交叉点节点后面的所有节点 .

相关问题