polar_age插件允许您在PolarDB PostgreSQL版集群中直接处理和分析图数据。对于需要在关系型数据库中融合图模型分析的场景,该插件提供了一个高性能的解决方案,使您无需迁移数据到专门的图数据库,即可使用Cypher查询语言进行复杂的关联分析。
适用范围
您的集群需满足以下条件:
集群形态:集中式PolarDB PostgreSQL版集群,暂不支持PolarDB PostgreSQL分布式版集群。
数据库引擎:PostgreSQL 16。
功能优势
polar_age是PolarDB基于开源Apache AGE社区版进行功能增强和性能优化的图数据库插件,与开源版本相比,具备以下优势:
更大的存储容量:支持64位GraphID。
数据生命周期管理:支持为节点和边设置生存时间(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查询的全过程。
为数据库安装
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';创建一个图来组织和存储您的图数据。
SELECT ag_catalog.create_graph('social_network');创建点与边。
-- 点 SELECT create_vlabel('social_network', 'Person'); -- 边 SELECT create_elabel('social_network', 'Knows');向图中写入数据:创建代表人物的节点(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 -- 边的属性 );验证数据写入成功并执行图查询。
使用SQL查询所有Person:
SELECT id, properties FROM "social_network"."Person";id | properties -------+------------------------------ 3_xxx | {"age": 30, "name": "alice"} 3_xxx | {"age": 40, "name": "bob"}使用SQL查询名为bob的Person:
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"}使用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