概述
约束对图集中的点、边的属性值施加限制规则。如果点、边的插入或更新操作与约束有冲突,将引发报错。
支持以下约束:
显示约束
获取当前图集创建的所有约束:
// 显示所有约束
show().constraint()
// 显示为点属性创建的所有约束
show().node_constraint()
// 显示为边属性创建的所有约束
show().edge_constraint()
约束信息展示在表_nodeConstraint和表 _edgeConstraint中。表中各字段提供了每个约束的基础信息:
字段 |
描述 |
|---|---|
name |
约束名称 |
type |
约束类型 |
schema |
应用约束的点schema或边schema |
properties |
应用约束的点属性或边属性 |
status |
约束的状态,包括DONE和CREATING |
创建约束
使用语句CREATE CONSTRAINT创建一条约束。约束创建以作业形式执行,稍后可使用show().job()来验证是否创建成功。
请留意,在一个已有数据的大图集中创建约束需要一些时间,因为系统需扫描全部现有数据,以确保其符合约束要求。如果现有数据与约束不符,则约束创建失败。此外,为确保数据一致性,创建约束时,会暂停其他数据修改操作。
NOT NULL
NOT NULL约束强制要求一条属性不可拥有null值,确保属性永远存在非空值。
详情
NOT NULL约束必须针对单个指定schema创建。- 每个
NOT NULL约束仅能指定一个属性。
为点user的name属性创建名为nn_1的NOT NULL约束:
CREATE CONSTRAINT nn_1
FOR (u:user) REQUIRE u.name IS NOT NULL
为边link的weight属性创建名为nn_2的NOT NULL约束:
CREATE CONSTRAINT nn_2
FOR ()-[e:link]-() REQUIRE e.weight IS NOT NULL
当指定的属性不存在null值时,约束才能创建成功。
EDGE KEY
一个EDGE KEY约束指定一个或多个边属性作为图中所有边的唯一标识符,确保它们没有null值或重复值。当指定多个属性时,也称为复合EDGE KEY约束。
详情
- 每个图只能创建一个
EDGE KEY约束——单属性EDGE KEY或复合EDGE KEY。 EDGE KEY无法应用到list类型的属性。EDGE KEY属性会自动缓存,以加速查询。- 创建
EDGE KEY时,要求每个Shard中属性值唯一,但允许不同Shard中存在重复值。但EDGE KEY创建完成后,所有的数据修改必须遵守全局唯一性。
单属性EDGE KEY
创建名为eUID的单属性EDGE KEY约束:
CREATE CONSTRAINT eUID
FOR ()-[e]-() REQUIRE e.createdOn IS EDGE KEY
OPTIONS {
type: {createdOn: "datetime"}
}
成功创建这个EDGE KEY必须满足以下条件:
- 所有边Schema均有
createdOn属性,且类型为datetime。 createdOn没有null值或重复值。
未指定属性值类型时,默认使用string:
CREATE CONSTRAINT eUID
FOR ()-[e]-() REQUIRE e.createdOn IS EDGE KEY
本例中,所有边Schema必须包含string类型的createdOn属性。
复合EDGE KEY
创建名为eUIDs的复合EDGE KEY约束:
CREATE CONSTRAINT eUIDs
FOR ()-[e]-() REQUIRE (e.createdOn, e.weight) IS EDGE KEY
OPTIONS {
type: {createdOn: "datetime", weight: "float"}
}
成功创建这个EDGE KEY必须满足以下条件:
- 所有边Schema均有
datetime类型的createdOn属性和float类型的weight属性。 createdOn和weight均没有null值createdOn和weight的组合没有重复值。
使用IF NOT EXISTS
图中的约束名称必须唯一。如果创建的约束与已有约束重名,创建操作将失败,并返回错误消息表明名称重复。
使用IF NOT EXISTS标志时,若在创建过程中检测到重复名称,作业将以FINISHED状态完成。不会返回错误信息,也不会创建新的约束。
创建名为nn_1的NOT NULL约束。如果约束名已存在,跳过创建过程,无需返回错误信息:
CREATE CONSTRAINT nn_1
FOR (u:user) REQUIRE u.age IS NOT NULL
命名规则
每个约束的名称需满足:
- 包含2~64个字符
- 以字母开头
- 允许的字符:字母(A-Z,a-z),字母(0-9),下划线(
_)
图中约束不能重名。
删除约束
使用语句DROP CONSTRAINT删除约束。
删除名为nn_1的约束:
DROP CONSTRAINT nn_1
使用IF EXISTS
如果指定的约束名称不存在,约束将删除失败,并返回错误信息。
使用IF EXISTS标志后,如果指定的约束名称不存在,不会返回错误信息,也不会删除约束。
删除名为nn的约束。若约束名称不存在,跳过删除过程,无需返回错误信息:
DROP CONSTRAINT nn_1 IF EXISTS
对带有约束的属性限制
重命名属性
应用了NOT NULL约束的属性可以重命名。但应用了EDGE KEY约束的属性不可重命名。
删除属性
应用了约束的属性无法删除,除非所有相关约束均已删除。