Neo4j 如何使用Cypher搜索一组节点之间的最短距离

Neo4j 如何使用Cypher搜索一组节点之间的最短距离,neo4j,cypher,Neo4j,Cypher,我试图找出是否有办法在Neo4j中使用cypher来获得一组节点之间的最短距离 此搜索需要考虑的一些注意事项: -距离是节点之间关系的属性。距离值以米为单位 -所有节点之间都有一个给定距离的关系。 -要跟随的开始节点和结束节点必须是同一个节点 这就是我想要的输入: MATCH (root) -[root_p1:PATH_TO]-> (p1), (root) -[root_p2:PATH_TO]-> (p2), (root) -[root_p3:PATH_TO]-> (p3), (p1) -[p1

我试图找出是否有办法在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 . . . 匹配 (根)(根)(根)(根)(根)(根)(根)(根)(根)(根)(根)(根)(根)(根)(根)(根)(根)(根)(根)(根)(根)(根)(根)(根)(根)(根)(根)(p1)(根)(p1)(根)(根)(根)(根)(根)(根)(根)(根)(p1)【根(根)(根)(根)(根)(根)(根)(根)(根)(p1)【p1)(根)(根)(根)(根)(根)(根)(根)(根)(根)(根)(根)(根)(根)(根)(根)(根)(根)(根)(根)(根)(根)(根)(根)(p1)))))))【p1)(根)(根)(根)(根)(根)(根)(根)(根)(根)(根)(根)(根)(根)(根)(根)(根)(根)(根)(根)(根)(根)(根)(根)(根)(根)(根)(根)(根)(根)(根)(根)(根)(根)(根)(根)(根)(根)(根)(根)(根)(根_TO]>(p1),(p3)-(p3\u p2:路径到]->(p2) 其中ID(root)=10,ID(p1)=1,ID(p2)=2,ID(p3)=3 . . .
然后,结果应该是有助于获得最短路径的正确节点顺序。

此查询可能适合您的需要:

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\u TO
关系的所有有向循环路径;计算每条路径的总距离;获取总距离最短的路径(可能有多条路径中的一条);并返回其所有关系以及总距离


注意:对于大型图形,此查询可能需要很长时间。如果是这样,您可以尝试为可变长度模式设置合理的上限。例如,将
[rels:PATH\u to*]
替换为
[rels:PATH\u to*.5]

不清楚输出上应该显示什么。最好带上输入数据和所需结果的示例。