概述
一个嬴图数据库可以容纳多个图集,其中每个图集包含图结构(schema和属性)、元数据(点和边)、索引、进程和作业等信息。“图集”和“图”两种表达经常互换使用。
显示图集
获取数据库中的图集信息:
// 显示所有图集
show().graph()
//显示全部图集及更多细节,如total_nodes,total_edges
show().graph().more()
// 显示指定图集
show().graph("myGraph")
// 显示指定图集及更多细节,如total_nodes,total_edges
show().graph("myGraph").more()
图集信息呈现在_graph
,_graph_shard_1
,_graph_shard_2
等表中:
- 表
_graph
包含数据库中的所有图集。 - 表
_graph_shard_<N>
包含存储在分片<N>
上的图集。
表中各字段提供了图集的基础信息:
字段 |
描述 |
---|---|
id |
图集的唯一ID |
name |
图集的唯一名称 |
description |
对图集的描述 |
status |
图集当前状态,包括NORMAL 、LOADING_SNAPSHOT 、CREATING 、DROPPING 和SCALING |
shards |
图数据分布的分片ID |
partition_by |
计算分片键哈希值的函数,对图数据分片至关重要 |
meta_version |
Meta服务器使用的版本号,用于和分片服务器同步图集上的DDL(数据定义语言)操作 |
total_nodes |
图集的点总数。仅当调用more() 方法时,在表_graph 上出现 |
total_edges |
图集的边总数。仅当调用more() 方法时,在表_graph 上出现 |
创建图集
使用单个语句create()
可创建一或多个图集。将三个方法graph().shards().partitionByHash()
串联使用来指定图集。
create()
.graph("<name>", "<desc?>").shards(<shardList>).partitionByHash(<hashFunc>, <shardKey?>)
.graph("<name>", "<desc?>").shards(<shardList>).partitionByHash(<hashFunc>, <shardKey?>)
...
方法 | 参数 | 描述 |
---|---|---|
graph() |
<graphName> |
图集的唯一名称。命名规范如下:
|
<graphDesc?> |
可选。对图集的描述 | |
shards() |
<shardList> |
分片ID的非空列表,表示图数据所在的分片位置 |
partitionByHash() |
<hashFunc> |
计算分片键哈希值的函数(Crc32 ,Crc64WE ,Crc64XZ 或CityHash64 ),对图数据分片至关重要。请注意,图集创建后不可修改该函数。了解更多信息,请参阅函数Crc和函数CityHash |
<shardKey?> |
可选。使用点属性作为分片键。目前仅支持使用_id |
创建名为myGraph
的图集,使用CityHash64
函数,根据点的_id
将数据分发至分片1
、分片2
和分片3
中:
create().graph("myGraph").shards([1,2,3]).partitionByHash(CityHash64, _id)
创建两个图集:
create()
.graph("myGraph_1").shards([1,2,3]).partitionByHash(CityHash64)
.graph("myGraph_2").shards([2]).partitionByHash(Crc32)
修改图集名称和描述
使用语句alter().graph().set()
可以修改图集的名称和描述。
修改图集myGraph
的名称和描述:
alter().graph("myGraph").set({name: "superGraph", description: "Graph used for transactions"})
修改图集myGraph
的名称:
alter().graph("myGraph").set({name: "superGraph"})
修改图集myGraph
的描述:
alter().graph("myGraph").set({description: "Graph used for transactions"})
删除图集myGraph
的描述:
alter().graph("myGraph").set({description: ""})
扩展或收缩图集
当分配给图集的分片过载时,或需要将数据分发至其他地理位置时,扩展(增加分片)就变得十分必要。相反,收缩(减少分片)能够释放未充分使用的分片,节约成本并简化管理。使用语句alter().graph().shards().partitionConfig()
可以重新缩放图集。
alter().graph("<graphName>").shards(<shardList>).partitionConfig({strategy: "<rsStrat>"})
方法 |
参数 |
描述 | 可选 |
---|---|---|---|
graph() |
<graphName> |
指定图集 | 否 |
shards() |
<shardList> |
待存储图数据的分片ID非空列表。该列表必须与当前分片列表不同,且与partitionConfig() 中的strategy 集合保持一致 |
否 |
partitionConfig() |
配置映射 | 指定扩缩容的strategy ,可根据以下方式进行设置:
balance |
是 |
假设图集myGraph
当前分布在分片1
和分片2
上。现在要将myGraph
从分片[1,2]
扩展到分片[1,4,5]
:
alter().graph('myGraph').shards([1,4,5]).partitionConfig({strategy: "balance"})
将myGraph
从分片[1,2]
收缩到分片[3]
:
alter().graph('myGraph').shards([3]).partitionConfig({strategy: "balance"})
将myGraph
从分片[1,2]
快速扩展到分片[1,2,4]
:
alter().graph('myGraph').shards([1,2,4]).partitionConfig({strategy: "quickly_expand"})
将myGraph
从分片[1,2]
快速收缩到[1]
:
alter().graph('myGraph').shards([1]).partitionConfig({strategy: "quickly_shrink"})
删除图集
使用单个语句drop()
即可删除一个或多个图集。串联使用graph()
方法指定每个图集。删除图集意味着将整个图集从数据库删除。
删除图集myGraph
:
drop().graph("myGraph")
删除两个图集:
drop().graph("myGraph_1").graph("myGraph_2")
默认情况下,无法删除有HDC投影的图集。可使用force()
方法绕过该限制,强制删除图集:
drop().graph("myGraph_1").graph("myGraph_2").force()
清空图集
使用语句truncate().graph()
可以清空图集。清空图集只删除图集中的点边数据,仍保留图集本身及其结构(schema和属性信息)。
串联使用nodes()
或edges()
方法即可指定清空点或边。但请注意,删除点时,与其相连的边也会同时删除.
// 清空图集myGraph(将删除所有点边数据)
truncate().graph("myGraph")
// 清空所有@user点(与其相连的边也会同时删除)
truncate().graph("myGraph").nodes(@user)
// 清空所有点(也会同时删除所有边)
truncate().graph("myGraph").nodes("*")
// 清空所有@link边
truncate().graph("myGraph").edges(@link)
// 清空所有边
truncate().graph("myGraph").edges("*")
压缩图集
使用语句compact().graph()
可以压缩图集,清理图集在服务器磁盘上的无效冗余数据,但不会改变其他有效数据。碎片整理操作以作业形式进行,稍后可使用show().job(<id?>)
验证碎片整理是否完成。
压缩图集myGraph
:
compact().graph("myGraph")
数据操作会产生冗余数据,如更新或删除数据后仍保留的历史记录。建议定期压缩图集,回收存储空间,提升查询效率。