2013-11-04 19 views
6

Voglio scrivere una query cifra che trova tutti i percorsi più lunghi tra i nodi che hanno rapporto con STATO = "on" di proprietà con l'altro, questo è quello che ho fatto finora:come trovare tutti i percorsi più lunghi con query di cifratura?

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 

Si restituisce 3 percorsi con 1,2 e 3 lunghezza, non solo il percorso più lungo, la mia query dovrebbe trovare solo i percorsi più lunghi, voglio dire se ci sono 8 percorsi adatti alla mia prima condizione (where rel.status='on'), con la lunghezza di 1,2, 3,3,4,6,6,6, devono essere restituiti solo i tre percorsi con la lunghezza di 6.

cosa devo fare?

per favore guidami, sono nuovo di neo4j, e ho provato molto ma non ho avuto nulla eccetto vertigini, sarò così grato per il tuo aiuto.

risposta

12

Prova a spostare il criterio della proprietà della relazione sulla prima corrispondenza del percorso, o calcolerai la lunghezza massima su percorsi che non sono filtrati con quel criterio. Quindi trasporta i percorsi e la lunghezza massima nella seconda parte della query in modo da non dover più corrispondere a tutti i percorsi. È possibile raccogliere i percorsi per trasportarli nella clausola WITH e quindi filtrare sulla lunghezza del percorso quando si ritorna. Prova qualcosa come

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

questo è tutto, grazie. – fereshteh

+0

e, come devo ottenere l'ultimo nodo dei percorsi? – fereshteh