安装与管理

安装

配置

在 QE 和 QD 中配置。在文件 postgresql.confshared_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 (必须,否则报错) 将删除依赖于该图的标签和数据。

注意事项:

  • 此函数不会返回任何结果。如果没有错误消息,则表示图已成功删除。
  • 必须将 cascade 选项设置为 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

图在 PostgreSQL 中的存储方式

使用 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 /* 必须 */);