在Neo4j中合并和创建之间的区别

EdW*_*ood 25 merge neo4j cypher

我想弄清楚MERGE和CREATE UNIQUE之间有什么区别.我知道这些功能:

合并

我能够创建节点,如果不存在模式.

    MERGE (n { name:"X" }) RETURN n;
Run Code Online (Sandbox Code Playgroud)

这创建节点"n",其属性名称为空节点"m",关系为RELATED.

    MERGE (n { name:"X" })-[:RELATED]->(m) RETURN n, m;
Run Code Online (Sandbox Code Playgroud)

创造独特

我无法像这样创建节点.

    CREATE UNIQUE (n { name:"X" }) RETURN n;
Run Code Online (Sandbox Code Playgroud)

如果存在节点"n",则创建唯一使空节点"m"和关系RELATED.

    MATCH (n { name: 'X' }) CREATE UNIQUE (n)-[:RELATED]->(m) RETURN n, m;
Run Code Online (Sandbox Code Playgroud)

如果存在此模式,则不会创建任何内容,只返回模式.

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

Jac*_*son 33

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

最简单的思考方式MERGE是MATCH-or-create.也就是说,如果数据库中的某些东西是MATCH您正在使用的模式MERGE,那么MERGE将只返回该模式.如果没有匹配,MERGE则将在模式中创建所有缺少的元素,其中缺少的元素表示任何未绑定的标识符.

特定

MATCH (a {uid:123})
MERGE (a)-[r:LIKES]->(b)-[:LIKES]->(c)
Run Code Online (Sandbox Code Playgroud)

从MERGE的角度来看,"a"是绑定标识符.这意味着密码以某种方式已经知道它代表哪个节点.

该陈述可以有两个结果.整个模式已经存在,并且不会创建任何内容,或者缺少模式的某些部分,并且将创建与模式匹配的全新关系和节点集.

例子

// 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]->()
Run Code Online (Sandbox Code Playgroud)

  • 清楚一点:创建独特在2018年似乎已被弃用.http://neo4j.com/docs/developer-manual/current/cypher/clauses/create-unique/ (6认同)
  • @jakewins你可以提供CREATE UNIQUE被弃用吗?我找不到任何提及,我已经浏览了1.9.9和3.0.0-M05之间的几个版本的弃用列表.从3.0.0-M05开始,CREATE UNIQUE仍然列在文档中,没有提及弃用. (3认同)
  • 为什么当你有 Merge 时你会只使用 Create ? (2认同)
  • `CREATE`通常要快得多.`CREATE`只是创建你告诉它的东西,而`MERGE`必须执行等效的`MATCH`子句和高级锁定,以确保没有其他人同时创建相同的模式.您可以通过创建"MERGE"可以依赖的唯一性约束来加速许多"MERGE"语句. (2认同)