我有一个格式如下的数据框:
ORIGIN UNIQUE_CARRIER DEST avg_arr_delay
JFK AA LAX 14.56040268
JFK B6 LAX 7.085201794
JFK DL LAX 6.475770925
JFK VX LAX 3.939759036
LAX AA MCI 2.3
LOG DL SEA 3.4
我在图数据库中为原始机场和目的地机场创建了两个节点。它与名为'delayed_by'的属性相关,它指向平均到达延迟。节点之间的关系如下:
MERGE (origin:origin_airport {name: row.ORIGIN})
MERGE (destination:dest_airport {name: row.DEST})
MERGE (carrier:Carrier {name: row.UNIQUE_CARRIER})
MERGE (origin)-[r:delayed_by]->(destination)
SET r.arr_delay=row.avg_arr_delay
我正在努力寻找特定始发地和目的地机场的平均延误时间。在这里,试图在JFK和LAX之间寻找。 JFK到LAX有4个arr_delay值,我需要找到这些值的平均值。我使用下面的密码查询来查找平均值:
MATCH (oa:origin_airport {name:'JFK'})-[r:delayed_by]->(da:dest_airport
{name:'LAX'})
RETURN oa.name AS Origin,
AVG(toFloat(r.arr_delay)) As Arrdelay,
da.name AS Destination
取代平均值,取最后一个值3.939759036并返回该值。但我期待低于价值。
ORIGIN DEST Average
JFK LAX 8.0152
此外,在delayed_by关系链接的unique_carrier,origin和destination之间创建关系的最佳方法是什么。通过这样做,我需要选择一个特定的航空公司,比如JFK和LAX之间的AA,并找到平均延误。像下面的东西有用吗?
MERGE (origin:origin_airport {name: row.ORIGIN})
MERGE (destination:dest_airport {name: row.DEST})
**MERGE (carrier:Carrier {name: row.UNIQUE_CARRIER})**
CREATE (origin)-[r:delayed_by]->(destination)
**CREATE (origin)-[:from]->(carrier)-[r1:delayed_by]->(destination)**
SET r.arr_delay=row.avg_arr_delay
**SET r1.arr_delay=row.avg_arr_delay**
有人可以帮我实现这个输出吗?
答案 0 :(得分:1)
问题在于,因为您在创建MERGE
关系时使用delayed_by
,所以每个机场节点对最终只会有一个关系。而是使用CREATE
来创建关系:
LOAD CSV WITH HEADERS FROM "https://dl.dropboxusercontent.com/u/67572426/so_flights.csv" AS row
MERGE (origin:origin_airport {name: row.ORIGIN})
MERGE (destination:dest_airport {name: row.DEST})
CREATE (origin)-[r:delayed_by]->(destination)
SET r.arr_delay=toFloat(row.avg_arr_delay)
还要注意使用avg_arr_delay
函数将toFloat
转换为浮点数。
现在你应该得到你期望的结果:
MATCH (oa:origin_airport {name:'JFK'})-[r:delayed_by]->(da:dest_airport {name:'LAX'})
RETURN oa.name AS Origin,
AVG(toFloat(r.arr_delay)) As Arrdelay,
da.name AS Destination
返回:
Origin Arrdelay Destination
JFK 8.01528360875 LAX
Here是展示这些查询的Neo4j控制台实例。