如何在 Neo4j 中找到飞行的持续时间

How to find the duration of Flight in Neo4j

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

非常感谢您的合作!

这个有点棘手。先查询再解释:

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));

所以首先,你需要找到两者之间的最短路径。这是第一行。有很多路径,一般你想要cheapest/shortest.

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

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

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

从您的示例数据时间戳和持续时间值来看,您的时间戳似乎以小时乘以 100 为单位。注意:只有在时间戳包含日期信息的情况下才能进行计算,因为航段可以跨越多天.

获取所有实用行程

您可以通过以下方式获取从 A1 到 A3 的所有实际航班,以及 start/end 机场的名称和每段航班的航班代码:

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      |
+------------------------------------------------------+