首页 > 数据库 >仅需一个插件让关系型数据库实现图数据存储与检索

仅需一个插件让关系型数据库实现图数据存储与检索

时间:2025-01-13 22:32:11浏览次数:1  
标签:检索 插件 name ag graph 数据库 Person my agtype

简介

Apache AGE是一个PostgreSQL数据库的扩展插件,使得在关系型数据库中也可以使用openCypher查询语言进行图查询。有了该插件,可以在PostgreSQL数据库中同时实现关键字检索、向量检索、图检索,仅需一个数据库即可实现复杂RAG的各种存储和检索需求。

安装

Docker安装

  1. 获取镜像
docker pull apache/age
  1. 运行容器
docker run \
    --name age  \
    -p 5455:5432 \
    -e POSTGRES_USER=postgresUser \
    -e POSTGRES_PASSWORD=postgresPW \
    -e POSTGRES_DB=postgresDB \
    -d \
    apache/age
  1. 启动数据库
docker exec -it age psql -d postgresDB -U postgresUser

源码安装

Git Clone仓库或手动下载官方发布的版本。目前,仅支持 PostgreSQL 版本 11~16,若低于11则无法安装使用。

安装及初始化

  1. 安装扩展
CREATE EXTENSION age;
  1. 加载扩展
LOAD 'age';
  1. 设置搜索路径
SET search_path = ag_catalog, "$user", public;
  1. 创建图
SELECT create_graph('my_graph');

AGE这个插件与其他插件不同,安装后,还需要执行第二步加载插件和第三步设置搜索路径。设置搜索路径则是为了让数据库能够找到 AGE 的函数,如 create_graph(),否则执行相关函数都会出错

基本操作

基本创建操作

创建节点

  1. 创建单个节点
SELECT * FROM cypher('my_graph', $$
    CREATE (p:Person {name: '张三', age: 30})
    RETURN p
$$) as (v agtype);
  1. 同时创建多个节点
SELECT * FROM cypher('my_graph', $$
    CREATE (p1:Person {name: '李四', age: 25}),
           (p2:Person {name: '王五', age: 35})
    RETURN p1, p2
$$) as (v1 agtype, v2 agtype);

创建边

  1. 根据已有的节点创建边
SELECT * FROM cypher('my_graph', $$ 
    MATCH (p1:Person {name: '李四'}), (p2:Person {name: '王五'}) 
    CREATE (p1)-[r:FRIEND]->(p2) 
$$
) AS (e agtype);
  1. 创建边的同时创建节点
SELECT * FROM cypher('my_graph', $$
    CREATE (a:Person {name: 'Alice', age: 30})-[:FRIEND]->(b:Person {name: 'Bob', age: 27})
$$
) AS (result agtype);

基本查询操作

查询节点

# 查询所有Person节点
SELECT * FROM cypher('my_graph', $$
    MATCH (p:Person)
    RETURN p
$$) as (v agtype);

# 条件查询节点
SELECT * FROM cypher('my_graph', $$
    MATCH (p:Person)
    WHERE p.age > 30
    RETURN p
$$) as (v agtype);

查询边

# 查询所有朋友关系
SELECT * FROM cypher('my_graph', $$
    MATCH (a:Person)-[r:FRIENDS]->(b:Person)
    RETURN a.name, r.since, b.name
$$) as (name1 agtype, since agtype, name2 agtype);

# 查询特定条件的关系
SELECT * FROM cypher('my_graph', $$
    MATCH (a:Person)-[r:WORKS_AT]->(c:Company)
    WHERE c.name = '科技公司'
    RETURN a.name, c.name
$$) as (person_name agtype, company_name agtype);

高级查询功能

路径查询

# 查找两个节点之间的路径
SELECT * FROM cypher('my_graph', $$
    MATCH p = (a:Person {name: '张三'})-[*1..3]->(b:Person)
    RETURN p
$$) as (path agtype);
*表示任意边,范围在1~3之间的节点

聚合查询

# 统计每个公司的员工数
SELECT * FROM cypher('my_graph', $$
    MATCH (p:Person)-[:WORKS_AT]->(c:Company)
    RETURN c.name, count(p) as employee_count
$$) as (company agtype, count agtype);

基本更新操作

更新节点

# 更新节点属性
SELECT * FROM cypher('my_graph', $$
    MATCH (p:Person {name: '张三'})
    SET p.age = 31
    RETURN p
$$) as (v agtype);

删除边

# 删除关系
SELECT * FROM cypher('my_graph', $$
    MATCH (a:Person)-[r:FRIENDS]->(b:Person)
    WHERE a.name = '张三' AND b.name = '李四'
    DELETE r
$$) as (v agtype);

删除节点

# 删除节点(需要先删除相关的边)
SELECT * FROM cypher('my_graph', $$
    MATCH (p:Person {name: '张三'})
    DETACH DELETE p
$$) as (v agtype);

索引

Age支持对节点和边构建索引,用于加速查找过程。

节点索引

# 1. 基本的 B-tree 索引(适用于等值查询、范围查询)
CREATE INDEX idx_person_name ON ag_catalog.ag_label_vertex 
USING btree ((properties -> 'name')) 
WHERE label = 'Person' AND graph_name = 'my_graph';

# 2. GiST 索引(适用于地理数据或多维数据)
CREATE INDEX idx_person_location ON ag_catalog.ag_label_vertex 
USING gist ((properties -> 'location')) 
WHERE label = 'Person' AND graph_name = 'my_graph';

