Neo4j中合并和创建唯一性之间的区别

Posted

技术标签:

【中文标题】Neo4j中合并和创建唯一性之间的区别【英文标题】:Difference between merge and create unique in Neo4j 【发布时间】:2014-05-11 11:59:34 【问题描述】:

我试图弄清楚 MERGE 和 CREATE UNIQUE 之间的区别。我知道这些功能:

合并

如果不存在模式,我可以创建节点。

    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”和关系。

    MATCH (n  name: 'X' ) CREATE UNIQUE (n)-[:RELATED]->(m) RETURN n, m;

如果此模式存在,则不创建任何内容,仅返回模式。

从我的角度来看,我看到 MERGE 和 CREATE UNIQUE 是完全相同的查询,但是使用 CREATE UNIQUE 您不能在关系中创建起始节点。如果有人能解释这个问题并比较这些查询,我将不胜感激,谢谢。

【问题讨论】:

【参考方案1】:

CREATE UNIQUE 的语义比MERGE 稍微模糊一些。 MERGE 被开发为比CREATE UNIQUE 具有更直观行为的替代方案;如果有疑问,MERGE 通常是正确的选择。

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

给定

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

“a”是从 MERGE 的角度来看的绑定标识符。这意味着 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]->()

【讨论】:

当你有 Merge 的时候,为什么你会只使用 Create? CREATE 通常要快得多。 CREATE 只是创建您告诉它的内容,而 MERGE 必须执行等效的 MATCH 子句和高级锁定以确保没有其他人同时创建相同的模式。您可以通过创建 MERGE 可以依赖的唯一性约束来加速许多 MERGE 语句。 @jakewins 认为 MERGE 的最简单方法是 MATCH-or-create。 如果您没有唯一约束,这不是 Atomic,这让我很失望完全关闭。将其命名为 MERGE 并使其不是原子的真的很糟糕 :( 添加唯一索引后我开始遇到死锁错误,这再次让我很难过。所以,我的问题是:我为什么要使用 MERGE而不是 CREATE 我有一个独特的约束? @jakewins 你能提供 CREATE UNIQUE 被弃用吗?我找不到任何提及,我已经浏览了 1.9.9 和 3.0.0-M05 之间的几个版本的弃用列表。从 3.0.0-M05 开始,CREATE UNIQUE 仍在文档中列出,没有提及弃用。 把事情弄清楚:Create Unique 似乎在 2018 年被弃用了。neo4j.com/docs/developer-manual/current/cypher/clauses/…

以上是关于Neo4j中合并和创建唯一性之间的区别的主要内容,如果未能解决你的问题,请参考以下文章

主键和唯一键的区别

neo4j----创建索引

使用 JPA 创建唯一并合并数据库中的现有行

合并两个父>子表集

程序进程线程之间的区别

如何使用 Cypher neo4j 将三列连接为一列并获取其中唯一条目的计数?