2013-05-07 107 views
0

我想在儘可能少的請求中捆綁一大堆操作。背後的邏輯是應該是以下:Neo4j/Cypher創建節點如果丟失

  • 檢查,如果頭部與關鍵=值存在,如果創建如果尾巴與關鍵=值存在它不
  • 檢查,創建,如果它不
  • 創建一個獨特的關係(各種屬性)
  • 設置了一堆屬性的頭&尾

我已經偶然發現創造獨特,但這似乎只適用於關係。我如何確保至少存在頭節點,以便我可以在其上運行創建唯一語句?

我現在正在做的是發射多個requests.The第一個找出是否存在節點:

start x=node:index({key}={value}) return ID(x) as id 

如果不返回一個ID,我火了另一個請求創建節點最後的最後請求創建第二個節點和關係:

start n=node({id}) 
create unique n-[:POINTS_TO {label:{label}}]->(x {{key}:{value}}) 
return n,x 

我不知道是否有捆綁的這一切更好的方式...

回答

4

如果使用自動索引,喲ü可以做:

start n=node:node_auto_index(key={value}) 
with count(*) as exists 
where exists=0 
create (n {key: {value}} 
return n; 

statement 2: 

start n=node:node_auto_index(key={value}) 
create unique n-[:REL {foo:"bar"}]->(m {a:"b"}) 
set r.answer = 42 
set m.c="d" 
return r,m; 

在Neo4j的2.0有MERGE你想要的東西。

+0

這是確保第一個節點實際存在的好方法。好的...... – Michael 2013-05-07 13:53:51

+0

看來由於某種原因,這個聲明有時會創建新的尾節點而不是使用現有的節點。試圖弄清楚什麼是錯的... – Michael 2013-05-07 18:00:59