2012-11-06 148 views
3

對於以下的Cypher語句:Neo4j的Cypher支架:創建關係僅在端節點存在

start n=node:types(id={typeId}), g=node:groups(id={groupId}) 
create unique (n)<-[:has_type]-(unit {props})-[:has_group]->(g) 
return unit 

有當g可以爲空的情況下(即具有ID的groupId的基團不存在)。 在這種情況下,我應該怎麼做才能創建該單元,但跳過與g的has_group關係? 現在,單元不會被創建,大概是因爲g爲空。

我正在使用Neo4j Advanced 1.8

謝謝!

回答

1

我會建議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 
+0

我目前在做兩種查詢方法。您的第一個和第三個查詢都會創建該組(如您所指出的那樣)。不確定在評估哪裏之前創建獨特的嘗試來創建整個路徑?只是一個瘋狂的猜測:-) – Luanne

0

您可以使用WITH子句在一個查詢中實現此功能,

start n=node:types(id={typeId}) 
create unique (n)<-[:has_type]-(unit {props}) 
WITH unit 
START g=node:groups(id={groupId}) 
create unique (unit)-[:has_group]->(g) 
WHERE g <> null 
return unit 

如果g爲空,則根本不會執行第二個。甚至在這裏可能不需要null <> null。請嘗試並確認

+0

這是行不通的,因爲你的第二個START試圖從一個不存在的節點開始。你會得到一個錯誤:org.neo4j.graphdb.NotFoundException:Node [50] – Luanne

0

你可以試試這個

MATCH (g:groups) 
    WHERE id(g)={groupId} 
    create unique (unit {props})-[:has_group]->(g) 
    WITH unit, create unique (unit)-[:has_type]->(n) 
    return unit 
0

由於這是我能找到與此相關的,我將添加我如何與此處理,因爲沒有任何其他答案的唯一的事情是不夠好爲我的目的。

MATCH (a:TEST{id:1}) 
OPTIONAL MATCH (b:TEST) 
WHERE b.id IN [2,3,5] 
// collect b so that there are no nulls, and rows aren't lost when no match 
WITH a, collect(b) AS c 
FOREACH(n IN c | CREATE UNIQUE (a)-[:HAS]->(n)) 
RETURN a 

將工作的Cypher支架2.3+(我無法測試比任何更早)

對於那些APOC,你也可以用CALL apoc.cypher.doIt()打出來的寫。

相關問題