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

时间:2015-02-21 23:51:18

标签: neo4j constraints unique

这是来自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

2 个答案:

答案 0 :(得分:4)

不,neo4j不支持这种架构约束。您可以在专辑标题上声明唯一性(您不会想要这样做,因为不止一个乐队可以制作相同标题的专辑),或者您可以没有约束地生活。

更广泛地说,如果neo4j的图表架构具有关系基数功能会很好,但它们还没有,你必须向开发人员询问他们是否/什么时候他们?重新开始。但它可能会很棘手;例如,此处的基数约束是指外部节点的属性(相册标题)。执行此操作可能会变得棘手;让我们说你有一张名为" Death Magnetic"与Metallica相关联。你有另一张专辑"骑闪电"与Metallica相关联。有人进来并改变了#34; Ride the Lightning"的专辑名称。到死亡磁性"。好了所以现在你有两个节点,这两个节点都已链接到Metallica,但违反了约束。你是做什么?你拒绝允许专辑标题编辑吗?你删除了"骑闪电"专辑节点?或者您是否允许编辑,但是切断指向" Metallica"的链接。节点

由于这些问题,如果它存在的话,这个功能的效果并不总是那么明显。图模式可能非常棘手。

答案 1 :(得分:2)

唯一的唯一性限制是唯一的。

您要求路线图上的复合约束和索引作为解决方法,您可以创建连接或数组值并唯一地约束

路线图还有其他限制,如财产,财产类型,关系及其基数。