概述
属性(Property)与schema关联,用来描述图中实体和关系的数据维度。比如,点schema card(银行卡)关联卡号、余额、开卡时间等属性,边schema transaction(转账)关联金额、转账时间等属性。
每个点、边数据默认携带以下系统属性。系统系统属性不与任何schema关联,无需用户手动创建,也不能删除。
系统属性 | 数据类型 | 描述 | |
---|---|---|---|
点 | _id |
string,最大长度128字节 | 点的唯一标识符 |
_uuid |
uint64 | 点的唯一标识符 | |
边 | _uuid |
uint64 | 边的唯一标识符 |
_from |
同_id |
边起点的_id |
|
_to |
同_id |
边终点的_id |
|
_from_uuid |
同_uuid |
边起点的_uuid |
|
_to_uuid |
同_uuid |
边终点的_uuid |
在每个schema中,用户可创建自定义属性来描述和记录点边特征。自定义属性支持的数据类型见创建类型。
嬴图GQL使用
@<schema>.<property>
对图模型或元数据中的属性进行过滤。嬴图数据库的Demi-Schema特性也支持在过滤器中忽略@<schema>.
,直接指定属性名。
属性命名规则
属性(自定义属性)由用户命名,规则如下:
- 2~64个字符
- 不能以波浪号(~)开头
- 不能包含反单引号(`)
- 不能与系统保留字(包括系统属性、系统表名、系统别名等)重名
与同一个schema关联的属性不能重名,但与不同schema关联的属性可以重名。
属性名称中含有数字、字母、下划线以外的字符时,在嬴图GQL语句中使用时需要用一对单反引号(`)包裹。
find().nodes({@user.`年龄` == 20}) as nodes return nodes{*} limit 10
查看属性
返回的表名:_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>)
创建属性
// 在当前图集中为一个指定点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()
// 在当前图集中同时为多个点、边schema创建属性
create()
.node_property(@<schema>, "<name>", <type?>, "<desc?>")
.node_property(@*, "<name>", <type?>, "<desc?>")
.edge_property(@<schema>, "<name>", <type?>, "<desc?>")
.edge_property(@*, "<name>", <type?>, "<desc?>")
...
关于参数encrypt()
:
- 使用AES128算法加密存储属性
- 目前仅支持加密string和text类型的属性
- 忽略此参数表示不加密
创建属性时,如果不声明数据类型,默认使用string。目前支持的属性数据类型有:
数据类型 | 描述 |
---|---|
int32 | 占4字节,有符号 |
uint32 | 占4字节,无符号 |
int64 | 占8字节,有符号 |
uint64 | 占8字节,无符号 |
float | 占4字节,6位有效数字 |
double | 占8字节,15位有效数字 |
decimal | 需指定精度(范围1~65)和标度(范围0~30)[1],例如'decimal(5,10)',设置时必须用引号包裹 |
string | 创建属性时的默认数据类型,最大支持60000字节 |
text | 最大长度不限 |
datetime | 有效格式包括yyyy-mm-dd hh:mm:ss 和yyyy-mm-dd hh:mm:ss.ssssss ,有效存储范围为1000-01-01 00:00:00.000000到9999-12-31 23:59:59.499999,以uint64存储 |
timestamp | 有效格式包括yyyy-mm-dd hh:mm:ss 、yyyy-mm-dd 、yyyymmddhhmmss 和yyyymmdd ,会被换算为从格林威治时间1970年1月1日0时开始到该时间值的秒数,以uint32存储;其时区须通过SDK的RequestConfig进行设置 |
point | 地理坐标、2D坐标,坐标值精度为double |
blob | 二进制的文件、图片、音频、视频等,实际长度受服务器max_rpc_msgsize (默认4M)设置的影响 |
list | 具体可设置为int32[]、int64[]、uint32[]、uint64[]、float[]、double[]、string[]、text[]、datetime[]和timestamp[],设置时必须用引号包裹 |
set | 具体可设置为set(int32)、set(int64)、set(uint32)、set(uint64)、set(float)、set(double)、set(string)、set(text)、set(datetime)和set(timestamp),设置时必须用引号包裹 |
[1]decimal存储的是准确的数字,因此需指定精度和标度。精度是所有数字的位数,包括整数与小数,不包括小数点;标度是小数点后的数字位数。
示例:为@course点创建属性title和description,为所有边创建属性time
create().node_property(@course, "title", string, "course name")
.node_property(@course, "description")
.edge_property(@*, "time", datetime)
示例:为@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>
需用引号包裹。
如果属性已存在:
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"})
删除属性
删除一个属性的同时会删除与其相关的索引、全文索引和引擎索引(LTE的属性)。
语法:
// 从当前图集中删除一个指定点schema的一个属性
drop().node_property(@<schema>.<property>)
// 从当前图集中删除所有点schema的一个属性(如有)
drop().node_property(@*.<property>)
// 从当前图集中删除一个指定边schema的一个属性
drop().edge_property(@<schema>.<property>)
// 从当前图集中删除所有边schema的一个属性(如有)
drop().edge_property(@*.<property>)
// 从当前图集中同时删除多个点、边schema的属性
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)
系统属性
_id
、_uuid
、_from
、_to
、_from_uuid
和_to_uuid
不允许删除。