在 Neo4j 中,我可以强制执行关系+节点值约束吗?

In Neo4j, can I enforce a relationship+node value constraint?

这是来自 Neo4j 新手。我想问题是关于身份规则。

假设我有以下数据结构:

艺术家制作了很多专辑

我可以通过以下方式强制执行艺术家的唯一性:

CREATE CONSTRAINT ON (artist:Artist) ASSERT artist.name IS UNIQUE

意思是名字是艺人的商业身份。

但我也想确保每张专辑只存在一次 - 然而,专辑标识是(专辑名称 + 艺术家姓名),因为两个不同的艺术家可以有自己的同名专辑.有没有一种优雅的方法可以用 Neo4j 实现这一点?

因此,对于艺术家 Metallica,我想确保只有一张名为 Death Magnetic 的专辑,并且在单个 Metallica 节点和单个 Death Magnetic 节点之间只存在一种关系,而另一位艺术家称为,比如说, Megadeth,可以有自己的专辑叫Death Magnetic(不同节点)。

这样只保证了关系的唯一性,我还需要先创建相册节点:

MATCH (artist:Artist { name:'Metallica' }),(album:Album { name:'Death Magnetic' })
MERGE (artist)-[r:MADE]->(album)
RETURN r

不,neo4j 不支持这种模式约束。您可以断言专辑名称的唯一性(您不想这样做,因为不止一个乐队可以制作同名专辑),或者您可以不受限制地生活。

更广泛地说,如果 neo4j 的图形模式具有关系基数功能就好了,但它们还没有,您必须询问开发人员 if/when 它们将被内置. 但这可能很棘手;例如,此处的基数约束是指外部节点的 属性(专辑名称)。强制执行这一点可能会变得棘手;假设您有一张名为 "Death Magnetic" link 的 Metallica 专辑。你有另一张专辑 "Ride the Lightning" linked 到 Metallica。有人进来将 "Ride the Lightning" 的专辑名称更改为 "Death Magnetic"。好的,现在您有两个节点,都已经 linked 到 Metallica,但是违反了约束。你做什么工作?您是否拒绝允许编辑专辑名称?是否删除 "Ride the Lightning" 相册节点?或者您是否允许编辑,但将 link 切断到 "Metallica" 节点?

由于这些问题,如果有此功能,它的工作原理并不总是那么明显。图形模式可能非常棘手。

只有当前的唯一性约束。

您要求路线图上的复合约束和索引,作为变通方法,您可以创建串联值或数组值并唯一地约束该

路线图还有其他约束,例如 属性、属性 类型、关系及其基数。