概述
约束对进入图集中的数据施加限制规则。如果数据修改操作与约束有冲突,将引发报错。
支持以下约束:
显示约束
获取当前图集为点属性创建的所有约束:
SHOW NODE CONSTRAINT
获取当前图集为边属性创建的所有约束:
SHOW EDGE CONSTRAINT
约束信息展示在表_nodeConstraint
和表 _edgeConstraint
中,包含以下字段:
字段 |
描述 |
---|---|
name |
约束名称 |
type |
约束类型 |
schema |
应用约束的点Schema或边Schema |
properties |
应用约束的点属性或边属性 |
status |
约束的状态,包括DONE 和CREATING |
创建约束
使用语句ALTER NODE
或ALTER EDGE
创建约束。约束创建以作业形式执行,稍后可使用SHOW JOB <id?>
来验证是否创建成功。
创建约束需要一些时间,因为系统需扫描全部现有数据,以确保其符合约束要求。如果现有数据与约束不符,则约束创建失败。此外,为确保数据一致性,创建约束时,会暂停其他数据修改操作。
EDGE KEY
EDGE KEY
约束相当于指定一个属性作为所有边的唯一标识符。因此,指定的属性必须关联所有边Schema且值类型相同,同时属性值在全图不重复且非null。
详情
- 每个图只能创建一个
EDGE KEY
约束。 EDGE KEY
约束无法应用于list
类型边属性。- 与
EDGE KEY
约束相关的边属性会自动缓存,以加速查询。 - 必须使用
*
将EDGE KEY
约束应用于所有边Schema时。 - 创建
EDGE KEY
约束时,要求每个分片中的属性值唯一,但允许不同分片中存在重复值。然而,EDGE KEY
约束创建完成后,所有数据修改必须遵守全局唯一性。
为边属性createdOn
创建名为eUID
的EDGE KEY
约束:
ALTER EDGE * ADD CONSTRAINT eUID EDGE KEY (createdOn)
OPTIONS {
type: {createdOn: "datetime"}
}
若想成功创建该约束,必须满足以下条件:
- 所有边schema均有名为
createdOn
的属性,其类型必须为datetime
。 - 各分片中,
createdOn
属性值必须唯一且不存在null
值。
默认属性值类型
未指定属性值类型时,默认使用string
:
ALTER EDGE * ADD CONSTRAINT eUID EDGE KEY (createdOn)
本例中,所有边schema必须包含string
类型的createdOn
边属性。
复合EDGE KEY约束
复合EDGE KEY
约束涉及多个边属性。其创建要求与单属性EDGE KEY
约束相同,但唯一性是基于指定属性的组合值强制执行的。
为边属性createdOn
和weight
创建名为eUIDs
的复合EDGE KEY
约束:
ALTER EDGE * ADD CONSTRAINT eUIDs EDGE KEY (createdOn, weight)
OPTIONS {
type: {createdOn: "datetime", weight: "float"}
}
NOT NULL
NOT NULL
约束强制要求一条属性不可拥有null
值,确保属性永远存在非空值。
详情
NOT NULL
约束必须针对单个指定schema创建。- 每个
NOT NULL
约束仅能指定一个属性。
为点user
的name
属性创建名为nn_1
的NOT NULL
约束:
ALTER NODE user ADD CONSTRAINT nn_1 NOT NULL (name)
为边link
的weight
属性创建名为nn_2
的NOT NULL
约束:
ALTER EDGE link ADD CONSTRAINT nn_2 NOT NULL (weight)
当指定属性不存在null
值时,约束才能创建成功。
使用IF NOT EXISTS
IF NOT EXISTS
子句用于防止在尝试创建已存在的约束时出错,它允许安全地执行语句。
ALTER NODE user ADD CONSTRAINT IF NOT EXISTS nn_1 NOT NULL (age)
仅当不存在该名称的约束时,才会创建约束nn_1
。如果nn_1
已存在,则忽略该语句,不会引发报错。
删除约束
使用语句ALTER NODE
或ALTER EDGE
删除约束。
为所有边schema删除名为eUID
的EDGE KEY
约束:
ALTER EDGE * DROP CONSTRAINT eUID
从点schema user
中删除名为nn_1
的NOT NULL
约束:
ALTER NODE user DROP CONSTRAINT nn_1
使用IF EXISTS标志
如果指定的约束名称不存在,约束将删除失败,并返回错误信息。
使用IF EXISTS
标志后,如果指定的约束名称不存在,不会返回错误信息,也不会删除约束。
从点schema user
中删除名为nn
的约束。若约束名称不存在,跳过删除过程,无需返回错误信息:
ALTER NODE user DROP CONSTRAINT nn IF EXISTS
对带有约束的属性限制
重命名属性
应用了NOT NULL
约束的属性可以重命名。但应用了EDGE KEY
约束的属性不可重命名。
删除属性
应用了约束的属性无法删除,除非所有相关约束均已删除。