合并创建重复节点



我有两个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>

请记住,您的合并正在寻找整个模式,包括您包含的值。当您尝试与:知道的关系和不同的重量属性合并时,它找不到与这样属性的关系,因此创建了整个模式。

正如您发现的那样,该查询的另一个问题是在创建模式时会创建一个新的:技能节点,即使存在图表中的技能也是如此。正如您发现的那样,在合并模式之前,必须首先对技能进行合并。

对于处理新的财产价值,最好在合并模式后完成(不包括合并中的属性)。

例如:

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

也很有用,在合并后,您可以在创建和匹配上分别使用以执行其他操作(通常设置操作),具体取决于合并是匹配现有模式还是创建它。

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

在侧节点上,我经常在进行培训或帮助客户时重复此操作:合并并不能阻止重复,只有唯一性约束才能!

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

我发现解决方案是:

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

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

在处理neo4j节点和关系时,总是有一个习惯(唯一/断言),以避免重复弄乱,因为清洁它更加困难。不确定此链接对您有多大帮助,但请查看官方NEO4J网站上提供的约束。

最新更新