【问题标题】:Neo4j: Average value going wrong in Cypher queryNeo4j:Cypher 查询中的平均值出错
【发布时间】:2016-06-29 16:35:06
【问题描述】:

我有以下格式的数据框:

    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

此外,在 unique_carrier、始发地和目的地之间建立关系的最佳方式是什么,由 delay_by 关系链接。通过这样做,我需要选择一个特定的航空公司,比如 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**

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

【问题讨论】:

    标签: neo4j cypher


    【解决方案1】:

    问题在于,因为您在创建 delayed_by 关系时使用了 MERGE,所以每个机场节点对最终只会有一个关系。而是使用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)
    

    还要注意使用toFloat 函数将avg_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
    

    返回:

    Origin  Arrdelay    Destination
    JFK   8.01528360875 LAX
    

    Here 是一个演示这些查询的 Neo4j 控制台实例。

    【讨论】:

    • 在 unique_carrier、出发地和目的地之间建立关系的最佳方式是什么。我用我尝试过的方法更新了我最初的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-08
    • 2013-11-02
    • 2013-07-14
    • 2019-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多