有没有办法确保节点只连接到特定关系类型的一个实例

时间:2014-08-07 18:00:27

标签: neo4j cypher

为了澄清,我们假设我们有代表人的节点和以下关系:“BIOLOGICAL_MOTHER”和“BIOLOGICAL_FATHER”。

然后,对于任何人节点,所述节点只能有一个“BIOLOGICAL_MOTHER”和一个“BIOLOGICAL_FATHER”。我们怎样才能确保这种情况呢?

2 个答案:

答案 0 :(得分:2)

没有。 Neo4J currently only supports uniqueness constraints

我相信有几个人正在为neo4j开发不同的模式结构,这将允许您以任意数量的方式约束图形。看起来你要求归结为数据库约束,如果存在从一个人到另一个人的BIOLOGICAL_FATHER类型的关系,那么DB可能不接受任何相同类型的新关系的创建。换句话说,关系基数约束,按关系类型。

目前,我认为你能做的最好的事情就是在你的应用程序代码中验证在创建之前这种关系是不存在的,但是DB不会为你做这个检查。

你正在寻找的特殊约束听起来很容易,希望neo4j dev会跳进这里并说:“哦,不用担心,计划发布XYZ” - 但我不确定。

更广泛地说,图表存在许多问题,使得约束变得非常棘手。在我的个人图域中,我想要创建新的关系,以便他们在特定的关系类型中引入图中的循环。 (例如(a) - [:拥有] - >(b) - [:拥有] - >(a)对我来说是非常不受欢迎的)。在一般情况下实际执行这将是一个非常昂贵的约束,因为验证新关系是否正常可能涉及遍历一个巨大的图形。

从长远来看,neo4j可能会实现本地约束似乎是合理的,但仍然会回避隐含非本地约束检查的任何内容。

答案 1 :(得分:2)

史蒂夫,

就Cypher而言,如果给我两个人的名字 - 比如Sam和Dave,并希望让Sam成为Dave的父亲,但只有Dave还没有父亲,我才能做点什么像这样:

MATCH (f {name : 'Sam'}), (s {name : 'Dave'})
WHERE NOT (s)<-[:FATHER]-()
CREATE (f)-[:FATHER]->(s)

如果Dave已经拥有父亲,WHERE子句会过滤掉Dave,这意味着不会创建任何关系。

恩典与和平,

吉姆