本文介绍管理数据库中图和图类型的语句。
显示图
使用语句SHOW GRAPH
获取数据库中所有图的信息。
SHOW GRAPH
图信息展示在不同的表中:
_graph
包含数据库中的所有图。_graph_shard_<N>
包含存储在Shard<id>
上的图。
嬴图Manager中只显示
_graph
表。
表中包含以下字段:
字段 |
描述 |
---|---|
id |
图的唯一ID |
name |
图的唯一名称 |
total_nodes |
图中总点数;仅在_graph 表中出现 |
total_edges |
图中总边数;仅在_graph 表中出现 |
description |
对图的描述 |
status |
图的当前状态,包括NORMAL 、LOADING_SNAPSHOT 、CREATING 、DROPPING 和SCALING |
shards |
图数据分布的所有Shard的ID |
partition_by |
计算分片键哈希值的函数,对图数据分片至关重要 |
meta_version |
Meta服务器使用的版本号,用于和Shard服务器同步图上的DDL(数据定义语言)操作 |
创建图
语法
使用CREATE GRAPH
语句在数据库中创建新图。
<create graph statement> ::=
"CREATE GRAPH" [ "IF NOT EXISTS" ] <graph name> [ <graph type> ] [ <graph sharding> ] [ <graph description> ]
<graph type> ::=
<graph type specification> | <graph type reference> | <graph type like graph>
<graph type reference> ::=
[ < "::" | "TYPED" > ] <graph type name>
<graph type like graph> ::=
"LIKE" <existing graph name>
<graph sharding> ::=
"PARTITION BY" <hash function> "SHARDS" <shard id list>
<graph description> ::=
"COMMENT" <comment string>
创建图时,可指定以下部分:
部分 |
描述 |
---|---|
<graph name> |
图的唯一名称,查看命名规范 |
<graph type> |
可选;通过一种方法指定图类型:
|
<graph sharding> |
可选;图的分片策略,包括:
Crc32 哈希函数 |
<graph description> |
可选;图描述 |
无图类型
创建图g1
,仅指定图名称:
CREATE GRAPH g1
自定义图类型
创建图g1
并定义User
和Club
点Schema、Follows
和Joins
边Schema以及一个复合EDGE KEY
约束,使用哈希函数CityHash64
将图数据分发至ID为1
、2
和3
的Shard中:
CREATE GRAPH g1 {
NODE User ({username string NOT NULL encrypt("AES128") COMMENT "Username, cannot be null", gender string}),
NODE Club ({name string, since uint32}),
EDGE Follows ()-[{createdOn datetime}]->(),
EDGE Joins ()-[{memberNo uint64}]->()
}
EDGE KEY time timestamp, eID int64
PARTITION BY HASH(CityHash64) SHARDS [1,2,3]
COMMENT 'My first graph'
创建图g2
,定义的点Schema和边Schema都不包含任何属性,默认使用哈希函数Crc32
将数据分发至所有Shard中:
CREATE GRAPH g2 {
NODE User (),
NODE Club (),
EDGE Follows ()-[]->(),
EDGE Joins ()-[]->()
}
创建图g3
,图类型为空,使用默认哈希函数Crc32
将数据分发至ID为1
的Shard中:
CREATE GRAPH g3 {} SHARDS [1]
复用图类型
使用图类型gType
创建图g1
,默认使用哈希函数Crc32
将数据分发至所有Shard中:
CREATE GRAPH g1 gType
或
CREATE GRAPH g1 :: gType
或
CREATE GRAPH g1 TYPED gType
使用图类型gType
创建图g2
,使用哈希函数CityHash64
将图数据分发至ID为1
、2
和3
的Shard中:
CREATE GRAPH g2 gType
PARTITION BY HASH(CityHash64) SHARDS [1,2,3]
COMMENT 'This is the description'
复用别图的图类型
使用图trans
的图类型创建图g1
,默认使用哈希函数Crc32
将数据分发至所有Shard中:
CREATE GRAPH g1 LIKE trans
使用图trans
的图类型创建图g2
,使用哈希函数CityHash64
将图数据分发至ID为1
、2
和3
的Shard中:
CREATE GRAPH g2 LIKE trans
PARTITION BY HASH(CityHash64) SHARDS [1,2,3]
COMMENT 'This is the description'
使用IF NOT EXISTS
IF NOT EXISTS
子句用于防止在尝试创建已存在的图时出错,它允许安全地执行语句。
CREATE GRAPH IF NOT EXISTS g1
仅当不存在该名称的图时,才会创建图g1
。如果g1
已存在,则忽略该语句,不会引发报错。
重命名图
ALTER GRAPH
语句可用来为数据库中的图重命名。
将图amz
重命名为amazon
:
ALTER GRAPH amz RENAME TO amazon
修改图描述
ALTER GRAPH
语句可用来修改数据库中图的描述。
更新图amz
的描述:
ALTER GRAPH amz COMMENT 'Amazon dataset'
迁移图数据
由于图数据分布在多个Shard上,数据迁移有时是有必要的。比如,现有Shard过载时需迁移至更多Shard,需将数据分布到其他地理区域。将数据迁移至更少的Shard则可以释放未充分利用的资源,降低消耗,简化数据管理。使用ALTER GRAPH
语句可迁移图数据。
假设图myGraph
当前分布在Shard [1,2]
上,将其迁移至分片[1,4,5]
:
ALTER GRAPH myGraph ON SHARDS [1,4,5]
删除图
使用DROP GRAPH
语句从数据库中删除图。
删除图g1
:
DROP GRAPH g1
IF EXISTS
子句用于防止在尝试删除不存在的图时出错,它允许安全地执行语句。
DROP GRAPH IF EXISTS g1
仅当存在该名称的图时,才会删除图g1
。如果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、每个Schema关联的属性以及约束。
显示图类型
使用语句SHOW GRAPH TYPE
获取数据库中所有图类型的信息。
SHOW GRAPH TYPE
该语句返回_graphType
表,包含以下字段:
字段 |
描述 |
---|---|
name |
图类型的唯一名称 |
gql |
创建图类型时使用的GQL语句 |
创建图类型
使用CREATE GRAPH TYPE
语句在数据库中创建新的图类型。
<create graph type statement> ::=
"CREATE GRAPH TYPE" [ "IF NOT EXISTS" ] <graph type name> <graph type specification>
<graph type specification> ::=
"{" [ <element schema> [ { "," <element schema> }... ] ] "}" [ <edge key constarint> ]
<element schema> ::=
<node schema> | <edge schema>
<node schema> ::=
"NODE" <schema name> "(" [ <property types> ] ")"
<edge schema> ::=
"EDGE" <schema name> "()-[" [ <property types> ] "]->()"
<property types> ::=
"{" <property type> [ { "," <property type> }... ] "}"
<property type> ::=
<property name> <property value type> [ <constraint name> ] [ <encryption> ] [ <property description> ]
<property description> ::=
"COMMENT" <comment string>
<edge key constraint> ::=
"EDEG KEY" <property name> <property value type> [ { "," <property name> <property value type> }... ]
创建图类型时,可指定以下部分:
部分 |
描述 |
---|---|
<graph type name> |
图类型的唯一名称,查看命名规范. |
<graph type specification> |
包含<element schema> (<node schema> 或<edge schema> )列表和<edge key constraint> 每个 <element schema> 包含:
<edge key constraint> :可选;指定作为所有边唯一标识符的属性;系统会自动为所有边Schema创建这些属性;如果某个边Schema定义了同名属性,然而与EDGE KEY 中指定的值类型不一致,则会报错;了解更多关于EDGE KEY约束 |
注意:一个名为
<schema name>
的点、边Schema的标签集合为:<schema name>
。
创建图类型gType
并定义User
和Club
点Schema、Follows
和Joins
边Schema以及一个复合EDGE KEY
约束:
CREATE GRAPH TYPE gType {
NODE User ({username string NOT NULL encrypt("AES128") COMMENT "Username, cannot be null", gender string}),
NODE Club ({name string, since uint32}),
EDGE Follows ()-[{createdOn datetime}]->(),
EDGE Joins ()-[{memberNo uint64}]->()
} EDGE KEY time timestamp, eID int64
以下图类型创建会失败,因为Follows
边Schema包含的属性eID
值类型与EDGE KEY
里定义的不一致(string
和int64
):
CREATE GRAPH TYPE gType {
NODE User ({username string NOT NULL encrypt("AES128") COMMENT "Username, cannot be null", gender string}),
NODE Club ({name string, since uint32}),
EDGE Follows ()-[{createdOn datetime, eID string}]->(),
EDGE Joins ()-[{memberNo uint64}]->()
} EDGE KEY time timestamp, eID int64
创建一个空的图类型gType_empty
:
CREATE GRAPH TYPE gType_empty {}
删除图类型
使用DROP GRAPH TYPE
语句从数据库中删除图类型。
删除图类型gType
:
DROP GRAPH TYPE gType
IF EXISTS
子句用于防止在尝试删除不存在的图类型时出错,它允许安全地执行语句。
DROP GRAPH TYPE IF EXISTS gType
仅当存在该名称的图类型时,才会删除图类型gType
。如果gType
不存在,则忽略该语句,不会引发报错。