一个嬴图数据库实例可包含多个图(也称图集),每个图代表一个由相互连接的点、边组成的数据集。
显示图
获取数据库中的图:
SHOW GRAPH
也支持复数形式SHOW GRAPHS。
每个图包含以下信息:
字段 |
描述 |
|---|---|
id |
图的唯一ID |
name |
图的唯一名称 |
total_nodes |
图中点的总数 |
total_edges |
图中边的总数 |
description |
图的注释 |
status |
图的状态,包括NORMAL、LOADING_SNAPSHOT、CREATING、DROPPING和SCALING |
shards |
图数据分布的所有Shard服务器ID |
partition_by |
计算分片键哈希值的函数 |
schema_free |
是否为开放图(Schema-free) |
meta_version |
Meta服务器使用的版本号,用于和Shard服务器同步图上的DDL(数据定义语言)操作 |
创建图
嬴图支持两种类型的图:类型图(Typed Graph)和开放图(Open Graph)。这一设计同时兼顾灵活性与可控性,适用于从敏捷探索到需要严格数据完整性的生产级应用。
类型图
类型图受其图类型约束,它为数据写入提供严格的结构规范,即插入点、边的Schema或属性若未预先定义,则无法插入。图类型确保高度的数据完整性与一致性,图类型在图创建之后仍可以修改。
在类型图中:
- 每个点或边属于且仅属于一个Schema。
- 每个Schema关联一组属性,每个属性有明确的值类型。
创建一个带有图类型定义(包含点、边Schema与属性)的图g1:
CREATE GRAPH g1 {
NODE User ({name STRING, age UINT32}),
NODE Club ({name STRING}),
EDGE Follows ()-[{createdOn LOCAL DATETIME}]->(),
EDGE Joins ()-[]->()
}
开放图
开放图是Schema-free的,在写入数据前无需预先定义数据结构。你可以直接向图中插入点和边,它们的标签和属性会在写入时自动创建。开放图具有最大的灵活性,适用于早期的数据探索。
在开放图中:
- 每个点或边拥有零个、一个或多个标签。
- 每个点或边有独立的属性集合。
创建一个开放图g2:
CREATE GRAPH g2 ANY
关键词ANY标明这是一个开放图。
使用IF NOT EXISTS
使用IF NOT EXISTS子句可避免尝试创建已存在的图时报错,从而安全执行语句。
CREATE GRAPH IF NOT EXISTS g1 {
NODE User ({name STRING, age UINT32}),
NODE Club ({name STRING}),
EDGE Follows ()-[{createdOn LOCAL DATETIME}]->(),
EDGE Joins ()-[]->()
}
只有不存在同名图时,才会创建图g1。如果g1已存在,该语句将被忽略且不会报错。
添加注释
可以为图添加注释,便于理解。
创建图g3,并为其添加注释:
CREATE GRAPH g3 ANY COMMENT 'Social graph'
图分片和存储
图数据物理存储在数据库部署的Shard服务器上。根据需要,可部署一个或多个Shard服务器。
创建图时,可指定将图数据存储在一个Shard或分布式地存储在多个Shard中。这种分片架构支持数据量的水平扩展,同时保持高性能的查询能力。
CREATE GRAPH g4 {
NODE User ({name STRING, age UINT32}),
NODE Club ({name STRING}),
EDGE Follows ()-[{createdOn LOCAL DATETIME}]->(),
EDGE Joins ()-[]->()
}
PARTITION BY HASH(CityHash64) SHARDS [1,2,3]
修改图
你可以修改图名称和注释。
将图amz重命名为amazon:
ALTER GRAPH amz RENAME TO amazon
修改图amz的注释:
ALTER GRAPH amz COMMENT 'Amazon dataset'
同时修改图名称和注释:
ALTER GRAPH amz RENAME TO amazon COMMENT 'Amazon dataset'
删除图
删除图g1:
DROP GRAPH g1
使用IF EXISTS子句可避免尝试删除不存在的图时报错,从而安全执行语句。
DROP GRAPH IF EXISTS g1
只有当图g1存在时,才会将其删除。如果g1不存在,该语句将被忽略且不会报错。
默认情况下,无法删除有关联的HDC图的图。使用关键词FORCE可绕过该限制:
FORCE DROP GRAPH g1
清空图
清空操作删除图中的点、边数据,但保留图本身及其定义的图类型(类型图)或标签(开放图)。
你可以清空整个图、所有点、所有边或指定Schema的点或边。请注意,清空点时,与其相连的边也会同时被清空。
清空图myGraph:
TRUNCATE myGraph
清空myGraph中所有点,请注意所有边也会被清空:
TRUNCATE NODE * ON myGraph
清空myGraph中所有边:
TRUNCATE EDGE * ON myGraph
在类型图中,你可以选择清空一个指定Schema的点或边。例如,清空myGraph中所有User点,请注意所有与User点相连的边也会被清空:
TRUNCATE NODE User ON myGraph
清空myGraph中所有Follows边:
TRUNCATE EDGE Follows ON myGraph
清理图
清理操作删除服务器磁盘上无效和冗余的图数据,但不会影响有效数据。图清理操作以作业形式进行,稍后可使用SHOW JOB <id?>验证操作是否完成。
清理图myGraph:
COMPACT GRAPH myGraph
冗余数据可能由一些数据操作产生,如更新或删除数据后仍保留的历史记录。建议定期清理图,回收存储空间,提升查询效率。
命名规范
图
图名称必须唯一。图名称需满足:
- 包含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下,属性名需唯一。