2014-04-24 10 views
5

Próbuję napisać zapytanie, które utworzy pewne relacje, jeśli inny związek już istnieje.CREATE po OPTIONAL MATCH, gdzie nie znaleziono dopasowania

START a=node(1), b=node(2), c=node(3) 
OPTIONAL MATCH a-[r1:RELATIONSHIP]-(optional1) 
OPTIONAL MATCH b-[r2:RELATIONSHIP]-(optional2) 
CREATE c-[:NEW_RELATIONSHIP]->(optional1) 
CREATE c-[:NEW_RELATIONSHIP]->(optional2) 
DELETE r1, r2 
RETURN a, b, c 

Kwerenda zwraca błąd:

„Oczekiwane optional1 do węzła, ale jest to null”

Czy istnieje sposób, aby utworzyć nowy związek, czy istniejący związek istnieje? W przeciwnym razie po prostu zignoruj ​​tworzenie?

Odpowiedz

9

Na razie można obejść to, używając FOREACH i CASE. Na przykład:

START a=node(1), b=node(2), c=node(3) 
OPTIONAL MATCH (a)-[r1:RELATIONSHIP]-(optional1) 
OPTIONAL MATCH (b)-[r2:RELATIONSHIP]-(optional2) 
FOREACH (o IN CASE WHEN optional1 IS NOT NULL THEN [optional1] ELSE [] END | 
    CREATE (c)-[:NEW_RELATIONSHIP]->(optional1) 
) 
FOREACH (o IN CASE WHEN optional2 IS NOT NULL THEN [optional2] ELSE [] END | 
    CREATE (c)-[:NEW_RELATIONSHIP]->(optional2) 
) 
DELETE r1, r2 
RETURN a, b, c 

Podejrzewam, że będzie to prostsze w przyszłych aktualizacjach językowych Cyphera.

PS. Prawdopodobnie nie powinieneś już używać START, ale wyobrażam sobie, że masz po prostu dla wygody przykład.

+0

Tak, jeśli istniały ON UPDATE/ON CREATE dla związków MERGE, uważam, że to by działało. Na razie ON UPDATE/ON CREATE wydaje się być użyteczna tylko dla węzłów. – Rolf

Powiązane problemy