找到两个以上节点的最低共同祖先

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

找到两个节点的最低公共祖先是:

MATCH (c {id: id1})<-[*]-(x)-[*]->(d {id: id2}) RETURN x 

我们如何扩展它来找到有向树图中给定的 id 列表的最低共同祖先?

neo4j tree cypher graph-theory
1个回答
0
投票

这取决于你的 id 列表是如何来的。如果它们是成对的列表,您可以这样做:

// Done using WITH, but could be a param e.g. $pairs
WITH [[1, 2], [1, 3], [4, 5]] AS pairs 
UNWIND pairs AS pair
MATCH ({id: pair[0]})<-[*]-(x)-[*]->({id: pair[1]}) 
RETURN x

如果您将起始节点作为一个列表,将结束节点作为另一个列表,您可以这样做:

WITH [1, 2, 3, 4] AS list1, [5, 6, 7, 8] AS list2
UNWIND list1 AS c
UNWIND list2 AS d
MATCH ({id: c})<-[*]-(x)-[*]->({id: d})
RETURN x

请注意,如果

c
d
位于同一分支上,并且
d
c
的祖先(反之亦然),则您的模式将不起作用。更全面的解决方案如下,它使用
SHORTEST k
量化关系

MATCH SHORTEST 1 (c {id: id1})<--*(x)-->*(d {id: id2}) 
RETURN x 

x
永远是祖先。

这需要版本 5.21+。

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