概述
UQL的约束可以对进入当前图集的数据施加限制规则。如果约束与数据修改操作有冲突,需放弃相关修改。
UQL支持以下约束:
创建约束
使用语句CREATE CONSTRAINT
为一或多个属性创建约束。约束创建以作业形式执行,稍后可使用show().job(<id?>)
来验证是否创建成功。
CREATE CONSTRAINT <constraintName> <ifNotExistsFlag?>
FOR <aliasDecl>
REQUIRE <alias>.<property> <constraintType>
OPTIONS {
<item?>: {<key?>: <value?>}
}
详情
<constraintName>
是约束的唯一名称。如果同名约束存在,则创建失败。<ifNotExistsFlag?>
(即IF NOT EXISTS
)为可选项,如果给定的<constraintName>
已存在,或已有一个约束存在且该约束类型只允许有一个约束,则不会进行创建操作,且在不报错的情况下完成操作。- 语句
OPTIONS
为可选项,可用来提供额外配置。
创建约束需要一些时间,因为系统需扫描全部现有数据,以确保其符合约束要求。如果现有数据与约束不符,则约束创建失败。此外,为确保数据一致性,创建约束时,会暂停其他数据修改操作。
一旦约束应用于某个属性,任何违反该约束的数据修改操作将引发报错。
EDGE KEY
EDGE KEY限制仅应用于边属性,用于确保指定属性:
- 存在于所有边schema中。
- 在全图没有重复值。
- 不存在
null
值。
涉及多个属性的复合EDGE KEY约束,其属性值的组合必须唯一。
创建EDGE KEY约束时,要求每个分片内的属性值唯一,但不同分片间可以存在重复值。但请注意,应用EDGE KEY约束后,任何数据修改操作必需遵从全局唯一原则。
一个图集只能创建一条EDGE KEY约束,并应用于所有边schema。EDGE KEY约束在指定属性和边的_uuid
间建立映射。与此同时,将指定属性加载至缓存,用于加速查询。
// 创建单属性EDGE KEY约束
CREATE CONSTRAINT <constraintName> <ifNotExistsFlag?>
FOR ()-[<alias>]-()
REQUIRE <alias>.<property> IS EDGE KEY
OPTIONS {
type: {<property?>: <type?>}
}
// 创建复合eEDGE KEY约束
CREATE CONSTRAINT <constraintName> <ifNotExistsFlag?>
FOR ()-[<alias>]-()
REQUIRE (<alias>.<property1>, <alias>.<property2>, ...) IS EDGE KEY
OPTIONS {
type: {<property1?>: <type1?>, <property2?>: <type2?>, ...}
}
详情
- 使用
OPTIONS
语句为所有指定属性定义期望的类型,这些类型必须与数据库中对应属性类型一致。如果忽略OPTIONS
语句,所有指定属性默认为string
类型。 - EDGE KEY约束不支持以下属性类型:
decimal
,list
和set
。
为边属性notes
创建EDGE KEY约束,要求每个notes
属性为string
类型:
CREATE CONSTRAINT edge_key
FOR ()-[e]-() REQUIRE e.notes IS EDGE KEY
为边属性score
创建EDGE KEY约束,要求每个score
属性为float
类型:
CREATE CONSTRAINT edge_key
FOR ()-[e]-() REQUIRE e.score IS EDGE KEY
OPTIONS {
type: {score: "float"}
}
为属性notes
和score
创建EDGE KEY约束,要求每个notes
属性为string
类型,每个score
属性为float
类型:
CREATE CONSTRAINT edge_key
FOR ()-[e]-() REQUIRE (e.notes, e.score) IS EDGE KEY
OPTIONS {
type: {notes: "string", score: "float"}
}
如果当前没有EDGE KEY约束,则创建一个;若已有约束,创建操作不报错:
CREATE CONSTRAINT edge_key IF NOT EXIST
FOR ()-[e]-() REQUIRE e.notes IS EDGE KEY
NOT NULL
默认情况下,属性可以存在null
值。NOT NULL约束则强制要求属性不接受null
值,确保属性永远存在非空值。每个NOT NULL约束仅能指定一个属性。
// 为一个点属性创建NOT NULL约束
CREATE CONSTRAINT <constraintName> <ifNotExistsFlag?>
FOR (<alias>:<schema>)
REQUIRE <alias>.<property> IS NOT NULL
// 为一个边属性创建NOT NULL约束
CREATE CONSTRAINT <constraintName> <ifNotExistsFlag?>
FOR ()-[<alias>:<schema>]-()
REQUIRE <alias>.<property> IS NOT NULL
为点属性@user.name
创建NOT NULL约束:
CREATE CONSTRAINT not_null_user_name
FOR (u:user) REQUIRE u.name IS NOT NULL
在未与其他约束重名的前提下,为边属性@likes.weight
创建NOT NULL约束,命名为not_null_weight
;若有重名,不要引发报错:
CREATE CONSTRAINT not_null_weight IF NOT EXIST
FOR ()-[e:likes]-() REQUIRE e.weight IS NOT NULL
显示约束
获取在当前图集创建的所有约束信息:
// 显示所有约束
show().constraint()
// 显示所有针对点属性的约束
show().node_constraint()
// 显示所有针对边属性的约束
show().edge_constraint()
约束信息展示在表_nodeConstraint
和表_edgeConstraint
中。表中各字段提供了每个约束的基础信息:
字段 |
描述 |
---|---|
name |
约束名称 |
type |
约束类型 |
schema |
应用约束的点schema或边schema |
properties |
应用约束的边属性 |
status |
约束的当前状态,包括DONE 和CREATING |
删除约束
使用语句DROP CONSTRAINT
删除约束。
DROP CONSTRAINT <constraintName> <ifExistsFlag?>
详情
<constraintName>
为约束名称。如果指定的约束名称不存在,则删除失败。<ifExistsFlag?>
(即IF EXISTS
)为可选项,如果未发现指定的<constraintName>
,则不会进行任何删除操作,并在不报错的情况下完成操作。
删除名为not_null_user_name
的约束:
DROP CONSTRAINT not_null_user_name
删除名为user_name
的约束,如果约束不存在,不引发报错:
DROP CONSTRAINT not_null_user_name IF EXISTS
其他限制
重命名属性
应用了NOT NULL约束的属性可以重命名。但应用了EDGE KEY约束的属性不可重命名。
删除属性
应用了任何约束的属性无法删除,除非所有相关约束均已删除。