【问题标题】:get longest path between two nodes with common nodes用公共节点获得两个节点之间的最长路径
【发布时间】:2020-09-27 09:31:50
【问题描述】:

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

【问题讨论】:

  • 关系的方向对你来说重要吗?也可以是 D -> E -> B -> A 吗?
  • 是的,方向很重要

标签: graph neo4j path nodes longest-path


【解决方案1】:

本机查询(不使用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

【讨论】:

  • 我有183678个城市和5058个人。当我使用您建议的查询时,回答查询需要很长时间。
猜你喜欢
  • 2011-03-08
  • 1970-01-01
  • 2011-03-08
  • 1970-01-01
  • 2021-12-18
  • 1970-01-01
  • 1970-01-01
  • 2016-03-04
  • 2023-03-24
相关资源
最近更新 更多