介绍
属性 property 是 schema 的组成成分,用来描述图中实体、关系的数据维度。比如 点schema "card"(银行卡)可以由卡号、余额、开卡时间等点属性构成;边schema "transaction"(转账)可以由金额、转账时间等边属性构成。
每个 点schema 在创建后会自带点属性 _id
、_uuid
,每个 边schema 在创建后会自带边属性 _uuid
、_from
、_to
、_from_uuid
、_to_uuid
,这些自带的属性为系统属性,均不可删除;每个 schema 中可以创建多个属性。
属性的特性:
- 属性数据类型支持:int32、int64、uint32、uint64、float、double、string、datetime、timestamp
- 在 UQL 中属性通常与 schema 连写为 @<schema>.<property>,表示 schema 值为
<schema>
的点或边的属性<property>
的值;属性不与 schema 连写则表示任意模式的点或边的该属性值,如果该属性不存在则为空
时间类型
datetime
和timestamp
的区别为:datetime
的数据格式可为yyyy-mm-dd hh:mm:ss
或yyyy-mm-dd hh:mm:ss.ssssss
,并被换算为从格林威治时间 1900年1月1日0时 开始到该时间值的微秒数,以 uint64 存储;timestamp
的数据格式为yyyy-mm-dd hh:mm:ss
,并被换算为从格林威治时间 1970年1月1日0时 开始到该时间值的秒数,以 uint32 存储。
如果只写
int
,默认使用int32
整数类型。字符串类型string
最大支持 65535 字节。小数类型float
占 4 字节,数据精度为 6 位有效数字;double
占 8 字节,数据精度为 15 位有效数字。请根据数据的实际用途、数据量以及磁盘大小选择恰当的小数类型。
V4.1 支持使用下标引用数组中的某个或多个元素,下标从 0 开始计算,写法有:
[n]
(下标为 n 的元素)、[n1:n2]
(从下标 n1 到 n2 的元素构成的数组)、[:n]
(从下标 0 到 n 的元素构成的数组)、[n:]
(从下标 n 到最后一个元素构成的数组)。
命名规则
Schema 由开发者自定义名称,一个图集中同一个 schema 的属性不能互相重名,但一个 schema 的属性可以和另一个 schema 的属性重名。
- 2 ~ 64 个字符
- 必须以字母开头
- 仅允许使用字母,下划线和数字(即 _ 、A-Z、a-z、0-9)
查看属性
返回的表名:_nodeProperty
和/或 _edgeProperty
返回的表头:name
|type
|lte
|schema
|description
(属性的名称、数据类型、是否 LTE、所属 schema、描述)
语法:
// 查看当前图集中的所有 schema 的属性(分为点、边两个表)
show().property()
// 查看当前图集中的所有 点schema 的属性
show().node_property()
// 查看当前图集中的所有 边schema 的属性
show().edge_property()
// 查看当前图集中的某个 点schema 的属性
show().node_property(@<schema>)
// 查看当前图集中的某个 边schema 的属性
show().edge_property(@<schema>)
创建属性
创建属性时如果不声明数据类型,则默认为 string。
语法:
// 在当前图集中为某个 点schema 创建一个点属性
create().node_property(@<schema>, "<name>", <type?>, "<desc?>")
// 在当前图集中为所有 点schema 创建一个点属性
create().node_property(@*, "<name>", <type?>, "<desc?>")
// 在当前图集中为某个 边schema 创建一个边属性
create().edge_property(@<schema>, "<name>", <type?>, "<desc?>")
// 在当前图集中为所有 边schema 创建一个边属性
create().edge_property(@*, "<name>", <type?>, "<desc?>")
// 混合以上四种方法同时创建多个点/边属性
create()
.node_property(@<schema>, "<name>", <type?>, "<desc?>")
.node_property(@*, "<name>", <type?>, "<desc?>")
.edge_property(@<schema>, "<name>", <type?>, "<desc?>")
.edge_property(@*, "<name>", <type?>, "<desc?>")
...
示例:用一条 UQL 创建 @card 的点属性“余额”和“级别”,以及所有边的“时间”属性
create().node_property(@card, "sum", double, "card balance")
.node_property(@card, "level", int, "card level")
.edge_property(@*, "time", datetime)
示例:用一条 UQL 创建 @transaction 的边属性“流水号”、“转账时间”和“金额”
create().edge_property(@transaction, "no", "", "transaction number")
.edge_property(@transaction, "time", datetime)
.edge_property(@transaction, "amount", double)
示例:用一条 UQL 创建 @card 的点属性“余额”和“级别”,及 @transaction 的边属性“流水号”、“转账时间”和“金额”
create().node_property(@card, "sum", double, "card balance")
.node_property(@card, "level", int, "card level")
.edge_property(@transaction, "no", "", "transaction number")
.edge_property(@transaction, "time", datetime)
.edge_property(@transaction, "amount", double)
修改属性(名称、描述)
语法:
// 修改当前图集中的某个 点schema 的某个属性的名称、描述
alter().node_property(@<schema>.<property>)
.set({name: "<new_name?>", description: "<new_desc?>"})
// 修改当前图集中的所有 点schema 的某个属性(如有)的名称、描述
alter().node_property(@*.<property>)
.set({name: "<new_name?>", description: "<new_desc?>"})
// 修改当前图集中的某个 边schema 的某个属性的名称、描述
alter().edge_property(@<schema>.<property>)
.set({name: "<new_name?>", description: "<new_desc?>"})
// 修改当前图集中的所有 边schema 的某个属性(如有)的名称、描述
alter().edge_property(@*.<property>)
.set({name: "<new_name?>", description: "<new_desc?>"})
示例:将 @card 的属性 sum 改为 balance
alter().node_property(@card.sum)
.set({name: "balance"})
示例:将所有边的属性 time 改为 createTime
alter().edge_property(@*.time)
.set({name: "createTime"})
删除属性
用户可以删除不再需要的属性,以节省磁盘空间。删除属性的操作是实时的,不必考虑时间消耗,一旦执行,属性会被立即删除。
除系统属性 _id
、_uuid
、_from
、_to
、_from_uuid
和 _to_uuid
不允许删除之外,schema 中的其它属性均可以删除。
语法:
// 从当前图集中删除某个 点schema 的某个属性
drop().node_property(@<schema>.<property>)
// 从当前图集中删除所有 点schema 的某个属性(如有)
drop().node_property(@*.<property>)
// 从当前图集中删除某个 边schema 的某个属性
drop().edge_property(@<schema>.<property>)
// 从当前图集中删除所有 边schema 的某个属性(如有)
drop().edge_property(@*.<property>)
// 混合以上四种方法同时删除多个点/边属性
drop()
.node_property(@<schema>.<property>)
.node_property(@*.<property>)
.edge_property(@<schema>.<property>)
.edge_property(@*.<property>)
...
示例:删除 @card 点的属性 branch 以及所有边的属性 time
drop().node_property(@card.branch).edge_property(@*.time)
示例:删除 @default 边的属性 test
drop().edge_property(@default.test)