获得具有公共节点的两个节点之间的最长路径
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
我有一张图表,其中显示了朋友和他们居住的城市之间的联系。朋友的联系用黑色箭头表示,城市的联系用虚线表示。 我想获得居住在一个普通城市的朋友的最长路径,在 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