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

时间:2014-03-31 22:39:42

标签: merge neo4j cypher

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

MERGE

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

    MERGE (n { name:"X" }) RETURN n;

这个创建节点" n"具有属性名称,空节点" m"和关系相关。

    MERGE (n { name:"X" })-[:RELATED]->(m) RETURN n, m;

CREATE UNIQUE

我无法像这样创建节点。

    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 个答案:

答案 0 :(得分:32)

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

考虑MERGE的最简单方法是作为MATCH或创建。也就是说,如果数据库中的某些内容MATCHMERGE中使用的模式,则MERGE将返回该模式。如果没有匹配,MERGE将在模式中创建所有缺少的元素,其中缺少的元素表示任何未绑定的标识符。

<强>鉴于

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

&#34;&#34;从MERGE的角度来看是绑定标识符。这意味着密码以某种方式已经知道它代表哪个节点。

这句话可以有两个结果。整个模式已经存在,并且不会创建任何内容,或者缺少部分模式,并且将创建一组全新的关系和与模式匹配的节点。

<强>实施例

// 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]->()
相关问题