检查节点是否存在,如果不存在则创建

时间:2014-06-03 12:58:57

标签: neo4j cypher

我试图建立一个数据库,每当一个节点存在时,它就会创建一个新的数据库,并设置这个节点与另一个节点之间的关系。如果节点存在,则两个节点都会建立关系。

我的问题是,如果我尝试连接2个现有节点,将重新创建第2个节点。我尝试使用MERGE和CREATE UNIQUE,两者都没有用。

我的例子:

CREATE (test1 name:'1'})
MATCH (n)
WHERE n.name = '1'
MERGE (n)-[:know {r:'123'}]->(test3 {name:'3'})

MATCH (n)
WHERE n.name = '1'
MERGE (n)-[:know {r:'123'}]->(test2 {name:'2'})

直到这里它起作用但是:

MATCH (n)
WHERE n.name = '3'
MERGE (n)-[:know {r:'123'}]->(test2 {name:'2'})

它创建了一个新节点" 2"而不是连接到存在的那个。

1 个答案:

答案 0 :(得分:33)

在完整模式上使用MERGE时,行为是整个模式匹配,或者创建整个模式。 MERGE不会部分使用现有的模式 - 它是全有或全无。如果需要部分匹配,可以通过将模式拆分为多个MERGE子句来完成。 http://docs.neo4j.org/chunked/stable/query-merge.html

MERGE (n)-[:know {r:'123'}]->(test2 {name:'2'})将尝试匹配整个模式,因为它不存在,所以它会创建它。你能做的是:

MERGE (n {name: '3'}) //Create if a node with name='3' does not exist else match it
MERGE (test2 {name:'2'}) //Create if a node with name='2' does not exist else match it
MERGE (n)-[:know {r:'123'}]->(test2) //Create the relation between these nodes if it does not already exist