找到两个节点的最低公共祖先是:
MATCH (c {id: id1})<-[*]-(x)-[*]->(d {id: id2}) RETURN x
我们如何扩展它来找到有向树图中给定的 id 列表的最低共同祖先?
这取决于你的 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+。