假设我的数据库中有两个不同的节点:
(p:person {name: "Claudia"})-[:likes]->(h:hobby {name: "football", experience: "2 years"})
。所以,我的目标是通过其 name
属性使每个人的爱好独一无二,但同时我希望能够创建另一个 (h:hobby {name: "football"})
节点,与其他一些 person
相关,并且它将是 2 个不同的节点(这很重要!)。
我该怎么做?
我尝试过:
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))"
我不知道该怎么做。
感谢您的帮助:)
您无法在节点-关系-节点组合上创建
CONSTRAINT
。
可以在用于创建关系的 DML 语句中强制执行它。例如:
MATCH (p:Person { name: "Claudia" })
WHERE NOT EXISTS { (p)-[:LIKES]->(:Hobby {name: "football", experience: "2 years"}) }
CREATE (p)-[:LIKES]->(:Hobby {name: "football", experience: "2 years"})
这假设该爱好可能尚不存在。
一个选择是稍微改变数据模型(不知道这对你来说是否是一个可行的选择),这样你就可以让 Hobby 的名字对所有人来说都是独一无二的。因此,只有一个名为“足球”的爱好节点,所有喜欢足球的人都会指向同一个节点。这样你就可以对 Hobby 的名称进行唯一性约束。
使用此模型,您可以将体验属性移至关系(以便 LIKES 关系具有体验属性)。
但是,这并不能阻止同一个人节点对同一个Hobby有多个LIKES关系,但至少同一个Hobby只会存在一次。