polar_age(图数据库)

更新时间:
复制为 MD 格式

polar_age插件允许您在PolarDB PostgreSQL集群中直接处理和分析图数据。对于需要在关系型数据库中融合图模型分析的场景,该插件提供了一个高性能的解决方案,使您无需迁移数据到专门的图数据库,即可使用Cypher查询语言进行复杂的关联分析。

适用范围

您的集群需满足以下条件:

  • 集群形态:集中式PolarDB PostgreSQL集群,暂不支持PolarDB PostgreSQL分布式版集群。

  • 数据库引擎PostgreSQL 16

功能优势

polar_agePolarDB基于开源Apache AGE社区版进行功能增强和性能优化的图数据库插件,与开源版本相比,具备以下优势:

  • 更大的存储容量:支持64GraphID。

  • 数据生命周期管理:支持为节点和边设置生存时间(TTL)。

  • 灵活的属性定义:支持在图(Graph)的节点和边上定义自定义属性字段。

  • 强大的融合分析能力:支持在Cypher查询中结合其他插件(如向量插件)进行多模融合检索。

  • 高级查询方式:支持多标签(Multi-Label)查询,提升复杂图谱的查询灵活性。

  • 统一的数据管理:支持通过SQL对图数据执行增删改查(CRUD)操作。

  • 加速向量分析:支持多向量索引,加速图与向量数据的融合分析。

安装与配置插件

安装插件

在您的数据库中安装polar_age插件。如果您尚未创建插件,请使用高权限账号执行以下命令:

CREATE EXTENSION polar_age;

配置数据库

  • (推荐)为数据库设置永久生效:通过修改数据库级别的参数,使任何新建立的连接都能自动加载polar_age扩展并设置好搜索路径,无需在每次连接会话时手动配置。

    -- 将 ag_catalog 添加到默认搜索路径
    ALTER DATABASE <your_db_name> SET search_path = "$user", public, ag_catalog, pg_catalog;
    
    -- 将 polar_age 添加到会话预加载库,实现自动初始化
    ALTER DATABASE <your_db_name> SET session_preload_libraries = 'polar_age';
    重要
    • 请将<your_db_name>替换为您的实际数据库名称。

    • 使用数据管理 DMS(Data Management)客户端设置search_path时,可能会存在兼容性问题,您可使用PolarDB-Tools执行相关语句。

  • 在当前会话中临时生效:仅对当前数据库连接会话有效,适用于临时测试或调试。断开连接后配置即失效。

    SET search_path = "$user", public, ag_catalog, pg_catalog;
    重要

    使用数据管理 DMS(Data Management)客户端设置search_path时,可能会存在兼容性问题,您可使用PolarDB-Tools执行相关语句。

配置普通用户权限

  • 授予USAGE权限给所需的普通用户:

    GRANT USAGE ON SCHEMA ag_catalog TO <your_db_user>;
    GRANT ALL ON ag_catalog.ag_graph TO <your_db_user>;
    GRANT ALL ON ag_catalog.ag_label TO <your_db_user>;
  • 若用户仅为RW用户,需要额外授予创建表的CREATE权限。

    GRANT CREATE ON DATABASE <your_db_name> TO <your_db_user>;

快速入门

本教程将引导您完成从初始化扩展到执行第一个Cypher查询的全过程。

  1. 为数据库安装polar_age插件,并将其配置为自动加载,确保每次连接后都能直接使用Cypher查询。

    -- 创建 polar_age 扩展
    CREATE EXTENSION polar_age;
    
    -- 将 polar_age 加入会话预加载库,并设置默认搜索路径
    ALTER DATABASE <your_db_name> SET search_path = "$user", public, ag_catalog, pg_catalog;
    ALTER DATABASE <your_db_name> SET session_preload_libraries = 'polar_age';
  2. 创建一个图来组织和存储您的图数据。

    SELECT ag_catalog.create_graph('social_network');
  3. 创建点与边。

    -- 点
    SELECT create_vlabel('social_network', 'Person');
    -- 边
    SELECT create_elabel('social_network', 'Knows');
  4. 向图中写入数据:创建代表人物的节点(Node)和代表关系的边(Edge)。

    -- 向 "social_network"."Person" 表中批量写入两个人物点
    INSERT INTO "social_network"."Person" (id, properties) VALUES 
    (ag_catalog._make_graph_id('social_network', 'Person', 'alice'::cstring), '{"name": "alice", "age": 30}'::agtype),
    (ag_catalog._make_graph_id('social_network', 'Person', 'bob'::cstring), '{"name": "bob", "age": 40}'::agtype);
    
    -- 在 'alice' 和 'bob' 之间创建一条 "Knows" 关系
    INSERT INTO "social_network"."Knows" (id, start_id, end_id, properties)
    VALUES (
        ag_catalog._next_graph_id('social_network', 'Knows'),                     -- 生成边的自增ID
        ag_catalog._make_graph_id('social_network', 'Person', 'alice'::cstring),  -- 起始点ID
        ag_catalog._make_graph_id('social_network', 'Person', 'bob'::cstring),    -- 终止点ID
        '{"since": 2022}'::agtype                                                 -- 边的属性
    ); 
  5. 验证数据写入成功并执行图查询。

    1. 使用SQL查询所有Person:

      SELECT id, properties FROM "social_network"."Person";
        id   |          properties          
      -------+------------------------------
       3_xxx | {"age": 30, "name": "alice"}
       3_xxx | {"age": 40, "name": "bob"}
    2. 使用SQL查询名为bobPerson:

      SELECT id, properties FROM "social_network"."Person" WHERE agtype_access_operator(VARIADIC ARRAY[properties, '"name"'::agtype]) = '"bob"'::agtype;
        id   |          properties          
      -------+------------------------------
       3_xxx | {"age": 40, "name": "bob"}
    3. 使用Cypher查找所有关系。

      SELECT * FROM cypher('social_network', $$
          MATCH (p1:Person)-[k:Knows]->(p2:Person)
          RETURN p1.name, type(k), p2.name, k.since
      $$) AS (start_node_name agtype, relationship_type agtype, end_node_name agtype, since agtype);
       start_node_name | relationship_type | end_node_name | since 
      -----------------+-------------------+---------------+-------
       "alice"         | "Knows"           | "bob"         | 2022

开发指南