2013-07-19 4 views
10

Próbuję zwrócić węzeł o największej wartości i przetworzyć ten węzeł dalej.Podzapytanie cypher: pobierz węzeł z wartością maksymalną/min i przetwórz go

Oto jak wrócę węzeł z największą wartość:

START n=node(startnode) 
MATCH n-[:TYPE]-m 
RETURN m 
ORDER BY m.value DESC LIMIT 1 

ale teraz jestem w podkwerendzie

START n=node(somenode) 
MATCH n-[:TYPE1]-q 
WITH DISTINCT q 
MATCH q-[:TYPE2]-m 

a następnie ORDER BY .. LIMIT 1 oczywiście już nie działa, bo chcę jeden wynik dla każdego q. Jak to się robi?

Również, gdy mam m z największą wartością dla każdego q Ja też trzeba je przetworzyć:

RETURN q, m.maxvalue, x.anothervalue 

z

MATCH m-[:HAS_ONE_LINK_TO]->x 

więc gdy grałem z kolekcji (collect(m)), nie wymyśliłem sposobu, aby rozwinąć je z powrotem do "wierszy wyników" dla zastosowania tego MATCH.

Odpowiedz

20

Nietestowane ... daj mi znać, jeśli działa dla Ciebie:

START n=node(somenode) 
MATCH n-[:TYPE1]-q    // initial query 
WITH DISTINCT q 
MATCH q-[:TYPE2]-m 
WITH q, max(m.value) as max  // get max for q 
MATCH q-[:TYPE2]-m     
WHERE m.value = max    // find the max m for each q 
WITH q, m 
MATCH m-[:HAS_ONE_LINK_TO]->x  // find x from m 
RETURN q, m, x 

Edit: z powodu ostatnich upvotes na tym starym odpowiedź ... proszę rozważyć aktualniejsze zapytania napisany w epoce 3.x korzystając zbierać/unwind - również untested (nie należy tego robić, jeśli liczba ms będzie dość duża, ponieważ mogą być przechowywane w częściowym wyniku zapytania zamiast być w stanie przesyłać strumieniowo):

MATCH (n:Label)-[:TYPE1]-(q)     // initial query 
WITH DISTINCT q 
MATCH (q)-[:TYPE2]-(m) 
WITH q, max(m.value) as max, collect(m) as ms // get max for q, collect ms 
UNWIND ms as m 
WHERE m.value = max 
MATCH (m)-[:HAS_ONE_LINK_TO]->(x)    // find x from m 
RETURN q, m, x 
+0

działa jak urok mr cypher god! – bebbi

+1

Odpowiedziałem na twoje inne [dużo trudniejsze] pytanie, głównie z powodu tego komentarza. : P –

+0

Działa to tak bardzo, jak potrzeba !! Wielkie dzięki! – Vnge

Powiązane problemy