我有两个 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
节点如果不存在?
最佳答案
请记住,您的 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
同样有用的是,在 MERGE 之后,您可以分别使用 ON CREATE 和 ON MATCH 来执行附加操作(通常是 SET 操作),具体取决于 MERGE 是匹配现有模式还是创建它。
关于neo4j - MERGE 创建重复节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41408104/