neo4j - MERGE 创建重复节点

标签 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节点如果不存在?

最佳答案

请记住,您的 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/

相关文章:

Neo4j - 如何在保存或更新相关节点时删除与另一个节点的关系

Neo4j 密码查询 : Parenthesis not considered in WHERE clause?

Neo4j - 根据关系对节点进行分组

graph - Neo4j-在图形中存储医学症状

java - MissingMethodException - org.neo4j.kernel.impl.coreapi.schema.IndexDefinitionImpl.createNode() - Groovy

neo4j - Neo4j 社区版可以增加堆大小吗

java - Neo4j Java 7 终端问题

使用rest在neo4j中运行密码查询的java示例

Neo4j 存储库 - 使用动态 where 子句编写查询

java - @QueryResult 映射错误