Neo4j - 每个级别的最短路径,达到N级

时间:2017-01-23 16:45:54

标签: neo4j cypher graph-databases

我试图找到两个节点之间的最佳路径。我遵循两种方式

  1. 使用shortestPath()方法找到最短路径
  2. 使用reduce function
  3. 查找所有路径并过滤最佳路径

    在第一种方法中,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度分离 - 一个路径
    二度分离 - 一条路径
    三度分离 - 一条路径就像明智一样。

    我怎样才能做到这一点?

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