Neo4j中合并(merge)和创建唯一(create unique)之间的区别是什么? 在Neo4j中,合并(merge)操作用于在图数据库中创建或更新节点和关系。它的工作原理是,如果节点或关系已经存在,则更新其属性;如果不存在,则创建新的节点或关系。 创建唯一(create unique)操作也用于创建节点和关系,但它具有更严格的条件。它要求在创建过程中保持唯一性,即如果已经存在具有相同属性的节点或关系,则不会创建新的节点或关系。 因此,合并(merge)操作更加灵活,可以根据需要创建或更新节点和关系,而创建唯一(create unique)操作则更加严格,确保不会创建重复的节点或关系。

31
我正在努力弄清楚MERGE和CREATE UNIQUE之间的区别。我知道以下特点:
#MERGE# 如果模式不存在,我可以创建节点。
MERGE (n { name:"X" }) RETURN n;

这将创建一个具有名称属性的节点“n”,一个空节点“m”和关系RELATED。
MERGE (n { name:"X" })-[:RELATED]->(m) RETURN n, m;

#创建唯一# 我无法创建这样的节点。
CREATE UNIQUE (n { name:"X" }) RETURN n;

如果存在节点“n”,则创建唯一的空节点“m”和关系RELATED。
MATCH (n { name: 'X' }) CREATE UNIQUE (n)-[:RELATED]->(m) RETURN n, m;

如果存在这个模式,就不会创建任何东西,只会返回模式。
从我的角度来看,我认为MERGE和CREATE UNIQUE是相似的查询,但是使用CREATE UNIQUE无法在关系中创建起始节点。如果有人能够解释这个问题并比较这些查询,我将不胜感激。
1个回答

39

CREATE UNIQUE的语义比MERGE略微晦涩。 MERGE是作为一种具有更直观行为的替代方法开发的,以替代CREATE UNIQUE。如果有疑问,通常使用MERGE是正确的选择。

最简单的想法是将MERGE视为MATCH或创建。也就是说,如果数据库中的某些内容与您在MERGE中使用的模式匹配,则MERGE将返回该模式。如果没有匹配项,则MERGE将创建模式中所有缺失的元素,其中缺失的元素是任何未绑定的标识符。

给定:

MATCH (a {uid:123})
MERGE (a)-[r:LIKES]->(b)-[:LIKES]->(c)

从MERGE的角度来看,“a”是一个绑定标识符。这意味着Cypher已经知道它代表哪个节点。

这个语句有两种可能的结果。要么整个模式已经存在,不会创建任何内容;要么模式的某些部分缺失,将创建一整套新的关系和节点以匹配该模式。

示例

// Before merge:
(a)-[:LIKES]->()-[:LIKES]->()

// After merge:
(a)-[:LIKES]->()-[:LIKES]->()


// Before merge:
(a)-[:LIKES]->()-[:OWNS]->()

// After merge:
(a)-[:LIKES]->()-[:OWNS]->()
(a)-[:LIKES]->()-[:LIKES]->()


// Before merge:
(a)

// After merge:
(a)-[:LIKES]->()-[:LIKES]->()

2
为什么你在拥有 Merge 的情况下还会只使用 Create 呢? - Benjamin McFerren
6
通常情况下,CREATE要快得多。 CREATE只是简单地创建了您告诉它要创建的内容,而MERGE则必须执行相当于MATCH子句和高级锁定以确保没有其他人在同时创建相同的模式。但是,您可以通过创建一个MERGE可依赖的唯一性约束条件来加速许多MERGE语句。 - Jacob Davis-Hansson
1
@jakewins 最简单的理解MERGE的方式是匹配或创建,如果没有唯一约束条件,它就不是原子性的,这让我完全困惑了。将其命名为MERGE并使其不具有原子性真的很糟糕:(在添加唯一索引后,我开始收到死锁错误,这再次让我感到困扰。所以,我的问题是:为什么我要在具有唯一约束条件的情况下使用MERGE而不是CREATE - tugberk
3
@jakewins,您能提供“CREATE UNIQUE”已被弃用的信息吗?我找不到任何提及此事的内容,并且已经查看了1.9.9至3.0.0-M05之间多个版本的弃用列表。截至3.0.0-M05,文档中仍然列出了“CREATE UNIQUE”,没有提到它已被弃用。 - Codebling
9
澄清一下:Create Unique 似乎在2018年已被弃用。http://neo4j.com/docs/developer-manual/current/cypher/clauses/create-unique/ - Touch
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接