我试图找到两个节点之间的最佳路径。我遵循两种方式
在第一种方法中,shortestPath()返回较小分离度的路径。而第二条路径返回聚合值中较小的路径。
Example 1:
MATCH (a:Person),(b:Person)
MATCH path=shortestPath((a)-[r*]-(b))
RETURN path
Example 2:
MATCH (a:Person),(b:Person)
MATCH path=(a)-[r*]-(b)
WITH path, REDUCE(distance=0, r IN relationships(path)|distance+r.distance) AS WEIGHT
RETURN path ORDER BY WEIGHT
但无论如何,我无法在每个级别找到最佳路径。那是
对于1度分离 - 一个路径
二度分离 - 一条路径
三度分离 - 一条路径就像明智一样。
我怎样才能做到这一点?
答案 0 :(得分:2)
因此,对于路径的每个长度,您想知道最低加权路径是什么?
这会给你你想要的东西吗?
// Match on all pairs of Person nodes
MATCH (a:Person),(b:Person)
// Find all paths in the graph
MATCH path=(a)-[r*]-(b)
// Get length of path and reduce to calculate weighted distance for each path
WITH length(path) AS len, path, REDUCE(distance=0, r IN relationships(path)|distance+r.distance) AS WEIGHT ORDER BY WEIGHT
// group by length of path and return lowest weighted path for each length
RETURN len, collect(path)[0] AS paths ORDER BY len
修改强>
Gabor在他的评论中指出,上述方法效率很低,不能扩展到大图。对于大型图形,您应该使用图形搜索算法,例如Dijkstra,可以从Cypher获得Neo4j's APOC procedueres。例如:
MATCH (from:Person{name:'A'}), (to:Person{name:'D'})
CALL apoc.algo.dijkstra(from, to, 'KNOWS', 'distance') yield path as path, weight as weight
RETURN path, weight