2016-11-23 4 views
0

Angenommen, ich habe einen Bildknoten, ich habe unterschiedliche Beziehungen auf diesem Bild node.say PREISE ANSICHTEN etc Ich möchte Bilder basierend auf einer bestimmten entfernen Beziehung mit der Bedingung zu dieser Beziehung. zBNeo4j: Wie Knoten aus Satz von allen Knoten mit Bedingungen auf Relationen entfernen oder filtern

match(i:Image) 
where NOT (i)<-[r:RATES]-(u:User{userId:"123"}) 
and r.rate>5 
return i 

Hier möchte ich alle Bilder finden, die nicht vom Benutzer bewertet werden und die Rating sind mit mehr als 5

ich nicht in der Lage bin, die Lösungen für die es

+1

Ich denke, Sie müssen dies ein wenig klären. Es ist einfach, Bilder zu finden, die nicht von einem Nutzer bewertet wurden, aber es klingt, als ob Sie ein Bild suchen, das nicht von einem bestimmten Nutzer bewertet wurde, und die nicht vorhandene Bewertung (da es nicht bewertet wurde von diesem bestimmten Benutzer) sollte größer als 5 sein, was natürlich unmöglich ist. Soll das ein OR oder ein AND sein? Oder versuchen Sie, Bilder zu finden, die von allen, die sie bewertet haben, im Durchschnitt als 5 oder größer bewertet wurden? Oder etwas anderes? – InverseFalcon

+0

Lassen Sie mich das Szenario zu klären, Ich habe alle Bilder sagen 100 und aus denen, Benutzer hat sagen, 10. – roseisnice

+0

Continue ....... Lassen Sie mich das Szenario klären, Ich habe alle Bilder sagen 100 und aus denen, Benutzer hat sagen, 10. Jetzt von diesen 10, Benutzer haben 4 Bilder Bewertung gerieben als 5 gegeben. So erfüllt unsere Bedingung die 4 Bilder Also sollte ich in der Lage, 94 Bilder zu bekommen, die 6 Bilder ignorieren, die Benutzer weniger als 5 gegeben hat. – roseisnice

Antwort

0

Danke für die Aufklärung, ist es ein wenig knifflig q Sehr gut. Da es so aussieht, als würden wir die meisten Bilder trotzdem zurückgeben, sollte es in Ordnung sein, das Spiel mit dem Benutzer und allen zu starten: Bilder. Wir können dann ein OPTIONAL MATCH auf der Beziehung: RATES zwischen dem Benutzer und dem Bild verwenden, und r wird null sein, wenn keine solche Beziehung existiert. Das wird uns mit einem weiteren Prädikat verwenden lassen, wo wir nur Zeilen halten würden, wo die Beziehung existiert nicht das gegebene Bild, oder der Benutzer hat bewertet, dass: Bild größer ist als 5.

MATCH (u:User{userId:"123"}), (i:Image) 
OPTIONAL MATCH (u)-[r:RATES]->(i) 
WITH i 
WHERE r IS NULL OR r.rate > 5 
RETURN i 

Beachten Sie die Verwendung der WHERE-Klausel auf dem WITH statt auf dem OPTIONAL MATCH. Hätten wir den WHERE stattdessen auf OPTIONAL MATCH gesetzt, hätte er die Zeilen, in denen der Benutzer das Bild kleiner als oder gleich 5 bewertet hat, nicht ausgefiltert, in diesen Fällen hätte er null für r zurückgegeben, was den Abfrage falsch.

+0

Hey, danke Ein Tonne Mann, es hat gut funktioniert ........ :) – roseisnice

1

zu finden, um zu finden „Alle Bilder, die nicht vom Benutzer bewertet und welche Bewertung von mehr als 5“:

MATCH (i:Image)<-[r:RATES]-(u:User) 
WITH i, COLLECT(r.rating) AS ratings, COLLECT(u.userId) AS ids 
WHERE ANY(r IN ratings WHERE r > 5) AND (NOT '123' IN ids) 
RETURN i;