我有两个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>
答案 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网站上提供的限制。