2016-07-29 6 views
3

Ich möchte eine CREATE-Anweisung in THEN und UPDATE in ELSE-Anweisung in Cypher-Abfragesprache in Neo4j ausführen.THEN ELSE Bedingung Anweisungen in cypher Abfragesprache in Neo4j

Hier ist meine Frage:

MATCH (product:user_product) WHERE id(product) = 45 
OPTIONAL MATCH (user:person) where id(user) = 90 
FOREACH (o IN CASE WHEN user IS NOT NULL THEN 
CREATE (user)<-[:HAS_USER]-(product) 
ELSE 
set product.userStatus = 1 
END) 
return user, product 

Antwort

2

Sie können den Benutzer auf eine Liste collect während durch Produkt- und Anwender Gruppierung, eine Liste, die eine Größe von 0 oder 1, da es nicht null enthalten hat.

Dann

  1. Sie befinden sich auf der Liste iterieren kann nur den CREATE Teil zu tun, wenn der Benutzer

  2. existiert können Sie iterieren 0 oder 1 mal die Eigenschaft (oder nicht zu setzen, in der Fall von 0), wenn die Größe der Benutzerliste ist 1 oder 0

die resultierende Abfrage ist dies:

MATCH (product:user_product) WHERE id(product) = 45 
OPTIONAL MATCH (user:person) WHERE id(user) = 90 
WITH product, user, collect(user) AS users 
FOREACH (u IN users | CREATE (u)<-[:HAS_USER]-(product)) 
FOREACH (i in range(1, 1 - size(users)) | SET product.userStatus = 1) 
RETURN user, product 
+0

Wenn der Knoten 'user' null ist, wird ein Fehler ausgegeben, dass der andere Knoten null ist. – Jeevika

+1

In der Tat habe ich eine "FOREACH" -Schleife hinzugefügt, um das 'CREATE' zu schützen. –

+0

nette Antwort - ich mag die zweite 'FOREACH' für die Aktualisierung der' product.userStatus' –

1

Wenn eine der beiden Bedingungen wahr ist, können Sie eine Sammlung von 1 für die spezifische Bedingung festlegen und dann FOREACH verwenden, um die Bedingung zu durchlaufen, wenn sie wahr ist. Durch die Kombination können Sie wahlweise das eine oder das andere ausführen.

MATCH (product:user_product) WHERE id(product) = 45 
OPTIONAL MATCH (user:person) where id(user) = 90 
WITH CASE WHEN user IS NOT null THEN 
    [1] 
END as create_rel, 
CASE WHEN user IS null THEN 
    [1] 
END as update_product, product, user 
FOREACH (x in create_rel | 
    MERGE (user)<-[r:HAS_USER]-(product) 
    ON CREATE set r.updated = 1 
    ON MATCH set r.updated = r.updated + 1 
) 
FOREACH (x in update_product | 
    SET product.userStatus = 1 
) 
return user, product