如何为Neo4j中两类标签节点的关系创建唯一性约束?
Neo4j重复创建节点问题解析
各位开发者好,咱们先明确一下场景里的图模型:
- 节点标签:
Product(产品)、Brand(品牌) - 关联关系:
Product通过:is_of关系关联到所属的Brand
问题重现
如果你重复执行下面这条Cypher创建语句两次,每次都会成功执行,不会有任何报错:
CREATE (:Product { name: "Chocolate"})-[:is_of]->(:Brand {name: "Cadbury"})
当你执行查询语句查看结果时:
MATCH (p:Product { name: "Chocolate"})-[:is_of]->(b:Brand {name: "Cadbury"}) RETURN p,b
你会看到图中存在2个Chocolate产品节点和2个Cadbury品牌节点——这是因为CREATE语句的特性就是每次执行都会创建全新的节点和关系,它不会检查数据库中是否已经存在属性完全相同的节点,所以重复执行就会生成重复的节点。
避免重复的解决方案
如果想要保证相同属性的节点只存在一份,推荐使用MERGE语句替代CREATE,示例代码如下:
// 先匹配或创建产品节点 MERGE (p:Product {name: "Chocolate"}) // 再匹配或创建品牌节点 MERGE (b:Brand {name: "Cadbury"}) // 最后匹配或创建两者的关联关系 MERGE (p)-[:is_of]->(b)
这样无论你执行多少次这条语句,数据库里都只会保留一个Chocolate产品节点、一个Cadbury品牌节点,以及它们之间的一条:is_of关联关系。
内容的提问来源于stack exchange,提问作者Marthinus Engelbrecht
相关产品推荐
相关产品推荐

