3.7 约束

3.7.1 简介

Neo4j通过使用约束来保证数据完整性,可应用于节点或者关系。约束的类型包括:

(1)节点属性的唯一性约束。确保具有特定标签的所有节点的某个属性唯一。针对多个属性建立的唯一性约束,则确保这些属性值的组合是唯一的。唯一性约束并不要求所有节点对于相关属性都具有唯一值,如果节点不包含约束相关的全部属性,则该节点不受此约束限制。

(2)节点属性的存在性约束(仅企业版)。确保具有特定标签的所有节点都具有某个属性。如果创建具有这种标签的节点时没有设定该属性,则创建失败。删除节点的这类属性同样也会失败。

(3)关系属性的存在性约束(仅企业版)。确保具有特定类型的所有关系都存在属性。如果创建具有这些类型的关系时没有设定该属性,则创建失败。删除关系的这类属性同样也会失败。

(4)节点键约束(仅企业版)。确保给定标签下的所有节点都拥有所有约束相关的属性,且属性的值唯一。如果创建了该类约束,则以下操作都不能执行:

● 创建未包含全部属性的节点或属性值不唯一的节点。

● 删除约束相关属性。

● 导致属性值不再唯一的更新。

创建约束将对索引产生以下影响:

● 为属性创建节点键约束或节点属性唯一性约束,会自动在该属性上创建一个索引,因此约束一旦创建,就不能另外单独创建相同索引类型、标签和属性组合的索引。

● 这些自动创建的索引也可以被Cypher使用。

● 如果约束被删除,相关索引也被删除,如果仍需使用约束所自动创建的索引,则需要手动重新创建这些索引。

此外,约束还有以下特点:

● 一个标签可以有多个约束,属性的唯一性约束和存在性约束可以绑定在同一个属性上。

● 创建约束是原子操作,且因为需要扫描全库,所以可能会花费较长的时间。

● 最好在创建约束时就为其命名,否则系统会自动生成一个名称。

● 约束名称必须在索引和约束中都唯一。

● 默认情况下,创建约束的操作不可重复执行。两次创建相同的约束会引发报错,可以使用关键字IF NOT EXISTS防止这种情况。