2017-12-22 5 views
0

Ich habe eine Datenbank, in der ich Entity-Knoten, Benutzerknoten und einige Beziehungen einschließlich LIKES, POSTED_BY habe. Ich versuche, eine Abfrage zu schreiben, dieses Ziel zu erreichen:Cypher COLLECT-Klausel, um eine Liste zu erstellen, in der einige Listen leer sein könnten

alle Entity Knoten finden, dass ein bestimmter Benutzer LIKES oder solche, die POSTED_BY gewesen sein, dass Benutzer

Bitte beachte, dass ich meine Abfrage vereinfacht - in Echt Ich habe eine Reihe anderer Bedingungen ähnlich wie oben.

Ich versuche eine COLLECT-Klausel zu verwenden, um die Liste aller Entity-Knoten zu aggregieren und Zeile für Zeile darauf aufzubauen.

MATCH (e)<-[:LIKES]-(me:User{id: 'rJVbpcqzf'}) 
WITH me, COLLECT(e) AS all_entities 
MATCH (e)-[:POSTED_BY]->(me) 
WITH me, all_entities + COLLECT(e) AS all_entities 
UNWIND all_entities AS e 
WITH DISTINCT e 
RETURN e; 

Dies scheint nur die korrekte Liste zurückkehren zu werden, wenn es mindestens eine Entität ist, dass der Benutzer (das heißt, wenn die erste kehrt COLLECT eine nicht-leere Liste) gefallen hat. Wenn es jedoch keine Entität gibt, die mir gefallen hat, wird die gesamte Abfrage leer zurückgegeben.

Irgendwelche Vorschläge, was mir hier fehlt?

Antwort

1

Verwendung OPTIONAL MATCH:

MATCH (me:User {id: 'rJVbpcqzf'}) 
OPTIONAL MATCH (me)-[:LIKES|POSTED_BY]->(e) 
RETURN collect(DISTINCT e) AS all_entities 

Hinweise:

  1. Statt des Sammelns und Abwickeln, können Sie einfach DISTINCT verwenden. Sie können auch DISTINCT with collect verwenden.

  2. Sie können auch multiple relationship types, d. H. Die LIKES|POSTED_BY für den Beziehungstyp hier verwenden.

Verwandte Themen