如何通过节点的属性和第一个相关的另一个节点在节点上创建约束?

问题描述 投票:0回答:2

假设我的数据库中有两个不同的节点:

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

我不知道该怎么做。

感谢您的帮助:)

neo4j cypher constraints
2个回答
0
投票

您无法在节点-关系-节点组合上创建

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"})

这假设该爱好可能尚不存在。


0
投票

一个选择是稍微改变数据模型(不知道这对你来说是否是一个可行的选择),这样你就可以让 Hobby 的名字对所有人来说都是独一无二的。因此,只有一个名为“足球”的爱好节点,所有喜欢足球的人都会指向同一个节点。这样你就可以对 Hobby 的名称进行唯一性约束。

使用此模型,您可以将体验属性移至关系(以便 LIKES 关系具有体验属性)。

但是,这并不能阻止同一个人节点对同一个Hobby有多个LIKES关系,但至少同一个Hobby只会存在一次。

© www.soinside.com 2019 - 2024. All rights reserved.