2016-06-18 2 views
1

グラフデータベース、起点空港、目的地空港に2つのノードが作成されています。これは 'delayed_by'という名前のプロパティによって関連付けられます。Neo4jでcypherクエリを使用して複数列の集計関数を行う方法

MATCH (origin:origin_airport {name: row.ORIGIN}), 
    (destination:dest_airport {name: row.DEST}) 
    CREATE (origin)-[:delayed_by {carr_delay: row.carr_delay}]->(destination) 
    CREATE (origin)-[:delayed_by {weather_delay: row.weather_delay}]->  
    (destination) 
    CREATE (origin)-[:delayed_by {nas_delay: row.nas_delay}]->(destination) 

delayed_byは、キャリア遅延、気象遅延、およびナス遅延に起因する値遅延を保持します。ここでは、originとdestinationをgroup_byでグループ化し、Neo4jでcypherクエリを使用して3つの遅延の合計の平均値を計算する必要があります。後述のように表形式、フォーマットの私の入力ファイルの意志で表現:

ORIGIN DEST carr_delay weather_delay nas_delay 
    ABE  ATL  492   56    56  
    ABE  DTW  412   0    47  
    ABQ  ATL  181   0    218 

私は以下の形式で結果を期待しています。

ORIGIN DEST  Avg_delay 
    ABE  ATL  201.33   
    ABE  DTW  153   
    ABQ  ATL  133   

私は、以下のクエリ使用しています:

 MATCH (oa:origin_airport)-[d:delayed_by]->(da:dest_airport) 
    RETURN oa.name AS Origin, da.name AS Destination,    
    AVG((toFloat(d.carr_delay))+(toFloat(d.weather_delay))+ 
    (toFloat(d.nas_delay))) As avg_delay 
     ORDER BY avg_delay DESC 
     LIMIT 10 

をしかしAvg_delayにnull値を取得します。

ORIGIN DEST  Avg_delay 
    ABE  ATL  NULL 
    ABE  DTW  NULL 
    ABQ  ATL  NULL 

答えて

1

1)私がモデルを変更することをお勧めします:遅延関係は遅延の財産の種類、およびプロパティ値の保存遅延値を追加するために。

MATCH (origin:origin_airport {name: row.ORIGIN}), 
     (destination:dest_airport {name: row.DEST}) 
    CREATE (origin) 
      -[:delayed_by {type: "carr_delay", value: row.carr_delay}]-> 
      (destination) 
    CREATE (origin) 
      -[:delayed_by {type: "weather_delay", value: row.weather_delay}]-> 
      (destination) 
    CREATE (origin) 
      -[:delayed_by {type: "nas_delay", value: row.nas_delay}]-> 
      (destination) 

2)そして、目的のクエリ:

MATCH (oa:origin_airport)-[d:delayed_by]->(da:dest_airport) 
RETURN oa.name AS Origin, 
     da.name AS Destination,    
     AVG(toFloat(d.value)) As avg_delay 
ORDER BY avg_delay DESC 
LIMIT 10 
+0

モデルを変更しようとしたときにエラーが発生し、 "タイプ" "値"形式を受け入れていません。別の投稿で私のエラーについて説明しました。 http://stackoverflow.com/questions/37899643/how-to-associate-multiple-value-to-a-property-using-cypher-queries-in-neo4j – SRS

2

ここでの問題はない、すべての関係のためにあなたはすべてのプロパティ(carr_delayweather_delaynas_delay)セットを持っているということです。

存在しないプロパティはNULLと評価されます。これは0とは異なります。 AVG(1+NULL)NULLと評価されます。したがって、NULL0にマッピングする必要があります。それは​​3210を使用することを検討して修正するには:

MATCH (oa:origin_airport)-[d:delayed_by]->(da:dest_airport) 
RETURN oa.name AS Origin, da.name AS Destination,    
AVG(
    coalesce(toFloat(d.carr_delay),0.0))+ 
    coalesce(toFloat(d.weather_delay),0.0))+ 
    coalesce(toFloat(d.nas_delay),0.0)) 
) As avg_delay 
ORDER BY avg_delay DESC 
LIMIT 10 
+0

どうもありがとうございました。それはうまくいった。 – SRS

関連する問題