2013-11-04 6 views
6

ich eine Chiffre-Abfrage schreiben wollen, die alle längsten Pfade zwischen den Knoten findet, die Beziehung mit Status = „on“ Eigenschaft miteinander, ist das, was ich bisher getan haben:Wie findet man die längsten Pfade mit der Abfrage von Chiffren?

start n=node(*) 
match p = n-[r:INCLUDE*..]->m 

with n,MAX(length(p)) as l 
match p = n-[r:INCLUDE*..]->m 
WHERE all(rel in r 
where rel.status='on' AND (length(p) = l)) 
return p,l 

It 3 zurück Pfade mit 1,2 und 3 Länge, nicht nur der längste Pfad, meine Abfrage sollte nur die längsten Pfade finden, ich meine, wenn es 8 Pfade gibt, die zu meinem ersten passen, wo Bedingung (where rel.status='on'), mit der Länge von 1,2, 3,3,4,6,6,6, nur die drei Pfade mit der Länge 6 sollten zurückgegeben werden.

was soll ich tun?

Bitte führen Sie mich, ich bin neu zu Neo4j, und versuchte viel, aber habe nichts als Schwindel, ich werde so dankbar für Ihre Hilfe sein.

Antwort

12

Versuchen Sie, das Kriterium der Beziehungseigenschaft auf die Übereinstimmung des ersten Pfads zu verschieben, oder berechnen Sie die maximale Länge für Pfade, die nicht mit diesem Kriterium gefiltert werden. Tragen Sie dann die Pfade und die maximale Länge in den zweiten Abschnitt der Abfrage, damit Sie nicht alle Pfade erneut abgleichen müssen. Sie können die Pfade sammeln, um sie in der WITH-Klausel zu übertragen, und dann die Pfadlänge filtern, wenn Sie zurückkehren. Versuchen Sie etwas wie

START n=node(*) 
MATCH p=n-[rels:INCLUDE*]->m 
WHERE ALL (rel IN rels 
    WHERE rel.status='on') 
WITH COLLECT(p) AS paths, MAX(length(p)) AS maxLength 
RETURN FILTER(path IN paths 
    WHERE length(path)= maxLength) AS longestPaths 
+0

das ist es, danke. – fereshteh

+0

und, wie soll ich den letzten Knoten der Pfade bekommen? – fereshteh

Verwandte Themen