关于 YMatrix
部署数据库
使用数据库
管理集群
最佳实践
高级功能
高级查询
联邦查询
Grafana 监控
备份恢复
灾难恢复
图数据库
管理手册
性能调优
故障诊断
工具指南
系统配置参数
SQL 参考
在 QE 和 QD 中配置。在文件 postgresql.conf 的 shared_preload_libraries 参数中添加age
shared_preload_libraries = 'xxx,age'
也可使用以下语句进行配置。
gpconfig -c shared_preload_libraries -v "xxx,age"
create extension age;
每次连接 AGE 时,需要加载 AGE 扩展:
LOAD 'age';
将 ag_catalog 添加到 search_path 以简化查询:
SET search_path = ag_catalog, "$user", public;
图由一组顶点(Vertex)和边(Edge)组成,其中每个顶点和边都拥有一个属性(Property)映射。顶点是图的基本对象,可以独立于图中的其他所有元素而存在。边在两个顶点之间创建无相/有向连接。
使用位于 ag_catalog 命名空间中的 create_graph 函数来创建图。
create_graph()语法:create_graph(graph_name);
返回值:
void
参数:
| 名称 | 描述 |
|---|---|
| graph_name | 要创建的图的名称 |
注意事项:
示例:
SELECT * FROM ag_catalog.create_graph('graph_name');
NOTICE: graph "graph_name" has been created
create_graph
--------------
(1 row)
使用位于 ag_catalog 命名空间中的 drop_graph 函数来删除图。
drop_graph()语法:drop_graph(graph_name, cascade);
返回值:
void
参数:
| 名称 | 描述 |
|---|---|
| graph_name | 要删除的图的名称 |
| cascade | 布尔值(默认false),设置为 true (必须,否则报错) 将删除依赖于该图的标签和数据。 |
注意事项:
示例:
SELECT * FROM ag_catalog.drop_graph('graph_name', true);
NOTICE: drop cascades to 2 other objects
DETAIL: drop cascades to table graph_name._ag_label_vertex
drop cascades to table graph_name._ag_label_edge
NOTICE: graph "graph_name" has been dropped
drop_graph
------------
(1 row)
SELECT drop_graph('graph');
ERROR: drop_graph second argument must be TRUE
SELECT drop_graph('graph',false);
ERROR: drop_graph second argument must be TRUE
使用 AGE 创建图时,会为每个图生成一个 graph_name 命名空间。 创建的图的名称和命名空间可以在 ag_catalog 命名空间的 ag_graph 表中查看:
SELECT create_graph('new_graph');
NOTICE: graph "new_graph" has been created
create_graph
--------------
(1 row)
SELECT * FROM ag_catalog.ag_graph;
name | namespace
-----------+-----------
new_graph | new_graph
(1 row)
创建图后,会在图的命名空间下自动创建两个表来存储顶点和边:_ag_label_vertex 和 _ag_label_edge。这两个表将作为任何新顶点或边标签的父表。以下查询展示了如何检索数据库中所有图的边和顶点标签。
-- 创建新顶点标签之前
SELECT * FROM ag_catalog.ag_label;
name | graph | id | kind | relation | seq_name
------------------+-------+----+------+----------------------------+-------------------------
_ag_label_vertex | 68484 | 1 | v | new_graph._ag_label_vertex | _ag_label_vertex_id_seq
_ag_label_edge | 68484 | 2 | e | new_graph._ag_label_edge | _ag_label_edge_id_seq
(2 rows)
-- 创建新顶点标签
SELECT create_vlabel('new_graph', 'Person');
NOTICE: VLabel "Person" has been created
create_vlabel
---------------
(1 row)
-- 创建新顶点标签之后
SELECT * FROM ag_catalog.ag_label;
name | graph | id | kind | relation | seq_name
------------------+-------+----+------+----------------------------+-------------------------
_ag_label_vertex | 68484 | 1 | v | new_graph._ag_label_vertex | _ag_label_vertex_id_seq
_ag_label_edge | 68484 | 2 | e | new_graph._ag_label_edge | _ag_label_edge_id_seq
Person | 68484 | 3 | v | new_graph."Person" | Person_id_seq
(3 rows)
当使用 create_vlabel() 函数创建顶点标签时,会在 new_graph 的命名空间下生成一个新表:new_graph."<label>"。
create_elabel() 函数创建边标签时也是同样的机制。
使用 Cypher 创建顶点和边时会自动创建这些表。
-- 创建两个顶点和一条边
SELECT * FROM cypher('new_graph', $$
CREATE (:Person {name: 'Daedalus'})-[:FATHER_OF]->(:Person {name: 'Icarus'})
$$) AS (a agtype);
a
---
(0 rows)
-- 显示新创建的表
SELECT * FROM ag_catalog.ag_label;
name | graph | id | kind | relation | seq_name
------------------+-------+----+------+----------------------------+-------------------------
_ag_label_vertex | 68484 | 1 | v | new_graph._ag_label_vertex | _ag_label_vertex_id_seq
_ag_label_edge | 68484 | 2 | e | new_graph._ag_label_edge | _ag_label_edge_id_seq
Person | 68484 | 3 | v | new_graph."Person" | Person_id_seq
FATHER_OF | 68484 | 4 | e | new_graph."FATHER_OF" | FATHER_OF_id_seq
(4 rows)
注意!
不要在为图保留的命名空间中执行 DML 或 DDL 命令。
注意!
YMatrix AGE 中标签表的索引约束限制:
AGE 的标签表使用DISTRIBUTED RANDOMLY分布策略,因此不支持UNIQUE索引和PRIMARY KEY约束。这意味着无法通过唯一索引防止图数据中的重复数据。
CREATE UNIQUE INDEX idx ON graph_name."TestIdx"(properties);
-- ERROR: UNIQUE and DISTRIBUTED RANDOMLY are incompatible
ALTER TABLE graph_name."TestIdx" ADD PRIMARY KEY (id);
-- ERROR: PRIMARY KEY and DISTRIBUTED RANDOMLY are incompatible
如需防止重复数据,需要在应用层或通过 Cypher 查询逻辑(如
MERGE)来保证。
在不需要某些标签时,可以使用 drop_label() 进行删除。
SELECT drop_label(graph_name, label_name, true /* 必须 */);