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

时间:2014-12-24 07:08:39

标签: graph path neo4j cypher

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

我有一个图表,其中有节点作为fork节点,即它们产生两个路径,这些路径后来在其他节点会合,我知道fork节点的节点id和属性(下面的例子中的节点A)并且想知道两条路径相遇的节点(前面的节点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

2 个答案:

答案 0 :(得分:4)

我将假设您通过它的a属性知道节点id并且它是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 :(得分:1)

我的问题的答案如下(感谢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仅返回交叉点节点,否则它也返回交叉点节点后面的所有节点。