我會建議G的定義移動到WHERE子句,因爲在開始一個不存在的節點提供了錯誤,因此我們不能繼續查詢到創建階段。注意'?'它處理Cypher中的空值:
start n=node:types(id={typeId})
create unique (n)<-[:has_type]-(unit {props})-[:has_group]->(g)
where g.id?={groupId}
return unit
查詢可能需要一些調整,這只是我的第一個未經測試的鏡頭。
編輯:經過一番努力我得出一個結論,那你可能要創建具有唯一節點它總是和第二關係的第一部分創建的關係做2個不同的查詢,第一
start n=node:types(id={typeId})
create unique (n)<-[:has_type]-(unit {props})
return unit
start unit=node:unitProps({unitPropsValue}) ,g=node:groups(id={groupId})
create unique unit-[:has_group]->g
return g
第二查詢將失敗,並在情況下,組不存在錯誤,但是這並不重要,因爲你仍然會達到目標:這可能不會發生的羣體。出於某種奇怪的原因,我無法像在第一次嘗試中那樣在where子句中實施某些限制。下面的查詢,似乎只是在有條件的地方(也許一個錯誤?)跳雖然在我的Cypher支架的理解應當符合現有的組,但它確實創造NEW G點,而不是:
start n=node(1)
create unique n-[:TYPE1]-(uniq {uid:333})
with uniq
create unique uniq-[:TYPE2]->g
where has(g.gid) and g.gid=999
return g
我目前在做兩種查詢方法。您的第一個和第三個查詢都會創建該組(如您所指出的那樣)。不確定在評估哪裏之前創建獨特的嘗試來創建整個路徑?只是一個瘋狂的猜測:-) – Luanne