neo4j 如何根据节点的标签和属性对节点对创建约束?

p5fdfcr1  于 2023-10-18  发布在  其他
关注(0)|答案(2)|浏览(172)

假设我的DB中有两个不同的节点:

(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))"
bihw5rsg

bihw5rsg1#

一种选择是稍微更改数据模型(不知道这对您来说是否可行),以便使Hobby对所有人都是唯一的。因此,只有一个名为“football”的Hobby节点,所有喜欢足球的人都会指向同一个节点。这样,您就可以对Hobby的名称进行唯一性约束。
使用此模型,您可以将experience属性移到关系中(以便LIKES关系具有experience属性)。
然而,这不会阻止同一个人节点与同一个爱好有多个LIKES关系,但至少同一个爱好只存在一次。

q9yhzks0

q9yhzks02#

不能在节点-关系-节点组合上创建CONSTRAINT
它可以在创建关系的DML语句中强制执行。举例来说:

MATCH (p:Person { name: "Claudia" })
WHERE NOT EXISTS { (p)-[:LIKES]->(:Hobby {name: "football"}) }
CREATE (p)-[:LIKES]->(:Hobby {name: "football", experience: "2 years"})

这是假设这个爱好可能还不存在。

相关问题