如何在 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 |
+------------------------------------------------------+
我是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 |
+------------------------------------------------------+