如何在Neo4j找到Flight的持续时间

时间:2015-09-15 15:13:25

标签: neo4j cypher graph-databases

我是Neo4j的初学者,如何计算从A1到A3的航班持续时间。 我对到达和离开航班上的减法操作感到困惑。我想计算从A1到A3机场的总时间。这是我的控制台http://console.neo4j.org/?id=g0mv8x

非常感谢您的合作!

2 个答案:

答案 0 :(得分:3)

这个有点棘手。首先查询,然后解释:

MATCH p=shortestPath((a1:AIRPORT { name: "Airport A1" })-[*]-(a3:AIRPORT { name: "Airport A3" }))
RETURN reduce(totalDuration=0, duration IN 
           extract(leg IN relationships(p)| leg.duration) | 
               totalDuration + toInt(duration));

首先,你需要找到两者之间的最短路径。那是第一行。有很多路径,一般来说你想要最便宜/最短路径。

其次,你有一条路。所以你需要做的第一件事就是获得所有"持续时间"出于关系。这是extract(leg IN relationships(p)| leg.duration)的作用。 Extract从集合中抽出一些东西。最后,你需要总结它们。这是reduce的作用。请注意,您的持续时间是字符串(它们应该是数字),因此您必须使用toInt()才能将其转换为您可以总结的数字。

答案 1 :(得分:3)

这确实很棘手,因为你甚至不应该使用duration属性来进行计算!

这是因为多程航班在航班之间总是有一些滞后时间,在计算总航班时间时需要考虑。因此,您需要从第一站的出发时间中减去最后一段的到达时间。

根据您的示例数据时间戳和持续时间值来判断,您的时间戳似乎以小时为单位乘以100.警告:只有时间戳包含日期信息才能进行计算,因为航班支路可以跨越多天。 / p>

获取所有实用路线

以下是如何获得从A1到A3的所有实际航班,以及每条航线的起点/终点机场名称和航班代码:

MATCH (a:AIRPORT { name:"Airport A1" })-[c:Connect*]->(b:AIRPORT { name:"Airport A3" })
WHERE ALL(i IN RANGE(0, LENGTH(c)-2) WHERE (c[i+1]).dptrTime - (c[i]).arrvTime > 33)
RETURN a.name AS from, b.name AS to,
  EXTRACT(x IN c | x.flightcode) AS flights,
  (LAST(c).arrvTime - HEAD(c).dptrTime)/100.0 AS duration;

为了确保有效和实用的行程,WHERE子句过滤掉每条腿之间至少20分钟(33%的小时)的行程。

显示以下结果的

Here is a console

+-----------------------------------------------------------+
| FROM         | to           | flights          | duration |
+-----------------------------------------------------------+
| "Airport A1" | "Airport A3" | ["F2","F4"]      | 4.0      |
| "Airport A1" | "Airport A3" | ["F1","F3"]      | 5.0      |
| "Airport A1" | "Airport A3" | ["F5","F6","F7"] | 216.0    |
+-----------------------------------------------------------+

注意:216.0小时的持续时间来自原始样本数据中23000的到达时间。这可能是一个错字,但我保持不变。

获得最快的实际行程

您可以修改上述查询以获得最快的行程:

MATCH (a:AIRPORT { name:"Airport A1" })-[c:Connect*]->(b:AIRPORT { name:"Airport A3" })
WHERE ALL(i IN RANGE(0, LENGTH(c)-2) WHERE (c[i+1]).dptrTime - (c[i]).arrvTime > 33)
RETURN a.name AS FROM , b.name AS to, EXTRACT(x IN c | x.flightcode) AS flights,(LAST(c).arrvTime-HEAD(c).dptrTime)/100.0 AS duration
ORDER BY duration
LIMIT 1;

结果:

+------------------------------------------------------+
| FROM         | to           | flights     | duration |
+------------------------------------------------------+
| "Airport A1" | "Airport A3" | ["F2","F4"] | 4.0      |
+------------------------------------------------------+