PolarDB PostgreSQL版以插件形式实现图数据库,使用Cypher语言对数据库中的图进行查询。本文介绍图数据库的基本概念,及图数据库的使用方法。
概念介绍
- 图(Graph):图由节点(结点或顶点)和边(连接节点的关系)组成。图是一种非线性的数据结构,可用于表示实体及其之间的关系。 
- 节点(Node):节点是图中的基本单位,表示实体,例如用户、产品、地点等。每个节点可以包含属性(即数据字段),用于描述节点的特征或行为。 
- 边(Edge):边表示节点之间的关系或连接。每条边可以是有向的(从一个节点指向另一个节点)或无向的(没有特定方向)。边也可以有属性,用于描述关系的特征(如关系类型、权重等)。 
- 属性(Property):属性是节点或边的附加信息,例如节点的名称、创建时间、边的权重等。通过属性,可以更细致地描述节点和边。 
- 图查询语言:图查询语言是用于与图数据库进行交互的一种专门语言,允许通过编写查询来检索、分析和操作图数据。本插件使用Cypher作为图查询语言,同时支持与PostgreSQL原有的SQL、PL/PGSQL等语言组合进行查询。常用的查询语法包括 - MATCH,- WITH,- RETURN,- ORDER BY,- SKIP,- LIMIT,- CREATE,- DELETE,- SET,- REMOVE和- MERGE等。
前提条件
支持的PolarDB PostgreSQL版的版本如下:
- PostgreSQL 16(内核小版本2.0.16.8.3.0及以上) 
- PostgreSQL 15(内核小版本2.0.15.12.4.0及以上) 
- PostgreSQL 14(内核小版本2.0.14.12.24.0及以上) 
使用方法
安装插件
请使用高权限账号执行如下语句,创建高权限账号请参考创建数据库账号。
CREATE EXTENSION age;安装插件之后,将其加入需要使用此插件的数据库或用户的搜索路径和预加载库中:
使用数据管理 DMS(Data Management)客户端设置search_path时,可能会存在兼容性问题,您可使用PolarDB-Tools执行相关语句。
- 会话级加载插件: - SELECT * FROM ag_catalog.get_cypher_keywords() limit 0;- 同时,可以将 - ag_catalog添加到- search_path以简化查询:- SET search_path = ag_catalog, "$user", public;
- 永久加载插件: - ALTER DATABASE <dbname> SET search_path = public,ag_catalog; ALTER USER <username> SET search_path = public,ag_catalog; ALTER DATABASE <dbname> SET session_preload_libraries TO 'age'; ALTER USER <username> SET session_preload_libraries TO 'age';说明- 执行上述语句后,需要重新连接集群后插件加载生效。 
如普通账号需使用此插件功能,可使用以下方式:
- 为普通账号授予 - USAGE权限。- GRANT USAGE ON SCHEMA ag_catalog TO <username>;
- 如普通账号只需创建图,则可授予CREATE权限。 - GRANT CREATE ON DATABASE <dbname> TO <username>;
创建图
使用位于ag_catalog命名空间中的create_graph函数创建图。
SELECT create_graph('graph_name');创建顶点和边
- 使用 - CREATE子句创建一个具有标签和属性的单个顶点。- SELECT * FROM cypher('graph_name', $$ CREATE (:label {property:"Node A"}) $$) as (v agtype);
- SELECT * FROM cypher('graph_name', $$ CREATE (:label {property:"Node B"}) $$) as (v agtype);
 
- 在两个节点之间创建一条边并设置其属性。 - SELECT * FROM cypher('graph_name', $$ MATCH (a:label), (b:label) WHERE a.property = 'Node A' AND b.property = 'Node B' CREATE (a)-[e:RELTYPE {property:a.property + '<->' + b.property}]->(b) RETURN e $$) as (e agtype);
查询节点
查询连接的节点。
SELECT * from cypher('graph_name', $$
        MATCH (V)-[R]-(V2)
        RETURN V,R,V2
$$) as (V agtype, R agtype, V2 agtype);删除图
使用位于ag_catalog命名空间中的drop_graph函数删除图。
SELECT drop_graph('graph_name', true);卸载插件
DROP EXTENSION age;卸载插件之后,重置加载项。
ALTER DATABASE <dbname> RESET search_path;
ALTER USER <username> RESET search_path;
ALTER DATABASE <dbname> RESET session_preload_libraries;
ALTER USER <username> RESET session_preload_libraries;