属性 property 是 schema 的组成成分,用来描述图中实体、关系的数据维度。比如 点schema card(银行卡)可以由卡号、余额、开卡时间等点属性构成;边schema transaction(转账)可以由金额、转账时间等边属性构成。
点的系统属性 _id、_uuid 以及边的系统属性 _uuid、_from、_to、_from_uuid、_to_uuid 不需要创建,也不能删除。
每个 schema 中可以创建多个自定义属性。自定义属性的数据类型:int32、int64、uint32、uint64、float、double、string、text、datetime、timestamp:
数据类型 | 描述 |
---|---|
float | 占 4 字节,数据精度为 6 位有效数字 |
double | 占 8 字节,数据精度为 15 位有效数字 |
string | 最大支持 65535 字节 |
text | 长度不限 |
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 、yyyy-mm-dd 、yyyymmddhhmmss 、yyyymmdd ,并被换算为从格林威治时间 1970年1月1日0时 开始到该时间值的秒数,以 uint32 存储;其时区须通过 SDK 的 RequestConfig 进行设置 |
本节中的
@<schema>
、@<schema>.<property>
表示对图模型中的 schema、属性进行过滤,不同于在过滤器中使用@<schema>
、@<schema>.<property>
对元数据的 schema、属性进行过滤,请与《过滤器|操作符》-《条件判断符》-《Schemna 判断》中关于符号 @ 的使用加以区分。
命名规则
属性由开发者自定义名称,一个图集中同一个 schema 的属性不能互相重名,但一个 schema 的属性可以和另一个 schema 的属性重名。
- 2 ~ 64 个字符
- 不能以波浪号 '~' 开头
- 不能包含反单引号 '`'
- 不能与《背景知识》中列出的系统属性、系统表名、系统别名(保留字)重复
- (属性名中含有除数字、字母、下划线之外的字符时,在 UQL 语句中使用时需要用反引号(`)包裹)
查看属性
返回的表名:_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", int32, "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", int32, "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 中的其它属性均可以删除。删除一个属性将同时删除与其相关的索引、全文索引、引擎索引(LTE的属性)。
语法:
// 从当前图集中删除某个 点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)