Neo4j dijkstra预先计算成本

时间:2018-05-24 14:48:53

标签: neo4j

我正在构建像app这样的方向,我正在使用Neo4j作为我的数据库 我一直在努力寻找能够帮助我在Neo4j中做我想做的事情的解决方案。我搜索了很多,我找不到我需要的东西。

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

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

{ “intersectionNode”:25632284, “polution_level”:2, “intersection_distance”:0.0, “噪音_”:5, “成本”:0 }

我是Neo4j的新手,任何帮助都会受到赞赏。对不起,任何英文错误。

2 个答案:

答案 0 :(得分:1)

您可以查看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         |

答案 1 :(得分:0)

解决方法是:

(1)在每个相关关系中生成一个新的计算权重属性。

(2)使用计算出的权重属性运行你的dijkstra查询。

(3)可选择删除计算出的权重属性。 (如果它们未被删除,它们的值可能会随着时间的推移而变得无效,因此不应重复使用这些值。)