2016-05-26 2 views
1

Ich habe eine Abfrage basierend auf einem Schachturnier. Es läuft gut und gibt einen Wert zurück. Ich entschuldige mich, wenn es hässlich ist, und ich weiß, dass ich es aufräumen könnte. Aber jetzt funktioniert es gut und gibt den Wert 0,5 zurück.Die Verwendung von SET mit berechneten Werten in Neo4j erzeugt einen "nicht definierten" Fehler

Um schnell einen Kontext zu geben, betrachtet die Abfrage die Gegner von Gegnern und aggregiert die Datensätze des Spielers des 2. Grades 'und erstellt dann ein Ranking.

MATCH (n)-[:HAS_RECORD]-(m)-[:PLAYED]-(a)-[:PLAYED]-(b)-[:HAS_RECORD]-(c)-[:HAS_RECORD]-(d)-[:PLAYED]-(e)-[:PLAYED]-(f)-[:HAS_RECORD]-(g) 
WHERE n.player_id = '1' 
WITH e, f, 
CASE WHEN e.player_wins='1' THEN 1 ELSE 0 END AS wins_count 
RETURN (toFloat(sum(win_count))/toFloat(count(e))) * (sum(toInt(f.wins))/(sum(toInt(f.wins)) + sum(toInt(f.losses)) +sum(toInt(f.draws)))) AS rank 

Das möchte ich wieder auf den Spieler berechnet SET in Knoten e dargestellt Ranking. Aber ich kann es nicht tun.

Ich versuchte dies, aber es hat nicht funktioniert ... ich eine Fehlermeldung anzeigt, wins_count not defined:

MATCH (n)-[:HAS_RECORD]-(m)-[:PLAYED]-(a)-[:PLAYED]-(b)-[:HAS_RECORD]-(c)-[:HAS_RECORD]-(d)-[:PLAYED]-(e)-[:PLAYED]-(f)-[:HAS_RECORD]-(g) 
WHERE n.player_id = '0' 
WITH e, f, 
CASE WHEN e.player_wins='1' THEN 1 ELSE 0 END AS wins_count, 
(toFloat(sum(wins_count))/toFloat(count(e))) * (sum(toInt(f.wins))/(sum(toInt(f.wins)) + sum(toInt(f.losses)) +sum(toInt(f.draws)))) AS rank 
SET e.rank = rank 
RETURN e 

Ich weiß nicht, wie ich sonst rank ohne setzen es nach dem CASE berechnen kann.

Ich dachte, da gibt es ein Problem mit wins_count nicht definiert ist, vielleicht muß ich Dinge durchsetzen, so dass ich versuchte, ein anderes zu setzen WITH nach den CASE, aber dann scheiterte es ... ich irgendwie eine Tabelle der Reihen erzeugt !!

Dann habe ich versucht, den Teil, der den Rang berechnet direkt in die SET-Anweisung zu verschieben, aber anscheinend können Sie Aggregation in einer SET-Anweisung nicht tun !!

Wieder entschuldige ich mich für den hässlichen Code und stelle fest, dass ich kein minimales Beispiel geliefert habe. Aber ich hoffe, da das Problem syntaktischer Natur ist, wird dies jemandem klar sein, der weiß, was falsch ist. Vielen Dank.

Antwort

1

Wenn wir Variable in WITH Erklärung erklären, können wir es nicht in der gleichen WITH Anweisung verwenden.

WITH 2 as K1, K1*3 as K2 
RETURN K1, K2 

erhalten wir einen Fehler: Zum Beispiel, wenn wir versuchen, die folgende Abfrage auszuführen Variable 'K1' not defined.

WITH 2 as K1 
RETURN K1, K1*3 as K2 

oder:

WITH 2 as K1 
WITH K1, K1*3 as K2 
RETURN K1, K2 

und das Ergebnis wird sein:

╒═══╤═══╕ 
│K1 │K2 │ 
╞═══╪═══╡ 
│2 │6 │ 
└───┴───┘ 

So können wir nächste Abfrage verwenden

Verwandte Themen