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

Kap*_*tth 22 neo4j cypher

我试图建立一个数据库,每当一个节点不存在时,它将创建一个新的并在此节点和另一个节点之间建立关系.如果节点存在,则两个节点都会建立关系.

我的问题是,如果我尝试连接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'})
Run Code Online (Sandbox Code Playgroud)

到这里它的工作原理,但:

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

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

Lua*_*nne 34

在完整模式上使用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
Run Code Online (Sandbox Code Playgroud)

  • 您不必将 3 个合并用作 3 个 Cypher。您可以在 1 个密码(一行)中链接 3 个合并以节省网络开销时间 (3认同)
  • @HahaTTpro 如何做到这一点?你介意举个例子吗? (2认同)
  • TCP 数据包的创建方式(一行或三行)可能会也可能不会产生任何差异,并且不会比编写可读代码产生更大的差异,因此请使用您更熟悉的方式。 (2认同)