我正在构建像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的新手,任何帮助都会受到赞赏。对不起,任何英文错误。
答案 0 :(得分:1)
您可以查看Memgraph高性能内存事务图数据库。 Memgraph是openCypher和Bolt兼容的。 (免责声明:我是联合创始人兼首席技术官)。 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)可选择删除计算出的权重属性。 (如果它们未被删除,它们的值可能会随着时间的推移而变得无效,因此不应重复使用这些值。)