我正在试图弄清楚是否在Neo4j中使用cypher来获得一组节点之间的最短距离。
考虑此搜索的一些注意事项:
- 距离是节点之间关系的属性。距离值以米为单位
- 所有节点之间具有给定距离的关系
- 要遵循的起始节点和结束节点必须是同一节点。
这是我想要的输入:
MATCH (root) -[root_p1:PATH_TO]-> (p1), (root) -[root_p2:PATH_TO]-> (p2), (root) -[root_p3:PATH_TO]-> (p3), (p1) -[p1_root:PATH_TO]-> (root), (p1) -[p1_p2:PATH_TO]-> (p2), (p1) -[p1_p3:PATH_TO]-> (p3), (p2) -[p2_root:PATH_TO]-> (root), (p2) -[p2_p1:PATH_TO]-> (p1), (p2) -[p2_p3:PATH_TO]-> (p3), (p3) -[p3_root:PATH_TO]-> (root), (p3) -[p3_p1:PATH_TO]-> (p1), (p3) -[p3_p2:PATH_TO]-> (p2) WHERE ID(root) = 10 AND ID(p1) = 1 AND ID(p2) = 2 AND ID(p3) = 3 . . .
然后结果应该是正确的节点序列,这有助于获得最短的路径。
答案 0 :(得分:1)
此查询可能符合您的需要:
MATCH p=(n)-[rels:PATH_TO*]->(n)
WITH p, REDUCE(s = 0, x IN rels | s + x.distance) AS dist
WITH p, MIN(dist) AS d
ORDER BY d
LIMIT 1
RETURN RELATIONSHIPS(p), d;
它找到具有PATH_TO
关系的所有有向循环路径;计算每条路径的总距离;以最短的总距离获得一条路径(可能有很多路径);并返回所有关系以及总距离。
注意:对于大型图形,此查询可能需要很长时间。如果是这样,您可以尝试在可变长度模式上设置合理的上限。例如,将[rels:PATH_TO*]
替换为[rels:PATH_TO*..5]
。