Neo4j:Cypher查询中的平均值出错

时间:2016-06-29 16:35:07

标签: neo4j cypher

我有一个格式如下的数据框:

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

有人可以帮我实现这个输出吗?

1 个答案:

答案 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控制台实例。