【问题标题】:Cypher Query: Get related nodes of shortest pathCypher Query:获取最短路径的相关节点
【发布时间】:2016-10-13 12:55:54
【问题描述】:

我尝试基于 Neo4j 3.0.4 数据库中的数据开发路由系统。该图包含多个停靠点。其中一些站点像公共汽车站、火车站一样被安排,但不是全部。因此,它们连接到一个调度节点。每个计划节点都连接到一个报价。

子图如下所示:

我的问题是:如何创建返回此子图的查询?到目前为止,我用 cypher 编写了这个查询:

MATCH (from:Stop{poiId:'A'}), (to:Stop{poiId:'Z'}) , 
path = allShortestPaths((from)-[r*]->(to))
RETURN path

这会导致从停靠点 A 到停靠点 Z 的所有最短路径。在 A 和 Z 之间是到更多停靠点,这些停靠点包含在返回的路径中。我想获得所有站点的相关时间表以及这些时间表的相关优惠。

此外,如果可以基于调度节点使用约束,那就太好了,例如。 G。 allShortestPath from A to Z where filter(time in schedule.monday WHERE x > 1100)。

如果这不可能,是否可以基于先前的查询创建一个具有此约束的新查询?

EDIT1:更多信息: 在时间表中是每个站点的出发时间。我想根据所需的出发时间(或者所需的到达时间)计算完整的旅行时间并获得 5 个最佳连接(更少的时间)。 例如。我想在 7:00 开始:切换关系的成本时间为 2。因此,如果 7:02 之后有出发,请检查时间表 1。如果是,请在 7:02 之后乘坐第一班发车。 connected_by 关系的成本时间为 12 分钟。最后一个 switch_to 关系没有成本时间。所以我会在 07:14 到达。注意:如果我在旅​​行中必须切换服务线路,我必须再次查看时间表。如果计划不适合所需的时间窗口,请将其从结果中排除。我想获得 5 条最佳路径(基于旅行时间或到达时间),跳数并不重要。如果与 e 有联系。 G。 6 站,但旅行时间更短(或更早到达时间)更喜欢这一站。我知道这是一个困难而大的问题,但我不知道如何开始......如果有办法通过 REST(或者如果不是在 Java 中)做到这一点,我会很高兴每个提示!

【问题讨论】:

  • 输出将在行和列中,尽管返回的值可以是相关结果的列表。以返回的数据格式了解您要查找的内容会有所帮助。例如,您是否希望每条路径有一个结果行,其中包含包含每个站点及其相关时间表和报价的地图列表?或者你想要每站/时间表/报价一行?还是别的什么?
  • 我将通过 rest api 使用这个密码,所以我会得到 JSON 对象,但想法是为每个单独的路径查看一行,其中包含所有站点和它们之间的关系。 “停止列”可以包含更多信息:{stop1 {attributes}}、{switch_to{attributes}}、{stop2 {attributes}、schedule{attributes}、offer{attributes}}...

标签: neo4j cypher


【解决方案1】:

您可以使用 Cypher 中的 UNWIND 构造来获取路径的节点,并使用 OPTIONAL MATCH 来查找时间表和报价。

我创建了一个示例数据集:

CREATE
  (offer: Offer),
  (sch1: Schedule),
  (sch2: Schedule),
  (stop1: Stop {name: "stop1"}),
  (stop2: Stop {name: "stop2"}),
  (stop3: Stop {name: "stop3"}),
  (stop4: Stop {name: "stop4"}),
  (stop1)-[:SWITCH_TO]->(stop2),
  (stop2)-[:CONNECTED_BY]->(stop3),
  (stop3)-[:SWITCH_TO]->(stop4),
  (stop2)-[:SCHEDULED_BY]->(sch1),
  (stop3)-[:SCHEDULED_BY]->(sch2),
  (sch1)-[:OFFERED_BY]->(offer),
  (sch2)-[:OFFERED_BY]->(offer)

要获取子图,您可以发出以下查询:

MATCH
  (from:Stop {name:'stop1'}), (to:Stop {name:'stop4'}), 
  path = allShortestPaths((from)-[r*]->(to))
UNWIND nodes(path) AS stopNode
OPTIONAL MATCH (stopNode)-[sb:SCHEDULED_BY]->(schedule:Schedule)-[ob:OFFERED_BY]-(offer:Offer)
RETURN stopNode, sb, ob, schedule, offer

使用这种方法,r 中的边被丢弃,因此它不会返回整个子图。 Neo4j 的 Web UI 上的可视化添加了这些边缘,因此结果如下所示:

无论如何,我希望这篇文章包含有用的信息 - 让我知道它是如何为你工作的。

【讨论】:

  • 太好了,非常感谢!它完全按预期工作!也许你对我的 EDIT 1 也有想法! :)
  • 不客气。关于您的编辑,您需要计算 REST API 支持的带加权边的最短路径,请参阅stackoverflow.com/questions/27346686/…
  • 感谢您的回答。是的,我知道最短路径算法,但我想获得“所有”路径。实际问题如下:假设我想在 7:00 从 A 点到 Z 点。因此我必须乘坐公交服务线 1,然后转乘服务线 2。所以我从 700 开始,查看时刻表:705服务线出发,所以我要等5分钟(这个等待时间取决于当前时间!)。
  • 我乘坐1号线,需要16分钟才能到需要换乘的公交车站。 2 号线在 730 发车。所以我又要等 4 分钟。再过 10 分钟后,我到达了目的地。我总共需要 35 分钟。旅行时间是该关系的固定值,但必须为每种情况计算等待时间......根据旅行时间+等待时间我想得到一个结果:所需的总时间+到达时间。这可以通过密码或 REST API 实现吗?我不知道我是否可以在一个查询中遍历这样的路径元素...
  • 绝对值得为此提出一个新问题——如果可能,请提供一些示例数据 (CREATE...)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多