概述
约束对图中的点、边属性施加额外的限制规则。如果点、边的插入或更新操作与约束有冲突,将引发报错。
嬴图支持在类型图中创建以下约束:
显示约束
获取当前图的点约束:
SHOW NODE CONSTRAINT
获取当前图的边约束:
SHOW EDGE CONSTRAINT
也支持复数形式SHOW NODE|EDGE CONSTRAINTS。
每个约束包含以下信息:
字段 |
描述 |
|---|---|
name |
约束名称 |
type |
约束类型 |
schema |
应用约束的点或边Schema |
properties |
应用约束的点或边属性 |
status |
约束的状态,包括DONE和CREATING |
创建约束
你可以在创建图和创建图类型时创建约束,也可以在现有图中创建约束。在现有图中创建约束以作业形式执行,稍后可使用SHOW JOB <id?>来验证是否创建成功。
请留意,在一个大图中创建约束需要一些时间,因为系统需扫描全部现有数据,以确保其符合约束要求。如果现有数据与约束条件不符,则约束创建失败。此外,为确保数据一致性,创建约束时,会暂停其他数据修改操作。
NOT NULL
NOT NULL约束要求一个属性不能有null值。一个NOT NULL约束只能作用于一个Schema的一个属性。
为User点的name属性创建NOT NULL约束:
ALTER NODE user ADD CONSTRAINT NOT NULL ON name
为link边的weight属性创建NOT NULL约束:
ALTER EDGE link ADD CONSTRAINT NOT NULL ON weight
只有当指定的属性不存在null值时,NOT NULL约束才能创建成功。
你可以在创建类型图时创建NOT NULL约束:
CREATE GRAPH g1 {
NODE User ({name STRING NOT NULL, age UINT32}),
EDGE Follows ()-[{createdOn LOCAL DATETIME NOT NULL}]->()
}
你也可以在创建图类型时创建NOT NULL约束:
CREATE GRAPH TYPE gType {
NODE User ({name STRING NOT NULL, age UINT32}),
EDGE Follows ()-[{createdOn LOCAL DATETIME NOT 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
ALTER EDGE * ADD CONSTRAINT EDGE KEY ON eID INT32
成功创建这个EDGE KEY必须满足以下条件:
- 所有边均有
eID属性,且类型为INT32。 eID属性没有null值或重复值。
未指定属性值类型时,默认为STRING:
ALTER EDGE * ADD CONSTRAINT EDGE KEY ON tag
本例中,所有边必须有STRING类型的tag属性。
复合EDGE KEY
ALTER EDGE * ADD CONSTRAINT EDGE KEY ON eID INT32, tag STRING
成功创建这个EDGE KEY必须满足以下条件:
- 所有边均有
INT32类型的eID属性和STRING类型的tag属性。 eID和tag属性各自均没有null值。eID和tag属性的组合值没有重复。
创建图时创建EDGE KEY
你可以在创建类型图时创建EDGE KEY约束:
CREATE GRAPH g1 {
NODE User ({name STRING , age UINT32}),
NODE Club ({name STRING}),
EDGE Follows ()-[{createdOn LOCAL DATETIME}]->(),
EDGE Joins ()-[]->()
}
EDGE KEY eID INT64, tag STRING
系统会自动为所有边Schema创建EDGE KEY指定的属性eID和tag。
创建图类型时创建EDGE KEY
你可以在创建图类型时创建EDGE KEY约束:
CREATE GRAPH TYPE gType {
NODE User ({name STRING, age UINT32}),
NODE Club ({name STRING}),
EDGE Follows ()-[{createdOn LOCAL DATETIME}]->(),
EDGE Joins ()-[]->()
}
EDGE KEY eID INT64
当使用这个图类型创建图时,系统会自动为所有边Schema创建EDGE KEY指定的属性eID。
使用IF NOT EXISTS
IF NOT EXISTS子句可避免尝试创建已存在的约束时报错,从而安全地执行语句。
ALTER NODE User ADD CONSTRAINT IF NOT EXISTS NOT NULL ON name
只有User点的name属性没有已创建的NOT NULL约束时,才会创建约束。如果已存在,该语句将被忽略且不会报错。
命名规范
每个约束的名称需满足:
- 包含2~64个字符
- 以字母开头
- 允许的字符:字母(A-Z,a-z),数字(0-9),下划线(
_)
图中约束不能重名。
删除约束
删除当前图的EDGE KEY约束:
ALTER EDGE * DROP EDGE KEY
删除当前图User点的name属性的NOT NULL约束:
ALTER NODE user DROP CONSTRAINT NOT NULL ON name
对带有约束的属性限制
重命名属性
应用了NOT NULL约束的属性可以重命名。然而,应用了EDGE KEY约束的属性不可重命名。
删除属性
应用了约束的属性无法删除,除非所有相关约束均已删除。