neo4j - MERGE创建重复的Node

时间:2016-12-31 11:58:27

标签: neo4j cypher

我有两个Person节点。

(p:Person {Name: 'Anthony'})
(p:Person {Name: 'Jason'})

所需的关系是:

(p:Person)-[KNOWS]-(s:Skill) //s is dynamically entered

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

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

但是,如果我再次尝试使用:

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

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

我了解 MERGE 将匹配整个模式但是如何确保此查询仅创建Skill节点(如果它不存在?)< / p>

4 个答案:

答案 0 :(得分:4)

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

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

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

例如:

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

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

答案 1 :(得分:3)

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

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

答案 2 :(得分:1)

感谢有趣的博文:这里是a link

我发现解决方案是:

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

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

答案 3 :(得分:1)

在处理Neo4j节点和关系时总是习惯有约束(唯一/断言)以避免重复混乱,因为它更难以清理它。 不确定这个link对你有多大帮助,但要看看官方Neo4j网站上提供的限制。