这更像是一个“如何”的问题,可以有不同的方法,但试图找到最有效和最有效的方法来解决这个问题。
我有一个图表,其中有节点作为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
答案 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仅返回交叉点节点,否则它也返回交叉点节点后面的所有节点。