如何在Neo4J中创建涉及多个属性的唯一约束

vic*_*orx 30 neo4j cypher

我知道我可以使用Cypher在单个属性上创建一个唯一约束CREATE CONSTRAINT ON (p:Person) ASSERT p.name IS UNIQUE.但我想知道是否有可能创建一个涉及多个属性的唯一约束.如果是这样,怎么样?

cyb*_*sam 25

neo4j(2.0.1)目前不支持同时涵盖多个属性的唯一性约束.

但是,根据您的使用案例,我可以考虑可以接受的解决方法.假设您希望属性a,b和c作为一个组唯一.您可以添加一个额外的属性d,它连接a,b和c的字符串化值,使用适当的分隔符分隔子字符串(例如,a/b分隔符是一个永远不会出现的字符在a或b)中.然后,您可以在d上创建唯一性约束.

  • 你知道有没有支持这个的计划? (4认同)

pge*_*son 24

从neo4j版本3.3开始,有一个约束NODE KEY,可以用于跨多个属性的唯一性.

文档:

创建节点密钥,确保具有特定标签的所有节点都具有一组已定义的属性,这些属性的组合值是唯一的,并且集合中的所有属性都存在

示例查询

CREATE CONSTRAINT ON (n:Person) ASSERT (n.firstname, n.surname) IS NODE KEY
Run Code Online (Sandbox Code Playgroud)

  • 节点密钥约束需要Neo4j企业版 (21认同)

piy*_*121 5

到目前为止,neo4j(v3.0.3)仍不支持具有多个属性的唯一约束。其背后的原因是: When a unique constraint is created it also creates an index on it and as indexes only allow one property, thus constraints can only be applied on one index.