我有两个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节点不存在时创建它?
请记住,您的 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 是匹配现有模式还是创建它。
还有另一篇博文很好地解释了 MERGE 的行为:http : //graphaware.com/neo4j/2014/07/31/cypher-merge-explained.html
在一个侧节点上,我在进行培训或帮助客户时经常重复这一点:MERGE 不能防止重复,只有唯一性约束可以!
感谢一篇有趣的博客文章:这是一个链接!
我发现解决方案是:
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)
仍然对任何其他答案感兴趣!:)
| 归档时间: |
|
| 查看次数: |
2359 次 |
| 最近记录: |