2014-04-24 38 views
5

我試圖編寫一個查詢,如果另一個關係已經存在,它將創建一些關係。在可選匹配後創建沒有匹配的地方

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 

查詢返回一個錯誤:

「預計optional1到一個節點,但它是一個空」

有沒有一種方式,如果對現有關係的存在是爲了創造新的關係?否則,只需忽略創建?

回答

9

現在,您可以使用FOREACHCASE解決此問題。例如:

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 

我懷疑這將在未來的Cypher語言更新中變得更簡單。

PS。你可能不應該再使用START了,但我想你只是爲了方便舉例。

+0

是的,如果有ON UPDATE/ON創建關係合併,我相信這會做的伎倆。目前,ON UPDATE/ON CREATE似乎只能用於節點。 – Rolf