属性 property 是 schema 的组成成分,用来描述图中实体、关系的数据维度。比如 点schema card(银行卡)可以由卡号、余额、开卡时间等点属性构成;边schema transaction(转账)可以由金额、转账时间等边属性构成。
以下系统属性默认存在,不需要创建,也不能删除:
- 点:_id、_uuid
- 边:_uuid、_from、_to、_from_uuid、_to_uuid
每个 schema 中可以创建多个自定义属性,支持的类型见数据类型。
本节中的
@<schema>
、@<schema>.<property>
表示对图模型中的 schema、属性进行过滤,不同于在过滤器中使用@<schema>
、@<schema>.<property>
对元数据的 schema、属性进行过滤,请与《过滤器|操作符》-《条件判断符》-《Schemna 判断》中关于符号 @ 的使用加以区分。
命名规则
属性由开发者自定义名称,一个图集中同一个 schema 的属性不能互相重名,但一个 schema 的属性可以和另一个 schema 的属性重名。
- 2 ~ 64 个字符
- 不能以波浪号 '~' 开头
- 不能包含反单引号 '`'
- 不能与《背景知识》中列出的系统属性、系统表名、系统别名(保留字)重复
- (属性名中含有除数字、字母、下划线之外的字符时,在 UQL 语句中使用时需要用反引号(`)包裹)
查看属性
返回的表名:_nodeProperty
和/或 _edgeProperty
返回的表头:name
|type
|lte
|read
|write
|schema
|description
|extra
|encrypt
(属性的名称、数据类型、是否 LTE、是否可读、是否可写、所属 schema、描述、decimal 的精度和标度、加密算法)
语法:
// 查看当前图集中的所有 schema 的属性(分为点、边两个表)
show().property()
// 查看当前图集中的所有 点schema 的属性
show().node_property()
// 查看当前图集中的所有 边schema 的属性
show().edge_property()
// 查看当前图集中的某个 点schema 的属性
show().node_property(@<schema>)
// 查看当前图集中的某个 边schema 的属性
show().edge_property(@<schema>)
创建属性
创建属性时如果不声明数据类型,则默认为 string;使用参数 encrypt()
时表示使用 AES128 算法加密存储该属性(当前仅支持 string 及 text),如不使用则表示不加密。
语法:
// 在当前图集中为某个 点schema 创建一个点属性
create().node_property(@<schema>, "<name>", <type?>, "<desc?>").encrypt()
// 在当前图集中为所有 点schema 创建一个点属性
create().node_property(@*, "<name>", <type?>, "<desc?>").encrypt()
// 在当前图集中为某个 边schema 创建一个边属性
create().edge_property(@<schema>, "<name>", <type?>, "<desc?>").encrypt()
// 在当前图集中为所有 边schema 创建一个边属性
create().edge_property(@*, "<name>", <type?>, "<desc?>").encrypt()
// 混合以上四种方法同时创建多个点/边属性
create()
.node_property(@<schema>, "<name>", <type?>, "<desc?>")
.node_property(@*, "<name>", <type?>, "<desc?>")
.edge_property(@<schema>, "<name>", <type?>, "<desc?>")
.edge_property(@*, "<name>", <type?>, "<desc?>")
...
示例:创建 @course 点的属性 title 和 description,为所有边创建属性 time
create().node_property(@course, "title", "", "course name")
.node_property(@course, "description")
.edge_property(@*, "time", datetime)
分析:省略 <type>
但其后的 <desc>
不省略时,需用空引号为 <type>
占位。
示例:创建 @forex 点的属性 fRate、tags 和 records
create().node_property(@forex, "fRate", "decimal(65,30)")
.node_property(@forex, "tags", "set(string)")
.node_property(@forex, "records", "string[]")
分析:创建 list 或 set 的某个子类型以及decimal 时,<type>
需用引号包裹。
示例:创建 @course 点的属性 title,已知该属性已经存在
create().node_property(@course, "title")
Property exists!
分析:如使用前缀 TRY try create().node_property(@course, "title")
,则无返回。
修改属性(名称、描述)
属性的类型不支持修改。
语法:
// 修改当前图集中的某个 点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)