# 3. Hash 索引(仅适用于等值查询)
CREATE INDEX idx_person_id ON ag_catalog.ag_label_vertex 
USING hash ((properties -> 'id')) 
WHERE label = 'Person' AND graph_name = 'my_graph';

# 4. 多列索引
CREATE INDEX idx_person_name_age ON ag_catalog.ag_label_vertex 
USING btree ((properties -> 'name'), (properties -> 'age')) 
WHERE label = 'Person' AND graph_name = 'my_graph';

边索引

# 1. 基本的关系索引
CREATE INDEX idx_friendship_date ON ag_catalog.ag_label_edge 
USING btree ((properties -> 'since')) 
WHERE label = 'FRIENDS' AND graph_name = 'my_graph';

# 2. 复合边索引
CREATE INDEX idx_relationship_composite ON ag_catalog.ag_label_edge 
USING btree ((properties -> 'type'), (properties -> 'weight')) 
WHERE label = 'RELATIONSHIP' AND graph_name = 'my_graph';

索引管理

# 查看所有索引
SELECT * FROM pg_indexes 
WHERE tablename LIKE 'ag_label%';

# 删除索引
DROP INDEX IF EXISTS idx_person_name;

# 重建索引
REINDEX INDEX idx_person_name;

其他功能

查询已创建的图

# 使用 ag_catalog.ag_graph 表查询
SELECT * FROM ag_catalog.ag_graph;

总结

对于生产环境来说,PostgreSQL是最常用的数据库之一,有了Age这个插件,可以无缝为传统的RAG知识库服务提供图检索能力,真正做到All in one,同时也无需担心额外增加图数据库引入的复杂性和兼容问题。

标签:检索,插件,name,ag,graph,数据库,Person,my,agtype
From: https://www.cnblogs.com/deeplearningmachine/p/18669558

相关文章

  • 【Unity 编辑器插件】Stranger Lands - StampIT! 旨在简化和加速游戏场景构建中的地形
    StrangerLands-StampIT!是一款Unity插件,专为游戏开发者设计,旨在简化和加速游戏场景构建中的地形、地图和环境资源布局。它特别适用于需要大规模、快速生成或修改地形的项目,如开放世界、冒险类游戏、沙盒游戏等。通过该插件,开发者可以通过简单的操作快速“印刷”出各种地形......
  • vscode插件continue结合ollama自动生成代码
    vscode插件continue结合ollama自动生成代码ollama安装ollama安装见https://www.cnblogs.com/jokingremarks/p/18151827中的前部分,懒得再写了vscode中continue的安装可以直接在vscode的扩展中安装插件,也可以去下载这个插件,然后应用在vscode中一般都会选择直接去扩展中安装,在......
  • JSP篮球论坛网站设计与实现8lb36(程序+源码+数据库+调试部署+开发环境)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、研究背景与意义篮球运动在全球范围内拥有广泛的爱好者群体,他们渴望有一个交流心得、分享比赛视频的互动平台。然而,现有的篮球论坛大多功能单一......
  • JSP昆明城市学院勤工俭学网emasw--(程序+源码+数据库+调试部署+开发环境)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、研究背景随着高等教育的普及,越来越多的学生选择通过勤工俭学来减轻家庭经济负担并积累实践经验。昆明城市学院作为一所位于昆明市的高校,学生勤......
  • JSP老年保健品销售系统97578--(程序+源码+数据库+调试部署+开发环境)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、课题背景及意义随着人口老龄化的加剧,老年保健品市场需求不断增长。然而,传统的销售方式已经无法满足现代老年人的购物需求。因此,开发一个高效、......
  • JSP篮球学员信息管理系统i5o70(程序+源码+数据库+调试部署+开发环境
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表技术要求:开发语言:JSP前端使用:HTML5,CSS,JSP动态网页技术后端使用SpringBoot,Spring技术主数据库使用MySQL开题报告内容一、项目背景与意义随着篮球运动的普......
  • JSP兰州市邮政公司新邮预订户管理信息系统pk277(程序+源码+数据库+调试部署+开发环境)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、课题名称兰州市邮政公司新邮预订户管理信息系统二、研究背景与意义随着电子商务的快速发展和人们对快递服务需求的增加,邮政公司成为现代社会......
  • JSP课堂考勤管理系统(程序+源码+数据库+调试部署+开发环境)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表技术要求:开发语言:JSP前端使用:HTML5,CSS,JSP动态网页技术后端使用SpringBoot,Spring技术主数据库使用MySQL开题报告内容一、项目背景随着教育信息化的快速发......
  • 使用 Upstash 构建无服务器向量数据库与缓存系统的最佳实践
    技术背景介绍在构建现代智能应用时,开发者经常需要处理大量数据,包括向量嵌入、缓存管理和消息存储。然而传统数据库和内存存储的部署和运维往往带来复杂性。为了简化这些挑战,Upstash提供了基于HTTP的无服务器数据库和消息队列,其中包含两大关键产品:UpstashVector——......
  • Milvus:高性能向量数据库的安装与实战
    Milvus:高性能向量数据库简介Milvus是一个专为存储、索引和管理由深度神经网络及其他机器学习模型生成的大规模嵌入向量(embeddingvectors)而设计的数据库。它支持高效的向量检索,并且非常适合用于语义搜索、推荐系统、图像检索等应用场景。在本文中,我们将从安装Milvus......