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

如何在Neo4J中创建涉及多个特性的唯一约束,neo4j,cypher,Neo4j,Cypher,我知道我可以使用Cypher在单个属性上创建唯一约束,比如在(p:Person)ASSERT p上创建约束。name是唯一的。但我想知道是否有可能创建一个涉及多个属性的唯一约束。如果是,怎么做?neo4j(2.0.1)目前不支持同时覆盖多个属性的唯一性约束 然而,根据您的用例,我可以想出一个可以接受的解决方案。假设您希望属性a、b和c作为一个组是唯一的。您可以添加一个额外的属性d,该属性连接a、b和c的字符串化值,使用适当的分隔符分隔子字符串(例如,a/b分隔符是一个永远不会出现在a或b中的字符

我知道我可以使用Cypher在单个属性上创建唯一约束,比如
在(p:Person)ASSERT p上创建约束。name是唯一的
。但我想知道是否有可能创建一个涉及多个属性的唯一约束。如果是,怎么做?

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

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

[更新]

Neo4j 3.3增加了对覆盖多个属性的唯一性约束的支持,通过。但是,此功能仅在中可用。

到目前为止,neo4j(v3.0.3)仍然不支持具有多个属性的唯一约束。 这背后的原因是:
创建唯一约束时,它也会在其上创建索引,因为索引只允许一个属性,因此约束只能应用于一个索引。

自neo4j版本3.3起,有一个称为
节点键的约束,可用于跨多个属性的唯一性

从:

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

示例查询

CREATE CONSTRAINT ON (n:Person) ASSERT (n.firstname, n.surname) IS NODE KEY

如果这回答了你的问题,请考虑接受它。你知道是否有任何计划来支持这一点?我在最新版本的Neo4j中也没有发现此功能。Neo4j 3.2.1支持复合索引,因此它可能支持复合约束?节点键约束需要Neo4j Enterprise Edition