neo4j - 具有预先计算成本的 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 有点新,任何帮助将不胜感激。抱歉有任何英文错误。
解决方案
您可以查看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 |
推荐阅读
- c# - C#.NET 4.6 中的条带充电
- matlab - NetCDF 库在执行“创建”函数期间遇到错误 - “无效参数 (22)”
- list - 扑。按列表字段分组列表
- android - W / System.err:java.net.SocketException:套接字失败:Android中的EACCES(权限被拒绝)
- amazon-web-services - 对于现有的 AWS ACM 证书,我可以从电子邮件验证切换到 DNS 验证吗?
- openshift - replicas=1 - 这意味着 1 个 pod 还是 1 个 pod + 1 个副本正在运行?
- azure - Azure 测试和反馈 - 可以查看以前的会话吗?
- c++ - 为什么要像 MPFR 那样定义“typedef someStruct someName[1]”?
- android-studio - 无法在 Windows 10 上打开 Android Studio 4 - 白屏而不是项目
- jquery - 正则表达式使 HTML 输入数字仅包括负值