概述
嬴图数据库的一个实例包含一或多个图(也称图集),每个图代表一个由相互连接的点、边组成的数据集或域。
本文介绍如何在数据库中管理图和图类型。
显示图
获取数据库中所有图的信息:
SHOW GRAPH
语句返回以下表格:
_graph
表包含数据库中的所有图。_graph_shard_<id>
表包含存储在Shard<id>
上的图。
嬴图Manager仅展示
_graph
表。
各表包含以下字段:
字段 |
描述 |
---|---|
id |
图的唯一ID |
name |
图的唯一名称 |
total_nodes |
图中总点数 |
total_edges |
图中总边数 |
description |
图的注释 |
status |
图的当前状态,包括NORMAL 、LOADING_SNAPSHOT 、CREATING 、DROPPING 和SCALING |
shards |
图数据分布所在Shard的ID |
partition_by |
计算分片键哈希值的函数,对图数据分片至关重要 |
schema_free |
图是否为开放图 |
meta_version |
Meta服务器使用的版本号,用于和Shard服务器同步图上的DDL(数据定义语言)操作 |
创建图
嬴图数据库可创建两类图:
1. 开放图。开放图无需在插入数据前显式定义Schema。您可直接向图中插入点和边,对应的Schema和属性会自动创建。如何创建开放图
2. 类型图。图类型定义了所有允许的点、边Schema(类型),由以下部分构成:
- 点Schema:一个点Schema由Schema名称(也用作点标签)和一组属性组成。每个图包含一个内置的点Schema,名为
default
。 - 边Schema:一个边Schema由Schema名称(也用作边标签)和一组属性组成。每个图包含一个内置的边Schema,名为
default
。 - 属性:属性与点或边Schema关联,由属性名称和属性值类型定义。
- 约束:应用在属性上的额外规则,用于确保数据的准确性、一致性和完整性。如何在创建图时定义约束
插入到图中的所有数据必须符合其图类型,即不能添加Schema或属性未定义的点或边。虽然图类型可以更改和调整,但它为数据插入设定了严格的框架。如何创建类型图
以上两种图建模方式既灵活又不失控制力,支持从早期数据探索到严格要求数据完整性的生产级应用工作流。
图数据物理存储在数据库部署所在Shard服务器上。您可根据部署情况,运行一或多个Shard服务器。对于任意图,均可指定一或多个Shard服务器以分布式方式存储点和边。如何配置图分片
创建开放图
创建开放图g1
:
CREATE GRAPH g1 ANY
使用关键词ANY
来识别开放图。
创建类型图
图类型为空
创建图类型为空的图g2
:
CREATE GRAPH g2
虽然g2
的图类型为空,但它不是开放图。在插入任何数据前,必须向图中添加点或边Schema。
自定义图类型
创建一个带图类型规范的图g3
,其定义如下:
- 点Schema为
User
,包含属性name
(STRING
类型)和age
(UINT32
类型) - 点Schema
Club
,没有属性 - 边Schema
Follows
,包含属性createdOn
(LOCAL DATETIME
类型) - 边Schema
Joins
,没有属性
CREATE GRAPH g3 {
NODE User ({name STRING, age UINT32}),
NODE Club (),
EDGE Follows ()-[{createdOn LOCAL DATETIME}]->(),
EDGE Joins ()-[]->()
}
预定义图类型
使用预定义图类型gType
(详见如何创建图类型)创建图g4
:
CREATE GRAPH g4 gType
或
CREATE GRAPH g4 :: gType
或
CREATE GRAPH g4 TYPED gType
使用关键词TYPED
、操作符::
,或省略不用以指定所使用的图类型。
其他图的图类型
复用已有图trans
的图类型创建图g5
:
CREATE GRAPH g5 LIKE trans
使用关键词LIKE
指定要复制其图类型的图。
配置图分片
您可显式定义图在数据库中Shard服务器之间的分布方式,包括:
- 哈希函数:哈希函数(
Crc32
、Crc64WE
、Crc64XZ
或CityHash64
)计算分片键(点_id
)的哈希值,对图数据分片至关重要。了解更多信息,请参阅Crc和CityHash。 - 分片ID列表:存储图数据的Shard服务器的ID列表。
默认情况下,图数据使用Crc32
分布到所有分片。
创建图g6
,使用哈希函数CityHash64
将图数据分布到分片[1,2,3]
:
CREATE GRAPH g6 {
NODE User ({name STRING, age UINT32}),
NODE Club (),
EDGE Follows ()-[{createdOn LOCAL DATETIME}]->(),
EDGE Joins ()-[]->()
}
PARTITION BY HASH(CityHash64) SHARDS [1,2,3]
使用关键词PARTITION BY
指定哈希函数,关键词SHARDS
指定分片ID列表。它们均可单独使用。
图创建完成后,可能需要将图数据迁移到不同的分片。详情参见迁移图数据。
定义约束
创建图时,可以在图类型中包含约束,以确保插入的数据具备完整性和一致性。
创建图g7
,包含如下约束:
- 对
User
点的name
属性应用NOT NULL
约束,以确保每个User
点的name
都必须有非NULL
值。 - 对所有边Schema应用
EDGE KEY
约束。指定属性eID
(INT64
类型)会自动创建在所有边Schema上,且所有eID
的值必须唯一且非NULL
。
CREATE GRAPH g7 {
NODE User ({name STRING NOT NULL, age UINT32}),
NODE Club (),
EDGE Follows ()-[{createdOn LOCAL DATETIME}]->(),
EDGE Joins ()-[]->()
}
EDGE KEY eID INT64
NOT NULL
约束可用于任意单个属性,而EDGE KEY
约束则全局作用于图中的所有边。也可通过指定多个属性创建复合EDGE KEY
约束:
CREATE GRAPH g7 {
NODE User ({name STRING NOT NULL, age UINT32}),
NODE Club (),
EDGE Follows ()-[{createdOn LOCAL DATETIME}]->(),
EDGE Joins ()-[]->()
}
EDGE KEY eID INT64, weight FLOAT
本例中,属性eID
(INT64
类型)和weight
(FLOAT
类型)自动创建在所有边Schema上;eID
和weight
均不可包含NULL
值,eID
和weight
的组合不能有重复值。
有关约束的详细说明和图创建后管理约束的操作,请详见本文。
加密属性
使用以下支持的加密方法对属性值加密:AES128
、AES256
、RSA
和ECC
。
创建图g8
,对User
点的name
属性加密:
CREATE GRAPH g8 {
NODE User ({name STRING encrypt("AES128"), age UINT32}),
NODE Club (),
EDGE Follows ()-[{createdOn LOCAL DATETIME}]->(),
EDGE Joins ()-[]->()
}
使用IF NOT EXISTS
使用IF NOT EXISTS
子句可避免在尝试创建已存在的图时报错,从而安全执行语句。
CREATE GRAPH IF NOT EXISTS g1
仅当不存在同名图时,才会创建图g1
。如果g1
已存在,该语句将被忽略且不会报错。
添加注释
可以为图和属性添加注释,以提高可读性并便于理解。
创建图g9
,为图和Follows
边的createdOn
属性添加注释:
CREATE GRAPH g9 {
NODE User ({name STRING, age UINT32}),
NODE Club (),
EDGE Follows ()-[{createdOn LOCAL DATETIME COMMENT "When the edge is established"}]->(),
EDGE Joins ()-[]->()
}
COMMENT 'My social graph'
完整示例
创建图g10
并指定图类型:
CREATE GRAPH IF NOT EXIST g10 {
NODE User ({name STRING NOT NULL encrypt("AES128") COMMENT "Username, cannot be null", age UINT32}),
NODE Club (),
EDGE Follows ()-[{createdOn LOCAL DATETIME}]->(),
EDGE Joins ()-[]->()
}
EDGE KEY eID INT64
PARTITION BY HASH(CityHash64) SHARDS [1,2,3]
COMMENT 'My social graph'
修改图名称和注释
使用ALTER GRAPH
语句可以修改数据库中图的名称和注释。
将图amz
重命名为amazon
:
ALTER GRAPH amz RENAME TO amazon
更新图amz
的注释:
ALTER GRAPH amz COMMENT 'Amazon dataset'
可以使用单个ALTER GRAPH
语句,同时修改图的名称和注释:
ALTER GRAPH amz RENAME TO amazon COMMENT 'Amazon dataset'
迁移图数据
由于图数据分布在多个Shard上,数据迁移有时是有必要的。比如,现有Shard过载时需迁移至更多Shard,或需要将数据分布到其他地理区域。将数据迁移至更少的Shard则可以释放未充分利用的资源,降低消耗,简化数据管理。使用ALTER GRAPH
语句迁移图数据。
假设图myGraph
当前分布在Shard [1,2]
上,将其迁移至Shard [1,4,5]
:
ALTER GRAPH myGraph ON SHARDS [1,4,5]
默认的迁移策略是balance
,即将所有图数据重新平均分配在新Shard中。除此之外,也可指定以下一种策略:
quickly_expand
:将部分数据从当前Shard快速迁移至新Shard。新Shard列表必须包含当前所有Shardquickly_shrink
:将被移除的Shard上的数据快速迁移至剩余Shard。新Shard列表必须是当前Shard列表的子列表
将图myGraph
从Shard [1,2]
快速迁移至Shard [1,2,4]
:
ALTER GRAPH myGraph ON SHARDS [1,2,4] PARTITION CONFIG {strategy: "quickly_expand"}
将图myGraph
从Shard [1,2]
快速迁移至Shard [1]
:
ALTER GRAPH myGraph ON SHARDS [1] PARTITION CONFIG {strategy: "quickly_shrink"}
删除图
使用DROP GRAPH
语句从数据库中删除图。
删除图g1
:
DROP GRAPH g1
使用IF EXISTS
子句可避免在尝试删除不存在的图时报错,从而安全执行语句。
DROP GRAPH IF EXISTS g1
仅当图名称存在时,才会删除图g1
。如果g1
不存在,则忽略该语句,不会引发报错。
默认情况下,无法删除已创建HDC图的图。可使用关键词FORCE
绕过该限制:
FORCE DROP GRAPH g1
清空图
使用TRUNCATE
语句清空图。此操作只删除图中的点边数据,但保留图本身及其定义的图类型。
您可选择清空整个图、所有点、所有边或指定Schema的点或边。请注意,清空点时,与其相连的边也会同时被清空。
清空图myGraph
:
TRUNCATE myGraph
清空myGraph
中的所有点,请注意所有边也会被清空:
TRUNCATE NODE * ON myGraph
清空myGraph
中的所有User
点,请注意所有与User
点相连的边也会被清空:
TRUNCATE NODE User ON myGraph
清空myGraph
中的所有边:
TRUNCATE EDGE * ON myGraph
清空myGraph
中的所有Follows
边:
TRUNCATE EDGE Follows ON myGraph
清理图
使用COMPACT GRAPH
语句清理图。此操作清理服务器磁盘上无效和冗余的图数据,但不会改变其他有效数据。图清理操作以作业形式进行,稍后可使用SHOW JOB <id?>
验证操作是否完成。
清理图myGraph
:
COMPACT GRAPH myGraph
冗余数据可能由一些数据操作产生,如更新或删除数据后仍保留的历史记录。建议定期清理图,回收存储空间,提升查询效率。
管理图类型
图类型通过定义允许的点Schema、边Schema及其关联属性和约束,为图设定结构规则。可以使用GQL在数据库中定义和存储图类型,以便在创建新图时复用。
显示图类型
获取数据库中所有图类型:
SHOW GRAPH TYPE
语句返回_graphType
表,包含以下字段:
字段 |
描述 |
---|---|
name |
图类型的唯一名称 |
gql |
创建图类型时使用的GQL语句 |
创建图类型
使用CREATE GRAPH TYPE
语句在数据库中创建新的图类型。
创建图类型gType
:
CREATE GRAPH TYPE gType {
NODE User ({name STRING NOT NULL encrypt("AES128") COMMENT "Username, cannot be null", age UINT32}),
NODE Club (),
EDGE Follows ()-[{createdOn LOCAL DATETIME}]->(),
EDGE Joins ()-[]->()
}
EDGE KEY eID INT64
删除图类型
使用DROP GRAPH TYPE
语句从数据库中删除图类型。
删除图类型gType
:
DROP GRAPH TYPE gType
使用IF EXISTS
子句可避免在尝试删除不存在的图类型时报错,从而安全执行语句。
DROP GRAPH TYPE IF EXISTS gType
仅当存在该名称的图类型时,才会删除图类型gType
。如果gType
不存在,则忽略该语句,不会引发报错。
命名规范
图
数据库中所有图名称必须唯一。图名称需满足:
- 包含2~127个字符
- 以字母开头
- 允许的字符:字母(A-Z,a-z),数字(0-9),下划线(
_
)
图类型
数据库中所有图类型名称必须唯一。图类型名称需满足:
- 包含2~64个字符
- 以字母开头
- 允许的字符:字母(A-Z,a-z),数字(0-9),下划线(
_
)
点/边Schema
每个点/边Schema的名称需满足:
- 包含2~127个字符
- 不能以下划线(
_
)或波浪号(~
)开头 - 不能包含反引号(
`
) - 不能使用系统属性名或保留词
图中点Schema不能重名,边Schema不能重名,但点Schema可以和边Schema重名。
属性
每个属性名需满足:
- 包含2~127个字符
- 不能以下划线(
_
)或波浪号(~
)开头 - 不能包含反引号(
`
) - 不能使用系统属性名或保留词
同一个点/边Schema下,属性名需唯一。
约束
每个约束的名称需满足:
- 包含2~64个字符
- 以字母开头
- 允许的字符:字母(A-Z,a-z),数字(0-9),下划线(
_
)
图中约束不能重名。