2013-05-07 120 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