【问题标题】:neo4j shortest with connector node and multiple optionsneo4j 最短,带有连接器节点和多个选项
【发布时间】:2015-06-19 19:25:36
【问题描述】:

我的数据库中有城市、道路和运输商。 一条道路与两个(不同)城市的起点和终点关系相连。每条道路也有一个属性距离(以公里为单位)。 多个运输者可能与道路有关系。每个运输车都有一个价格(每公里)。

现在我的问题。我想要从城市 A 到 B 的最便宜的选择。可能有一条直接的道路,否则我们必须通过其他城市和运输公司。我想为此明确使用 Dijkstra 算法。

这个查询可以在 Cypher 中完成吗?如果没有,如何使用 Neo4J Java API 来完成?

【问题讨论】:

  • 您可以通过 neo4j 的 rest api 将 shortestPath 与 Cypher 或 Dijkstra 一起使用
  • 据我所知,使用 shortestPath 您可以将属性作为成本。但是如何将道路的距离乘以运输车的价格呢?当特定道路有多个运输工具时?
  • 我建议您首先使用模型,也许是 console.neo4j.org 中的测试数据集。目前,除了告诉您这是可能的并向您指出文档之外,我们无法为您提供太多帮助
  • 你的意思是这样的数据集:[link]console.neo4j.org/r/c9kidj[/link]?
  • 没错!所以现在我们可以玩了:)

标签: neo4j cypher dijkstra


【解决方案1】:

根据您的sample dataset,我认为有一个建模问题可能会使事情变得困难,当然对于定向关系的匹配而言。

但是,这已经是您找到最低成本路径的方法了:

MATCH (a:City { name:'CityA' }),(d:City { name:'CityD' })
MATCH p=(a)-[*]-(d)
WITH p, filter(x IN nodes(p) 
               WHERE 'Road' IN labels(x)) AS roads
WITH p, reduce(dist = 0, x IN roads | dist + x.distance) AS totalDistance
RETURN p, totalDistance
ORDER BY totalDistance
LIMIT 5

【讨论】:

  • 但是对于一个真实世界的用例,我可能会使用 Dijkstra 或 A* 算法在 java-api 中实现它,并提供必要的成本函数和关系扩展器(跳过“路”节点。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-31
  • 1970-01-01
  • 2017-08-20
  • 1970-01-01
  • 2017-07-03
相关资源
最近更新 更多