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

get longest path between two nodes with common nodes

我有一张图表,其中显示了朋友和他们居住的城市之间的联系。朋友的联系用黑色箭头表示,城市的联系用虚线表示。 我想获得居住在一个普通城市的朋友的最长路径,在 A 先生和 D 先生之间。 答案是路线:A-> B-> E-> D。 应该为它写什么查询?

本机查询(不使用 APOC add-on):

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