# 知识图谱
# 安装 neo4j 图数据库
jdk 版本只支持 11,需要到系统环境变量中去改(现在已经改至 11)
# 启动 neo4j
在 neo4j 解压的文件夹的 bin 文件夹下,打开 cmd
安装 / 卸载服务(cmd 命令):
# 安装 neo4j install-service # 卸载 neo4j uninstall-service
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
4. 启动服务:neo4j.bat console。
5. 浏览器打开:[http://localhost:7474/](https://link.zhihu.com/?target=http%3A//localhost%3A7474/),默认账号和密码均为:neo4j。首次登录会提醒修改密码
6. 常见命令:如开始服务、停止服务、重启服务、安装、卸载、更新等。
Usage: neo4j { console | start | stop | restart | status | install-service | uninstall-service | update-service } < -Verbose >
## 知识图谱基础知识
1. 存储信息在节点和关系中的
2. 每个节点和关系都可以有属性、键值对
3. 节点可以被赋予标签以帮助将它们分组在一起
4. 关系始终有类型和方向

LangChain
## 查询知识图谱
### Querying the movie knowledge graph
取一个Python中的多行字符串,赋值给cypher
```python
cypher=""""
MATCH(n) #匹配子句,模式匹配,可以寻找的最小模式匹配是一个单节点模式·将结果赋值给n
RETURN count(n) As numberOfNodes #返回这些节点的个数
""""
要运行查询本身,就要利用之前设置好的 LangChain 集成
1 | result = kg.query(cypher) |
1 | cypher="""" |
1 | cypher="""" |
# 为 RAG 准备文本
1 | from dotenv import load_dotenv |
1 | # Load from enviroment |
1 | # 创建与知识图的连接,以便发送一些查询 |
启用向量搜索的第一步是创建一个向量索引
要关注的是 OPTIONS 部分中向量的索引有多大,维度有多大(这里是 OpenAI 嵌入模型的默认大小)
还有相似函数
1 | question = "What movies are about adenture?" |
1 | kg.query(""" |
WITH
用于将前一句的结果传递给下一句,并且可以在这个过程中进行计算或过滤。
ganai.vector.encode
: 这是一个自定义的函数调用,可能是通过扩展或插件添加到图数据库中的。它接受三个参数
AS question_embedding
: 将ganai.vector.encode
函数返回的结果(即问题的向量表示)赋值给一个新的变量question_embedding
CALL
: 调用一个过程或函数
'movie_tagline_embeddings'
: 指定要查询的向量索引名称,这里是指包含电影标语嵌入的索引。
question_embedding
: 使用之前生成的问题嵌入作为查询条件。
YIELD
关键字用于从被调用的过程中提取结果。
node
是查询返回的节点,我们将其重命名为movie
score
是匹配度得分,表示查询向量与节点向量之间的相似度
从头到尾一直在使用现有的数据库,但是,要构建自己的 RAG 应用程序,需要从头开始构建一个来表示和存储数据
# 从文本文档构建知识图谱
# Plan of attack
- 对于每种形式都有不同的文本部分,我们要将他们拆分成块
- 拆分成的块就是一个个节点,包含文本原始内容以及一些元数据作为属性
- 然后就可以创建向量索引
- 将计算文本嵌入以填充每个分块文本的索引
- 做完这些就可以进行相似性搜索
# start work
引入以及全局环境和变量设置
这里只用了单个的 10k 文件,在实际实践中,需要对每个文件进行重复操作
取第一个文本,并将其加载到 python 的一个变量中,检查这个变量在 python 中的类型是否为字典,然后遍历这个字典,看有什么可用的,然后取其中一个项目看其文本,只看其前 1500,接下来将它分割为快
对文本进行分块,先是设置每一个分块的大小都是 2000,有 200 个字符重叠 ,然后执行这个分块将结果给 item1_text_chunks, 可以看到分到的块有 254 块
接着需要写一个函数,用来遍历文本并进行分块,遍历分块
在函数中,使用一个数组来存储分块后的数据,先遍历文件中的每一个项目,将每一个项目进行分块后再遍历每一个块,将块中的 信息,赋值,添加到一个数据记录中,附加有元数据的块集合
然后既可以使用这个函数
要将分块合并到知识图谱中,使用 cypher 语言
在创建知识图谱之前要确保不会重复数据,就要添加约束索引,唯一 id
遍历每一个块,对于每一个块执行之前的合并查询语句,并附上参数
创建一个索引,文本嵌入块
辅助函数用于相关搜索
将问题作为参数传入这个函数中,将返回相似得分,节点文本