2016-07-06 16 views
2

Hier ist mein Modell: (:A)<--(:B)<-[:R {timestamp}]-(:C {number})Cypher - erhalten Sie den neuesten Knoten

Was ich versuche in einer Chiffre-Abfrage zu erreichen, ist den neuesten C-Knoten zu erhalten, nach dem neuesten Stand R.timestamp (oder C Anzahl) für ein gegebenes A und alle B Knoten. Das ergibt ein A, mehrere Bs und ein C, die zu jedem B mit dem höchsten R-Zeitstempel gehören. Am besten wäre es, auch B-Knoten ohne irgendeine Beziehung zu C zurück zu geben.

In SQL würde ich gruppieren nach und rang nur die n Zeilen, die ich pro Gruppe wünschen, habe ich nicht genug Erfahrung mit COLLECT oder UNWIND um das gleiche Ergebnis zu erzielen.

Antwort

3

Zuerst finden Sie Ihren a Knoten und dann optional auf die b und c Knoten. Dies wird auch b Knoten finden, die keine Beziehung zu a haben.

MATCH (a:A) 
WHERE a.name = {name} 
OPTIONAL MATCH (c:C)-[:R]->(b:B)-[:R]->(a) 
WITH a, b, c 
ORDER BY c.number 
WITH a, b, last(collect(c)) AS most_recent_c 
RETURN a, b, most_recent_c; 
+0

Danke, das löst es. Ich habe die Funktion 'last()' nicht gefunden. Alternativ wäre es möglich, mit der Reihenfolge (DESC oder ASC) mitzuspielen und 'last()' mit 'head()' zu wechseln. (vgl. https://neo4j.com/docs/developer-manual/current/#query-function). Nun gibt dies nicht die B-Knoten ohne C bezogen auf zurück. Ich werde das Ergebnis untersuchen und posten. – Rwanou

+1

Ich schaffe es funktioniert mit Filterung auf eine Beziehung Eigenschaft und einschließlich Sackgasse Bs: 'MATCH (a: A {Name: {param}}) <- (b: B) mit a, b OPTIONAL MATCH (c: C) - [r: R] -> (b) // Ignoriere fehlende C MIT a, b, r, c ORDER BY r.END DESC MIT a, b, Kopf (sammeln (c)) als most_recent_c, head (collect (r)) als most_recent_r RETURN a, b, most_recent_c, most_recent_r; ' – Rwanou

Verwandte Themen