【问题标题】:Neo4j: Shortest Path with Cost Function depending on two Consecutive Relations in PathNeo4j:具有成本函数的最短路径取决于路径中的两个连续关系
【发布时间】:2016-09-14 14:25:58
【问题描述】:

假设我有一个图表,其中的节点代表城市,关系代表城市之间可能的联系。连接具有出发时间和到达时间。我想找到城市AB 之间的最短路径,成本函数是总行程时间。行程时间是连接之间的等待时间和连接时间的总和。

我正在使用 Java API,并尝试使用 GraphAlgoFactory.dijkstra(expander, costEvaluator) 使用 Dijkstra 算法。我的主要问题似乎是,CostEvaluator 接口只接收当前关系而不是完整路径。这样我可以计算连接持续时间,但不能计算等待时间。

我可以做些什么来适应现有的算法还是必须重新实现 Dijkstra?

【问题讨论】:

  • 你能确认waiting_timedeparture_time - arrival_time的结果吗?
  • 我在下面澄清了。

标签: neo4j dijkstra shortest-path


【解决方案1】:

路径的总成本将是给定关系的每个评估的getCost() 返回值的总和,因此只需定义在关系级别上应如何评估成本,评估总成本将是多少算法本身。

另一方面,如果等待时间是 departure_timearrival_time 之间的差异,您可以使用 Cypher 来做到这一点:

MATCH p=(a:City {name:"NY"})-[r:CONNECTS*..10]->(b:City {name:"LA"})
WITH p, reduce(
  cost=0, x IN rels(p) | cost + (x.departure_time - x.arrival_time) 
) as cost
RETURN p, cost
ORDER BY cost ASC
LIMIT 1

【讨论】:

  • Cypher 版本优化了吗?
  • 不行,dijkstra算法性能会更好,试一试,我现在没机会测试
  • 我有很多数据,所以性能很重要。另外,我认为有一个误解。关系r 的成本应该是r.arrival - r.departure + r.departure - r_previous.arrival,可以简化为r.departure - r_previous.arrival
  • 好吧好吧,我会检查一个更好的实现然后
  • 请注意,在这种情况下,我倾向于创建“连接”节点,因为连接的概念在我的域级别很重要
猜你喜欢
  • 2021-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多