概述
Apache AGE(A Graph Extension)是 PostgreSQL 的图数据库扩展,允许在 PostgreSQL 中使用 openCypher 查询语言进行图数据的存储和查询。腾讯云数据库 PostgreSQL 已预置 Apache AGE 1.5.x 版本。
核心特点:
在 PostgreSQL 内原生支持属性图模型。
使用 openCypher 语法(兼容 Neo4j 查询语法)。
可与 SQL 混合查询,实现图 + 关系数据联合分析。
支持 ACID 事务。
前提条件
云数据库 PostgreSQL 实例版本 ≥ 13。
安装与启用
-- 创建 Apache AGE 扩展CREATE EXTENSION IF NOT EXISTS age;-- 将 ag_catalog 加入 search_pathSET search_path = ag_catalog, "$user", public;-- 或永久设置(推荐)ALTER DATABASE mydb SET search_path = ag_catalog, "$user", public;
核心概念
概念 | 说明 |
Graph(图) | 一个命名的图空间,包含节点和边 |
Vertex(节点) | 图中的实体,可带标签和属性 |
Edge(边) | 节点之间的关系,有方向、可带属性 |
Label(标签) | 节点或边的类型分类 |
Property(属性) | 节点或边上的 key-value 键值对 |
图操作
创建图
-- 创建一个新图SELECT create_graph('knowledge_graph');
创建节点
-- 创建带标签和属性的节点SELECT * FROM cypher('knowledge_graph', $$CREATE (n:Person {name: '张三', age: 30, role: 'Engineer'})RETURN n$$) AS (node agtype);-- 批量创建节点SELECT * FROM cypher('knowledge_graph', $$CREATE (a:Person {name: '李四', role: 'Manager'}),(b:Company {name: '腾讯云', industry: 'Cloud'}),(c:Technology {name: 'PostgreSQL', type: 'Database'})RETURN a, b, c$$) AS (a agtype, b agtype, c agtype);
创建关系(边)
-- 创建节点之间的关系SELECT * FROM cypher('knowledge_graph', $$MATCH (p:Person {name: '张三'}), (c:Company {name: '腾讯云'})CREATE (p)-[r:WORKS_AT {since: '2020-01-01'}]->(c)RETURN r$$) AS (rel agtype);-- 创建使用关系SELECT * FROM cypher('knowledge_graph', $$MATCH (p:Person {name: '张三'}), (t:Technology {name: 'PostgreSQL'})CREATE (p)-[r:USES {level: 'expert'}]->(t)RETURN r$$) AS (rel agtype);
查询
-- 查找所有 Person 节点SELECT * FROM cypher('knowledge_graph', $$MATCH (n:Person)RETURN n.name, n.role$$) AS (name agtype, role agtype);-- 查找关系路径SELECT * FROM cypher('knowledge_graph', $$MATCH (p:Person)-[r:WORKS_AT]->(c:Company)RETURN p.name, c.name, r.since$$) AS (person agtype, company agtype, since agtype);-- 多跳查询SELECT * FROM cypher('knowledge_graph', $$MATCH (p:Person)-[:WORKS_AT]->(c:Company),(p)-[:USES]->(t:Technology)RETURN p.name, c.name, t.name$$) AS (person agtype, company agtype, tech agtype);-- 路径查询(2-3 跳)SELECT * FROM cypher('knowledge_graph', $$MATCH path = (a:Person)-[*2..3]->(b)RETURN path$$) AS (path agtype);
更新与删除
-- 更新节点属性SELECT * FROM cypher('knowledge_graph', $$MATCH (p:Person {name: '张三'})SET p.age = 31RETURN p$$) AS (node agtype);-- 删除关系SELECT * FROM cypher('knowledge_graph', $$MATCH (p:Person {name: '张三'})-[r:USES]->(t:Technology)DELETE r$$) AS (result agtype);-- 删除节点(需先删除关联的边)SELECT * FROM cypher('knowledge_graph', $$MATCH (t:Technology {name: 'PostgreSQL'})DETACH DELETE t$$) AS (result agtype);
SQL 与 Cypher 混合查询
Apache AGE 的强大之处在于可以将图查询结果与关系表 JOIN:
-- 图查询结果与关系表联合SELECT g.person_name, u.email, u.departmentFROM (SELECT * FROM cypher('knowledge_graph', $$MATCH (p:Person)-[:WORKS_AT]->(c:Company {name: '腾讯云'})RETURN p.name AS person_name$$) AS (person_name agtype)) gJOIN users u ON u.name = g.person_name::text;
典型应用场景
知识图谱
-- 构建产品知识图谱SELECT create_graph('product_kg');SELECT * FROM cypher('product_kg', $$CREATE (pg:Product {name: 'PostgreSQL', category: 'Database'}),(vec:Feature {name: '向量检索', desc: '基于 pgvector'}),(ai:Feature {name: 'AI 调用', desc: '基于 tencentdb_ai'}),(pg)-[:HAS_FEATURE]->(vec),(pg)-[:HAS_FEATURE]->(ai)RETURN pg, vec, ai$$) AS (pg agtype, vec agtype, ai agtype);
GraphRAG(图增强的 RAG)
-- 实体提取后存入图,检索时图 + 向量混合召回:-- 1. 向量召回相关文档-- 2. 从图中找到相关实体的关系链-- 3. 将图上下文 + 文档内容一起送给大模型
Agent 记忆关系图
-- 记录 Agent 之间的交互关系SELECT * FROM cypher('agent_memory', $$CREATE (a1:Agent {name: 'Planner', role: 'planning'}),(a2:Agent {name: 'Researcher', role: 'research'}),(a1)-[:DELEGATES {task: '调研竞品', timestamp: '2026-01-15'}]->(a2)RETURN a1, a2$$) AS (a1 agtype, a2 agtype);
性能建议
1. 为频繁查询的属性创建索引:
-- 在节点标签的属性上创建索引CREATE INDEX ON knowledge_graph."Person" ((properties->>'name'));
2. 合理设置路径查询的跳数上限,避免全图遍历。
3. 大规模图建议分区存储。
注意事项
需要将
ag_catalog 添加到 search_path。Cypher 查询通过
cypher() 函数调用,结果需要指定列类型。所有 Cypher 返回值类型为
agtype(Apache AGE 自定义的 JSON-like 类型)。