快速入门

PolarDB PostgreSQL版以插件形式实现图数据库,使用Cypher语言对数据库中的图进行查询。本文介绍图数据库的基本概念,及图数据库的使用方法。

概念介绍

  • 图(Graph):图由节点(结点或顶点)和边(连接节点的关系)组成。图是一种非线性的数据结构,可用于表示实体及其之间的关系。

  • 节点(Node):节点是图中的基本单位,表示实体,例如用户、产品、地点等。每个节点可以包含属性(即数据字段),用于描述节点的特征或行为。

  • 边(Edge):边表示节点之间的关系或连接。每条边可以是有向的(从一个节点指向另一个节点)或无向的(没有特定方向)。边也可以有属性,用于描述关系的特征(如关系类型、权重等)。

  • 属性(Property):属性是节点或边的附加信息,例如节点的名称、创建时间、边的权重等。通过属性,可以更细致地描述节点和边。

  • 图查询语言:图查询语言是用于与图数据库进行交互的一种专门语言,允许通过编写查询来检索、分析和操作图数据。本插件使用Cypher作为图查询语言,同时支持与PostgreSQL原有的SQL、PL/PGSQL等语言组合进行查询。常用的查询语法包括MATCHWITHRETURNORDER BYSKIPLIMITCREATEDELETESETREMOVEMERGE等。

前提条件

支持的PolarDB PostgreSQL版的版本如下:

PostgreSQL 14(内核小版本14.12.24.0及以上)。

说明

您可通过如下语句查看PolarDB PostgreSQL版的内核小版本号:

SELECT version();

使用方法

安装插件

CREATE EXTENSION age;

安装插件之后,将其加入需要使用此插件的数据库或用户的搜索路径和预加载库中:

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';

创建图

使用位于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;