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

如何在Neo4j中查找飞行持续时间,neo4j,cypher,graph-databases,Neo4j,Cypher,Graph Databases,我是Neo4j的初学者,如何计算从A1到A3的飞行持续时间。 我对到港和离港航班做减法运算感到困惑。我想计算从A1机场到A3机场的总时间。这是我的控制台 非常感谢您的合作 这个有点棘手。首先是查询,然后是解释: MATCH p=shortestPath((a1:AIRPORT { name: "Airport A1" })-[*]-(a3:AIRPORT { name: "Airport A3" })) RETURN reduce(totalDuration=0, duration IN

我是Neo4j的初学者,如何计算从A1到A3的飞行持续时间。 我对到港和离港航班做减法运算感到困惑。我想计算从A1机场到A3机场的总时间。这是我的控制台


非常感谢您的合作

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

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(p)| leg.duration)
所做的。提取从集合中提取某物。最后,你需要把它们加起来。这就是
reduce
所做的。请注意,您的持续时间是字符串(它们应该是数字),因此您必须使用
toInt()
将其转换为可以求和的数字。

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

这是因为多足飞行总是在飞行之间有一些滞后时间,在计算总持续时间时你需要考虑。因此,您需要从第一个航段的出发时间中减去最后一个航段的到达时间

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

获取所有实用的行程 以下是您如何获得从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%小时)的行程

这些结果表明:

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

非常感谢,是的23000是拼写错误,我会更正为2300。如果我只想根据A1到A3的到达和起飞时间计算可行航班的航班持续时间,该怎么办其中((连接[i]).arrvTime谢谢。我已经更新了我的答案,加入了验证测试。我还修改了
WHERE
子句,以测试每条腿之间至少有20分钟,因为较短的间隔是不实际的。您可以将
33
(代表一小时的33%)调整到任何有意义的间隔。