2016-06-18 6 views
1

Ich habe 2 Knoten in Grafik-Datenbank, Herkunft Flughafen und Zielflughafen erstellt. Es ist durch eine Eigenschaft mit dem Namen 'delayed_by' verbunden.Wie Aggregatfunktionen für mehrere Spalten mit Cypher-Abfrage in Neo4j zu tun

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 enthält den Wert, der aufgrund von Trägerverzögerung, Wetterverzögerung und NAS-Verzögerung verursacht wird. Hier muss ich nach Herkunft und Ziel gruppieren und den Durchschnittswert der Summe aller 3 Verzögerungen mit Hilfe der Abfrage in Neo4j berechnen. Darstellen in tabellarischer Form, meine Eingabedatei des Formats wird, wie unten beschrieben:

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

Ich erwarte das Ergebnis im folgende Format.

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

Ich bin mit der folgenden Abfrage:

 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 

Aber Nullwert für Avg_delay bekommen.

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

Antwort

1

1) Ich empfehle, das Modell zu ändern: für die Verzögerung Beziehung der Eigenschaft Art der Verzögerung hinzuzufügen, und den Verzögerungswert speichert in dem Eigenschaftswert.

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) und die gewünschte Abfrage:

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

Wenn ich versuchte, das Modell zu ändern, erhalte ich einen Fehler und es akzeptiert kein "Typ" "Wert" -Format. Ich habe meinen Fehler in einem anderen Beitrag erklärt. http://stackoverflow.com/questions/37899643/how-to-associate-multiple-value-to-a-property-using-cypher-queries-in-neo4j – SRS

2

Das hier Problem ist, dass nicht für alle Beziehungen, die Sie alle Eigenschaften (carr_delay, weather_delay, nas_delay) gesetzt.

Eine nicht vorhandene Eigenschaft wird als NULL ausgewertet - was sich von 0 unterscheidet. AVG(1+NULL) bewerten zu NULL. Also müssen Sie NULL zu 0 zuordnen. Um dies zu beheben prüfen, mit coalesce:

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

Vielen Dank. Das hat funktioniert. – SRS