获得具有公共节点的两个节点之间的最长路径

问题描述

我有一个图表,其中显示了朋友及其居住城市的联系。朋友的联系通过黑色箭头指定,城市的联系以虚线指定。 我想让生活在A先生和D先生之间的共同城市中的朋友走的路最长。 答案就是路线:A-> B-> E->D。 应该为此写什么查询

enter image description here

解决方法

本地查询(不使用APOC附加组件):

MATCH path = (city:City)<-[:LIVES_IN]-(:Person)-[:KNOWS*]->(:Person)-[:LIVES_IN]->(city)
WHERE ALL(person IN nodes(path)[2..-2] WHERE (person)-[:LIVES_IN]->(city))
RETURN nodes(path)[1..-1]
ORDER BY length(path) DESC
LIMIT 1

要搜索特定城市(例如P1)的最长路径,请将第一行更改为:

MATCH path = (city:City {name: "P2"})<-[:LIVES_IN]-(:Person)-[:KNOWS*]->(:Person)-[:LIVES_IN]->(city)

APOC版本的性能可能更高,但是说实话,它需要进行衡量。可能性之一:

MATCH (person:Person)-[:LIVES_IN]->(city:City)
WITH city,collect(person) AS persons
CALL apoc.path.expandConfig(persons,{
    relationshipFilter: "KNOWS>",whitelistNodes: persons,minLevel: 1
})
YIELD path
RETURN nodes(path)
ORDER BY length(path) DESC
LIMIT 1