LLM - 使用 Neo4j 可视化 GraphRAG 构建的 知识图谱(KG) 教程

欢迎关注我的CSDN:https://spike.blog.csdn.net/
本文地址:https://spike.blog.csdn.net/article/details/142938982

免责声明:本文来源于个人知识与公开资料,仅用于学术交流,欢迎讨论,不支持转载。


Neo4j

Neo4j 是一个高性能的图形数据库,允许用户以图形的形式存储和检索数据,这种形式非常适合处理复杂的关系和网络结构,因其在数据关系处理方面的强大能力而广受欢迎,尤其是在社交网络、推荐系统、网络分析等领域。

构建 GraphRAG 的知识图谱,请参考:配置 GraphRAG + Ollama 服务 构建 中文知识图谱 教程(踩坑记录)

  • Doc:https://neo4j.com/docs/apoc/current/

1. 配置 Neo4j 服务

准备 Docker,参考 Docker - Neo4j

docker pull neo4j:5.24.1

启动 Docker (直接启动,同时运行服务):

docker run --network=host --gpus all --rm --name neo4j-apoc \
-e NEO4J_apoc_export_file_enabled=true \
-e NEO4J_apoc_import_file_enabled=true \
-e NEO4J_apoc_import_file_use__neo4j__config=true \
-e NEO4J_PLUGINS=\[\"apoc\"\] \
--volume=[your folder]:[your folder] \
neo4j:5.24.1

或者,进入 Docker,再启动服务:

docker run --network=host --gpus all -it --name neo4j-apoc -e NEO4J_apoc_export_file_enabled=true -e NEO4J_apoc_import_file_enabled=true -e NEO4J_apoc_import_file_use__neo4j__config=true -e NEO4J_PLUGINS=\[\"apoc\"\] --volume=[your folder]:[your folder] neo4j:5.24.1 /bin/bashbin/neo4j start

注意:使用 Neo4j + APOC 版本的 Docker。APOC(Awesome Procedures on Cypher) 是 Neo4j 图数据库的一个插件,提供一组强大的过程和函数,扩展 Cypher 查询语言的功能。参考:Neo4J and APOC

日志:

Installing Plugin 'apoc' from /var/lib/neo4j/labs/apoc-*-core.jar to /var/lib/neo4j/plugins/apoc.jar
Applying default values for plugin apoc to neo4j.conf
2024-10-15 01:40:54.429+0000 INFO  Logging config in use: File '/var/lib/neo4j/conf/user-logs.xml'
2024-10-15 01:40:54.443+0000 INFO  Starting...
2024-10-15 01:40:55.191+0000 INFO  This instance is ServerId{0350f51a} (0350f51a-ef80-414f-b82f-8e4b38fc369f)
2024-10-15 01:40:56.078+0000 INFO  ======== Neo4j 5.24.1 ========
2024-10-15 01:40:58.875+0000 INFO  Anonymous Usage Data is being sent to Neo4j, see https://neo4j.com/docs/usage-data/
2024-10-15 01:40:58.910+0000 INFO  Bolt enabled on 0.0.0.0:7687.
2024-10-15 01:40:59.325+0000 INFO  HTTP enabled on 0.0.0.0:7474.
2024-10-15 01:40:59.326+0000 INFO  Remote interface available at http://localhost:7474/
2024-10-15 01:40:59.328+0000 INFO  id: 3C118963730B6744966FCB5FC5D9D5795B11AD1F791A4DDC113D02D1F926441F
2024-10-15 01:40:59.329+0000 INFO  name: system
2024-10-15 01:40:59.329+0000 INFO  creationDate: 2024-10-15T01:40:57.342Z
2024-10-15 01:40:59.329+0000 INFO  Started.

启动服务:http://[your ip]:7474/browser/,默认账户和密码都是 neo4j,需要修改新密码 xxxxxx,建议 neo4j123 (自定义)。

启动页面,注意,实体和关系都空的,即:

Neo4j

2. 注入知识图谱数据

数据位于:/var/lib/neo4j/data/databases/neo4j,其中 neo4j 是数据库。

读取 GraphRAG 的知识图谱数据,如下:

import os
import pandas as pdrag_dir = "[your folder]/llm/graphrag/ragtest/output/"entities = pd.read_parquet(os.path.join(rag_dir, "create_final_entities.parquet"))
relationships = pd.read_parquet(os.path.join(rag_dir, "create_final_relationships.parquet"))
text_units = pd.read_parquet(os.path.join(rag_dir, "create_final_text_units.parquet"))
communities = pd.read_parquet(os.path.join(rag_dir, "create_final_communities.parquet"))
community_reports = pd.read_parquet(os.path.join(rag_dir, "create_final_community_reports.parquet"))

测试数据:

entities.head(2)
relationships.head(2)
text_units.head(2)
communities.head(2)
community_reports.head(2)

连接服务器:

NEO4J_URI = "neo4j://localhost:7687"
NEO4J_USERNAME = "neo4j"
NEO4J_PASSWORD = "xxxxxx"	# 之前修改的密码
NEO4J_DATABASE = "neo4j"  	# 默认
driver = GraphDatabase.driver(NEO4J_URI, auth=(NEO4J_USERNAME, NEO4J_PASSWORD))

注意:社区版本,不能创建新的 Database 只能使用默认的 neo4j,创建命令 CREATE DATABASE my-database,参考

数据导入函数:

def import_data(cypher, df, batch_size=1000):for i in range(0,len(df), batch_size):batch = df.iloc[i: min(i+batch_size, len(df))]result = driver.execute_query("UNWIND $rows AS value " + cypher, rows=batch.to_dict('records'),database_=NEO4J_DATABASE)print(result.summary.counters)return 

导入 text_units 命令:

#导入text_units
cypher_text_units = """
MERGE (c:__Chunk__ {id:value.id})
SET c += value {.text, .n_tokens}
WITH c, value
UNWIND value.document_ids AS document
MATCH (d:__Document__ {id:document})
MERGE (c)-[:PART_OF]->(d)
"""import_data(cypher_text_units, text_units)

运行成功,日志:

{'_contains_updates': True, 'labels_added': 99, 'relationships_created': 235, 'nodes_created': 99, 'properties_set': 396}

导入 entities 数据的命令:

#导入entities
cypher_entities= """
MERGE (e:__Entity__ {id:value.id})
SET e += value {.human_readable_id, .description, name:replace(value.name,'"','')}
WITH e, value
CALL db.create.setNodeVectorProperty(e, "description_embedding", value.description_embedding)
CALL apoc.create.addLabels(e, case when coalesce(value.type,"") = "" then [] else [apoc.text.upperCamelCase(replace(value.type,'"',''))] end) yield node
UNWIND value.text_unit_ids AS text_unit
MATCH (c:__Chunk__ {id:text_unit})
MERGE (c)-[:HAS_ENTITY]->(e)
"""import_data(cypher_entities, entities)

导入 relationships 数据的命令:

#导入relationships
cypher_relationships = """MATCH (source:__Entity__ {name:replace(value.source,'"','')})MATCH (target:__Entity__ {name:replace(value.target,'"','')})// not necessary to merge on id as there is only one relationship per pairMERGE (source)-[rel:RELATED {id: value.id}]->(target)SET rel += value {.rank, .weight, .human_readable_id, .description, .text_unit_ids}RETURN count(*) as createdRels
"""import_data(cypher_relationships, relationships)

导入 communities 数据的命令:

#导入communities
cypher_communities = """
MERGE (c:__Community__ {community:value.id})
SET c += value {.level, .title}
/*
UNWIND value.text_unit_ids as text_unit_id
MATCH (t:__Chunk__ {id:text_unit_id})
MERGE (c)-[:HAS_CHUNK]->(t)
WITH distinct c, value
*/
WITH *
UNWIND value.relationship_ids as rel_id
MATCH (start:__Entity__)-[:RELATED {id:rel_id}]->(end:__Entity__)
MERGE (start)-[:IN_COMMUNITY]->(c)
MERGE (end)-[:IN_COMMUNITY]->(c)
RETURn count(distinct c) as createdCommunities
"""import_data(cypher_communities, communities)

导入 community_reports 数据的命令:

#导入community_reports
cypher_community_reports = """MATCH (c:__Community__ {community: value.community})
SET c += value {.level, .title, .rank, .rank_explanation, .full_content, .summary}
WITH c, value
UNWIND range(0, size(value.findings)-1) AS finding_idx
WITH c, value, finding_idx, value.findings[finding_idx] as finding
MERGE (c)-[:HAS_FINDING]->(f:Finding {id: finding_idx})
SET f += finding"""
import_data(cypher_community_reports, community_reports)

3. 测试效果

启动 Neo4j 页面,知识图谱可视化,包括 Node labels 和 Relationship types 等功能,即:

数据

其他知识图谱元素的可视化,参考 Neo4j 的文档。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/56468.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

向日葵下载教程以及三款远程控制工具推荐!!!

向日葵远程控制下载教程!! 亲爱的朋友们,如果你对远程控制软件有所需求,那么向日葵绝对是一个不错的选择。现在我将带你走一遍向日葵的下载流程。 1. 打开你的浏览器,输入“向日葵官方网站”,进入官方网站…

线性回归逻辑回归-笔记

一、线性回归(Linear Regression) 1. 定义 线性回归是一种用于回归问题的算法,旨在找到输入特征与输出值之间的线性关系。它试图通过拟合一条直线来最小化预测值与真实值之间的误差。 2. 模型表示 线性回归模型假设目标变量(输…

【黑苹果】记录MacOS升级Sonoma的过程

【黑苹果】记录MacOS升级Sonoma的过程 一、硬件二、提前说明三、准备OC四、选择驱动五、选择ACPI六、下载内核扩展七、其他问题 一、硬件 设备是神舟zx6-ct5da 具体参照下图 二、提前说明 本机器已经安装过 macOS Monterey 12.6,这次是升级到 macOS Sonoma 14。 …

测试教程分享

前几年在腾讯课堂上发布了不少课程,后来腾讯课堂改革,要收会员费,课程还要抽提程,这么下来就相当于白干了。就放弃了在上面发课程,再后来腾讯课堂就关闭了,以前发布的视频就没有地方发了,于是我…

火车头采集器易优cms采集发布模块下载

火车头采集器发布数据到易优cms(Eyoucms)的详细流程: 1. 火车头采集器易优cms(Eyoucms)发布模块下载地址: 火车头Eyoucms发布模块插件下载-CSDN 2. 在火车头导入下载的易优cms采集发布模块; …

uniapp学习(003-2 vue3学习 Part.2)

零基础入门uniapp Vue3组合式API版本到咸虾米壁纸项目实战,开发打包微信小程序、抖音小程序、H5、安卓APP客户端等 总时长 23:40:00 共116P 此文章包含第15p-第p20的内容 文章目录 事件监听以及组件内置事件处理自定义模板快速创建uniapp条件渲染 v-if和v-elsev-e…

一分钟带你认清Java抽象类

abstrat——抽象,抽象类真的有像它的名字一样那么抽象吗?其实不然,它只是一个比较特殊的类别,我们只需要简单地认清它的作用就行,一起来看看吧~ 抽象类的概念 首先我们要明确一个事情:在面向对象的概念中&…

spring boot 项目配置文件

第一种properties文件(自带基础) 新建项目是会在resources目录下默认properties文件 第二种yml文件(常用) 格式类型:spring boot支持3种配置文件,分别是xx.properties,xx.yaml,xx.yml;同一个项目若配置这3种…

2024软考网络工程师笔记 - 第4章.局域网和城域网

文章目录 局域网基础1️⃣局域网和城域网体系架构 IEEE(负责链路层)2️⃣局域网拓扑结构 🕑CSMA/CD1️⃣CSMA/CD2️⃣CSMA/CD三种监听算法3️⃣冲突检测原理 🕒二进制指数退避算法1️⃣ 二进制指数退避算法 🕓最小帧长…

【JavaScript】LeetCode:71-75

文章目录 71 搜索插入位置72 搜索二维矩阵73 在排序数组中查找元素的第一个和最后一个位置74 搜索旋转排序数组75 寻找旋转排序数组中的最小值 71 搜索插入位置 二分查找在最后一轮比较中,mid所指向的值 > target,right往左收,此时left所指…

【自然语言处理】Encoder-Decoder模型中Attention机制的引入

在 Encoder-Decoder 模型中引入 Attention 机制,是为了改善基本Seq2Seq模型的性能,特别是当处理长序列时,传统的Encoder-Decoder模型容易面临信息压缩的困难。Attention机制可以帮助模型动态地选择源序列中相关的信息,从而提高翻译…

【数据库MySQL作业】

(简答题) 1、按照结构表提示在数据库中创建数据表,要求使用SQL 语句实现。 2、按照下列要求完成操作,要求使用SQL 语句实现。 (1) 为读者表 reader 指定检査约束,即指定性别 sex 字段的值只能是“男”或“女”。 (2) 修改读者表reader 的默认…

RAG中向量召回怎么做

目录 1. 文档嵌入 2. 查询处理 3. 向量搜索 4. 结果融合 5. 实现细节 使用 FAISS 进行向量召回 在检索增强生成(Retrieval-Augmented Generation, RAG)框架中,向量召回是一个关键步骤,它涉及到从一个大规模的文档库或知识库…

华为---Super VLAN简介及示例配置

目录 1. Super VLAN技术产生背景 2. Super VLAN概念 3. Super VLAN应用场景 4. Super VLAN工作原理 5. Super-VLAN主要配置命令 6. Super-VLAN主要配置步骤 7. 示例配置 7.1 示例场景 7.2 网络拓扑 7.3 配置代码 7.4 代码解析 7.5 测试验证 1. Super VLAN技术产生背…

创建包含可导入浏览器信任的SSL自签名证书

问题:现在的三大浏览器,chrome、edge、firefox 一般都默认启用https检查,这就要求我们自建的局域网内的网址和其他诸如nextcloud、photoprism、tiddlywiki等应用也必须要有证书。解决方法是使用openssl自己生成一个。由此则会再衍生出一个问题…

爬虫prc技术----小红书爬取解决xs

知识星球:知识星球 | 深度连接铁杆粉丝,运营高品质社群,知识变现的工具知识星球是创作者连接铁杆粉丝,实现知识变现的工具。任何从事创作或艺术的人,例如艺术家、工匠、教师、学术研究、科普等,只要能获得一…

vscode解决中文注释乱码,意料之外的原因

问题详情: c文件编码格式是:utf-8,vscode打开格式也是utf-8,但中文注释仍是乱码。可是用notepad打开中文显示却是正常 notepad显示编码如图: notepad打开文件: vscode显示编码如图: vscode打开…

Re75 读论文:Toolformer: Language Models Can Teach Themselves to Use Tools

诸神缄默不语-个人CSDN博文目录 诸神缄默不语的论文阅读笔记和分类 论文全名:Toolformer: Language Models Can Teach Themselves to Use Tools 论文下载地址:https://arxiv.org/abs/2302.04761 这篇文章是介绍tool learning的,大概来说就是…

闪电麦昆 语音控制齿轮行进轨迹,ESP32搭配语音控制板,串口通信,附视频演示地址

演示地址 https://www.bilibili.com/video/BV1cW421d79L/?vd_sourceb8515e53f6d4c564b541d98dcc9df990 语音控制板的配置 web展示页面 esp32 程序 #include <ESP8266WiFi.h> #include <ESP8266WebServer.h> #include <LittleFS.h> #include <WebSo…

Arthas常用的命令(三)--monitor、jad 、stack

monitor&#xff1a;监控方法的执行情况 监控指定类中方法的执行情况 用来监视一个时间段中指定方法的执行次数&#xff0c;成功次数&#xff0c;失败次数&#xff0c;耗时等这些信息 参数说明 方法拥有一个命名参数 [c:]&#xff0c;意思是统计周期&#xff08;cycle of ou…