2016-03-18 5 views
1

Ich habe eine Datenmenge, die etwa wie folgt aussieht:Wie Max() für eine Sammlung verwenden?

CREATE (n {name:'main', val:3}) -[:r]-> ({name:'sub1', val:2}), (n)-[:r]->({name:'sub2', val:1}) 

Nun, ich brauche den maximalen Wert für ‚val‘ für alle Knoten zu finden, die mit dem Knoten verbunden sind, genannt ‚main‘ (einschließlich ‚main‘ auch). Also, in diesem Fall ist die Antwort 3.

Da der Knoten ‚main‘ genannt keine untergeordneten Knoten haben kann, habe ich OPTIONAL MATCH die untergeordneten Knoten zu finden, dann vereinen alle vals in eine Liste gefunden und rufen max() drauf , etwa so:

MATCH (n {name:'main'}) 
OPTIONAL MATCH (n)-[:r]->(subs) 
RETURN max(n.val + collect(subs.val)) 

aber das gibt die folgenden Fehler:

Type mismatch: expected Float or Integer but was Collection (line 3, column 18 (offset: 73)) "RETURN max(n.val + collect(subs.val))"

Was ist die richtige may diese Art von Problem zu lösen?

Antwort

2

Dies sollte für Sie arbeiten:

MATCH p=(n {name:'main'})-[:r*0..]->(subs) 
UNWIND NODES(p) AS node 
RETURN MAX(node.val) AS result; 

Diese Abfrage eine variable-length pattern verwendet die gesamte (optional) Kette von r Beziehungen zu folgen. Ihre Anfrage nicht. Die NODES()-Funktion erstellt eine Auflistung von Pfadknoten, und die UNWIND konvertiert die Auflistung in Datenzeilen. Aggregationsfunktionen wie MAX() aggregieren nur über Datenzeilen hinweg.