首页 > 解决方案 > 具有预先计算成本的 Neo4j dijkstra

问题描述

我正在构建一个类似应用程序的方向,并且我正在使用 Neo4j 作为我的数据库我一直在努力寻找一个可以帮助我在 Neo4j 中做我想做的事情的解决方案。我搜索了很多,但找不到我需要的东西。

用户可以选择起点和终点,并按照他希望生成路径的方式进行定制。路径(最短的)将根据距离、污染和噪声生成。用户将能够为这三个选项分配百分比。举个例子:计算最短路径的成本是:cost = (distance * 0.25) + (noise_level * 0.25) + (pollution_level * 0.5) for each 这意味着关系成本属性总是动态的。

我正在使用 apoc.algo.dijkstra 程序来帮助我。但 dijkstra 只允许我给出关系属性名称。有没有办法做到这一点?两个节点之间的关系示例:

{ “intersectionNode”:25632284,“polution_level”:2,“intersection_distance”:0.0,“noise_level”:5,“cost”:0 }

我在 Neo4j 有点新,任何帮助将不胜感激。抱歉有任何英文错误。

标签: neo4j

解决方案


您可以查看Memgraph,高性能的内存事务图形数据库。Memgraph 与openCypherBolt兼容。(免责声明:我是联合创始人兼首席技术官)。Memgraph 内置加权最短路径功能,其中总权重通过用户定义的 lambda 函数计算。对于您的情况并基于此数据集

CREATE (n1 {id: 1}) CREATE (n2 {id: 2}) CREATE (n3 {id: 3}) CREATE (n4 {id: 4})
CREATE (n1)-[:E {pollution_level: 1, distance: 1.0, noise_level: 5}]->(n2)
CREATE (n1)-[:E {pollution_level: 2, distance: 2.0, noise_level: 4}]->(n3)
CREATE (n2)-[:E {pollution_level: 3, distance: 2.0, noise_level: 3}]->(n4)
CREATE (n3)-[:E {pollution_level: 4, distance: 1.0, noise_level: 2}]->(n4);

相关的 Memgraph 查询将与此类似

  MATCH (a {id: 1})-[
            edges *wShortest
                (e, n | (e.distance * 0.25) +
                (e.noise_level * 0.25) +
                (e.pollution_level * 0.5))
            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 -> 2 -> 4| 4.75         |

推荐阅读