2016-06-23 10 views
0

Ich habe so etwas wie:Wie erstellt man eine korrelierte Unterabfrage?

create (:ex {name: "x", ver: 1.0}); 
create (:ex {name: "x", ver: 1.1}); 
create (:ex {name: "y", ver: 0.9}); 

und will die neueste Version für einen bestimmten Namen heißt x-1.1 und y-0.9 zurückzukehren. Ich habe dies versucht:

match (n:ex), (m:ex) where m.name = n.name and m.ver = max(n.ver) return m 

aber neo hasst mich mit:

Ungültige Verwendung von Funktion max Aggregation (...) in diesem Zusammenhang (Zeile 1, Spalte (x) (Offset: 61))

Was ist der richtige Ansatz hier?

* Edit I *

ich auch zusammen meine Versionen haben dem Bespannen:

create (:ex {name: "x", ver: 1.0})-[:PrecededBy]->(:ex {name: "x", ver: 1.1}); 
match (n:ex {name: "x", ver: 1.1}) create (n)->[:PrecededBy]->(:ex {name: "x", ver: 1.2}); 
create (:ex {name: "y", ver: 0.9}); 

Denken ich endNode() verwenden könnte, aber das scheint nicht überhaupt zu arbeiten:

match (n:ex)-[r]-() return endNode(r) 

gibt 3 Knoten zurück!

* Edit II *

Ich hätte gedacht, so etwas wie dies könnte gearbeitet haben:

match p=(:ex)-[*]->(:ex) return last(nodes(p)) 

aber deutlich verstehe ich nicht last()

Antwort

1

Wenn Sie aggregation Funktionen wie MAX() und COLLECT() (die nur in WITH und RETURN Klauseln gültig sind), können Sie a Geben Sie auch einen oder mehrere nicht aggregierende "Gruppierungsschlüssel" in derselben Klausel an.

Zum Beispiel die maximale Version (max_ver) für jeden unterschiedlichen name (den "Gruppierungsschlüssel") zu erhalten:

MATCH (n:ex) 
RETURN n.name AS name, MAX(n.ver) AS max_ver; 

[UPDATED]

Auf der anderen Seite, wenn Sie wollen die Knoten mit der maximalen Version für jeden Namen bekommen, hier ist eine Möglichkeit, das zu tun:

MATCH (n:ex) 
WITH n 
ORDER BY n.ver DESC 
WITH n.name AS name, COLLECT(n) AS ns 
RETURN name, ns[0] AS latest; 

Dieses que ry sortiert alle Knoten nach der absteigenden Versionsnummer, sammelt die Knoten mit dem gleichen Namen (unter Beibehaltung der Reihenfolge) und gibt eine Zeile mit jedem Namen und dem Knoten zurück, der diesen Namen mit der höchsten Versionsnummer hat.

+0

aber wie gebe ich den Knoten anstelle der Eigenschaft zurück? Wie sind Abfragen verschachtelt? 'match (n: ex) wobei n.ver = (match (m: ex) wobei m.name = n.name return max (m.ver)) return n' - oder so ähnlich? – ekkis

+0

Ich könnte präziser in meiner Frage gewesen sein. als ich sagte "möchte die neueste Version zurückgeben" meinte ich "möchte den Knoten mit der neuesten Version zurückgeben" – ekkis

+0

Ich habe meine Antwort aktualisiert. – cybersam