模式 schema 代表了数据的某种结构定义,更加直观地将真实世界 100% 还原到图集之上,从而清晰方便地管理图数据。在 Ultipa 图系统中,一个 schema 代表着真实世界中的一类实体(点),如:自然人、银行卡、账户等;或者一类行为关系(边),如:关注、转账、持有等。
每个图集在创建后会自带一个名为 default 的 点schema 和一个名为 default 的 边schema(均不可删除);每个图集中可以创建多个 点schema 和 边schema。
UQL 中出现 @ 符号时通常代表与 schema 有关的操作,本节中的
@<schema>
表示对图模型中的 schema 进行过滤,不同于在过滤器中使用@<schema>
对元数据的 schema 进行过滤,请与《过滤器|操作符》-《条件判断符》-《Schemna 判断》中关于符号 @ 的使用加以区分。
命名规则
Schema 由开发者自定义名称,一个图集中的 点schema 不能互相重名,边schema 也不能互相重名,但一个 点schema 可以和一个 边schema 重名。
- 2 ~ 64 个字符
- 不能以波浪号 '~' 开头
- 不能包含反单引号 '`'
- 不能与《背景知识》中列出的系统属性、系统表名、系统别名(保留字)重复
- (schema名中含有除数字、字母、下划线之外的字符时,在 UQL 语句中使用时需要用反引号(`)包裹)
查看 Schema
返回的表名:_nodeSchema
、_edgeSchema
返回的表头:name
|description
|properties
|totalNodes
或 totalEdges
(schema 的名称、描述、属性列表、点数量 或 边数量)
语法:
// 查看当前图集中所有 schema 信息(分为点、边两个表)
show().schema()
// 查看当前图集中所有 点schema 信息
show().node_schema()
// 查看当前图集中所有 边schema 信息
show().edge_schema()
// 查看当前图集中某个 点schema 信息
show().node_schema(@<schema>)
// 查看当前图集中某个 边schema 信息
show().edge_schema(@<schema>)
创建 Schema
语法:
// 在当前图集中创建一个 点schema
create().node_schema("<name>", "<desc?>")
// 在当前图集中创建一个 边schema
create().edge_schema("<name>", "<desc?>")
// 混合以上两种方法同时创建多个 点/边schema
create()
.node_schema("<name>", "<desc?>")
.edge_schema("<name>", "<desc?>")
...
示例:用一条 UQL 创建 点schema “银行卡”和“账户”
create().node_schema("card", "Bank_Card").node_schema("account", "Bank_Account")
示例:用一条 UQL 创建 边schema “持有”和“转账”
create().edge_schema("own").edge_schema("transaction")
示例:用一条 UQL 创建 点schema “银行卡”及 边schema “持有”
create().node_schema("card", "Bank_Card").edge_schema("own")
修改 Schema(名称、描述)
语法:
// 修改当前图集中的某个 点schema 的名称、描述
alter().node_schema(@<schema>)
.set({name: "<new_name?>", description: "<new_desc?>"})
// 修改当前图集中的某个 边schema 的名称、描述
alter().edge_schema(@<schema>)
.set({name: "<new_name?>", description: "<new_desc?>"})
删除 Schema
除默认的点、边 schema default 不允许删除之外,当前图集中的其它 schema 均可以删除。删除一个 schema 将同时删除其所有属性以及元数据。
语法:
// 从当前图集中删除某个 点schema
drop().node_schema(@<schema>)
// 从当前图集中删除某个 边schema
drop().edge_schema(@<schema>)
// 混合以上两种方法同时删除多个 点/边schema
drop()
.node_schema(@<schema>)
.edge_schema(@<schema>)
...