Cypher Query:获取最短路径的相关节点

时间:2016-10-13 12:55:55

标签: neo4j cypher

我尝试基于Neo4j 3.0.4数据库中的数据开发路由系统。该图包含多个停靠点。这些站点中的一些预定如公共汽车站,火车站,但不是全部。因此,它们连接到一个计划节点。每个计划节点都连接到要约。

子图如下所示:

Example_Graph

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

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

这导致从停止A到停止Z的所有最短路径。在A和Z之间的更多停靠点,包括在返回的路径中。我想为所有站点获取相关的时间表以及相关的时间表。

此外,如果可以使用基于调度节点的约束,那将是很好的。 G。 allShortestPath从A到Z的过滤器(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)这样做,我会很高兴每个提示!

1 个答案:

答案 0 :(得分: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上的可视化添加了这些边缘,因此结果如下所示:

enter image description here

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