如何实现Neo4j中每个用户爱好名称唯一且不同用户可创建同名爱好节点?
同名爱好节点的唯一性控制方案
现有数据结构
数据库中已存在如下节点及关系:
(p:person {name: "Claudia"})-[:likes]->(h:hobby {name: "football", experience: "2 years"})
需求说明
- 单个
person节点不能关联多个同名的hobby节点(即同一用户的爱好名称唯一) - 不同
person节点可以各自创建名称为"football"的独立hobby节点
错误尝试与问题
尝试通过以下约束语句实现需求:
CREATE CONSTRAINT FOR (h:hobby),(p:person) REQUIRE (p:person)-[:likes]->(h.name) IS UNIQUE
执行后报错:
Invalid input '(': expected ")" or an identifier (line 2, column 6 (offset: 24))
"FOR ((h:hobby),(p:person))"
有效解决方案
使用WHERE NOT EXISTS子句校验当前用户是否已关联同名爱好,同时为每个新创建的hobby节点生成唯一UUID保证全局唯一性:
MATCH (p:Person { name: "Claudia" }) WHERE NOT EXISTS { (p)-[:LIKES]->(:Hobby {name: "football"}) } CREATE (p)-[:LIKES]->(:Hobby {name: "football", experience: "2 years", id: apoc.create.uuid()})
内容的提问来源于stack exchange,提问作者Boris Buklov
相关产品推荐
相关产品推荐

