代码之家  ›  专栏  ›  技术社区  ›  Itay Regev

在Neo4j中Dijkstra算法中使用多次属性

  •  2
  • Itay Regev  · 技术社区  · 6 年前

    在Cypher中是否有任何方法可以使用Dijkstra算法计算具有多个属性的最小权重,例如,而不是:

    CALL apoc.algo.dijkstra(start, end, 'RELATED_TO>', '1_property') 
    yield path, weight
    

    执行以下操作:

      CALL apoc.algo.dijkstra(start, end, 'RELATED_TO>', '1_property+2_property') 
    yield path, weight
    

    这对我没用。你有什么建议吗?因为我想在权重计算中加入路径长度,作为对最小权重计算的影响。

    2 回复  |  直到 6 年前
        1
  •  2
  •   buda    6 年前

    你可以看看 Memgraph 、高性能、内存和事务图形数据库。 openCypher Bolt 可共用的(免责声明:我是联合创始人兼首席技术官)。Memgraph内置了加权最短路径功能,通过用户定义的lambda函数计算总权重。基于此数据集

    CREATE (n1 {id: 1}) CREATE (n2 {id: 2}) CREATE (n3 {id: 3}) CREATE (n4 {id: 4})
    CREATE (n1)-[:E {weight1: 1, weight2: 1}]->(n2)
    CREATE (n1)-[:E {weight1: 2, weight2: 10}]->(n3)
    CREATE (n2)-[:E {weight1: 3, weight2: 100}]->(n4)
    CREATE (n3)-[:E {weight1: 4, weight2: 1}]->(n4);
    

    相关Memgraph的查询为

    MATCH (a {id: 1})-[
              edges *wShortest (e, n | e.weight1 + e.weight2) total_weight
          ]-(b {id: 4})
    RETURN startNode(head(edges)).id +
           reduce(acc = "", edge IN edges | acc + " -> " + endNode(edge).id) AS hops,
           total_weight;
    

    结果如下。

    | hops      | total_weight |
    |-----------|--------------|
    |1 -> 3 -> 4| 17.0         |
    
        2
  •  0
  •   Michael Hunger    6 年前

    对于apoc,您需要使用一个额外的属性来保存总和。

    对于图算法中的一个,可以使用将两个权重相加的图投影。

    https://neo4j-contrib.github.io/neo4j-graph-algorithms/#_single_source_shortest_path

    您可以使用 nodeQuery relationshipQuery 在config部分中。

    CALL algo.shortestPath.stream(start, end, 'weight',
    {nodeQuery:'match (n) return id(n) as id', 
     relationshipQuery:'match (n)-[r]->(m) return id(n) as source, id(m) as target, r.weight1+r.weight2 as weight', 
    defaultValue:1.0,direction:'OUTGOING'}) 
    YIELD nodeId, cost