neo4j - MERGE 创建重复节点

Arj*_*jun 8 neo4j cypher

我有两个Person节点。

(p:Person {Name: 'Anthony'})
(p:Person {Name: 'Jason'})
Run Code Online (Sandbox Code Playgroud)

所需的关系是:

(p:Person)-[KNOWS]-(s:Skill) //s is dynamically entered
Run Code Online (Sandbox Code Playgroud)

为了实现这一点,我使用了查询:

MATCH (p:Person) 
WHERE p.Name='Anthony'
MERGE(p)-[r:KNOWS{Weight:83}]-(x:Skill {Name:"WordPress"})
Run Code Online (Sandbox Code Playgroud)

但是,如果我再次尝试:

MATCH (p:Person) 
WHERE p.Name='Jason' 
MERGE(p)-[r:KNOWS{Weight:80}]-(x:Skill {Name:"WordPress"})
Run Code Online (Sandbox Code Playgroud)

再次(s:Skill {Name: 'WordPress'})创建节点。

我知道MERGE将匹配整个模式,但是如何确保此查询仅在Skill节点不存在时创建它?

Inv*_*con 9

请记住,您的 MERGE 正在寻找整个模式,包括您包含的值。当您尝试使用 :KNOWS 关系和不同的权重属性进行 MERGE 合并时,它找不到与此类属性的这种关系,因此它创建了整个模式。

该查询的另一个问题是,正如您所发现的,在创建模式时会创建一个新的 :Skill 节点,即使图中已经存在一个 :Skill 节点。正如您所发现的,在合并模式之前,首先需要对技能进行合并。

至于处理新的属性值,最好在 MERGE 模式之后完成(不包括 MERGE 中的属性)。

例如:

MATCH (p: Person)
WHERE p.Name='Jason'
MERGE (s:Skill {Name: 'Wordpress'})
MERGE (p)-[r:KNOWS]-(s)
SET r.Weight = 80
Run Code Online (Sandbox Code Playgroud)

同样有用的是,在 MERGE 之后,您可以分别使用 ON CREATE 和 ON MATCH 来执行附加操作(通常是 SET 操作),具体取决于 MERGE 是匹配现有模式还是创建它。


Chr*_*sen 5

还有另一篇博文很好地解释了 MERGE 的行为:http : //graphaware.com/neo4j/2014/07/31/cypher-merge-explained.html

在一个侧节点上,我在进行培训或帮助客户时经常重复这一点:MERGE 不能防止重复,只有唯一性约束可以!


Arj*_*jun 2

感谢一篇有趣的博客文章:这是一个链接

我发现解决方案是:

MATCH (p: Person)
WHERE p.Name='Jason'
MERGE (s:Skill {Name: 'Wordpress'})
CREATE UNIQUE (p)-[r:KNOWS {Weight:80}]-(s)
RETURN (r)
Run Code Online (Sandbox Code Playgroud)

仍然对任何其他答案感兴趣!:)