本地大模型编程实战(28)查询图数据库NEO4J(1)
本文将基于langchain
框架,用LLM(大语言模型)
查询图数据库NEO4J
。
使用
qwen2.5
做实验,用llama3.1
查不出内容。
文章目录
- 安装 `NEO4J`
- 准备图数据
- 查询图数据
- 总结
- 代码
安装 NEO4J
参见:在windows系统中安装图数据库NEO4J 。
准备图数据
我们先准备图数据,为后面的实验做准备。
- 安装
NEO4J
的插件Awesome Procedures On Cypher (APOC)
APOC(Awesome Procedures on Cypher
)是Neo4j
图数据库的一个插件,它提供了一组强大的过程和函数,扩展了Cypher
查询语言的功能。 APOC
可以帮助你进行更高级的数据处理和操作,例如导入和导出数据、动态创建节点和关系、执行事务操作等。
- 下载插件
您可以到 github 下载,也可以到 csdn 下载。
下载完毕后,将rar拷贝到 NEO4J
的 plugins
目录下,重启 NEO4J
即可。
- 准备数据
我们准备了少量电影数据,可以直接下载 movies_small 。
- 导入数据
装好了APOC
插件后,就可以导入准备好的数据了。
我把
movies_small.csv
放在了NEO4J
的import
文件夹下,才可以正常导入。
下面定义一个方法导入数据:
def create_graph():"""导入数据,创建图形数据库"""# 把movies_small.csv拷贝到neo4j的import文件夹内db_file_path = 'file:///movies_small.csv'movies_query = """LOAD CSV WITH HEADERS FROM '%s'AS rowMERGE (m:Movie {id:row.movieId})SET m.released = date(row.released),m.title = row.title,m.imdbRating = toFloat(row.imdbRating)FOREACH (director in split(row.director, '|') | MERGE (p:Person {name:trim(director)})MERGE (p)-[:DIRECTED]->(m))FOREACH (actor in split(row.actors, '|') | MERGE (p:Person {name:trim(actor)})MERGE (p)-[:ACTED_IN]->(m))FOREACH (genre in split(row.genres, '|') | MERGE (g:Genre {name:trim(genre)})MERGE (m)-[:IN_GENRE]->(g))""" % (db_file_path)graph.query(movies_query)graph.refresh_schema()print(graph.schema)
执行完毕上述方法后,我们可以使用 NEO4J
的管理工具查看 刚才导入数据了。
查询图数据
GraphCypherQAChain
我们用最简单的方式:使用GraphCypherQAChain
查询图数据库:
enhanced_graph = Neo4jGraph(enhanced_schema=True)
print(enhanced_graph.schema)from langchain_ollama import ChatOllama
llm = ChatOllama(model="qwen2.5",temperature=0, verbose=True) #llama3.1查不出内容;EntropyYue/chatglm3生成的查询有问题报错# GraphQACypherChain
from langchain_neo4j import GraphCypherQAChainchain = GraphCypherQAChain.from_llm(graph=enhanced_graph, llm=llm, verbose=True, allow_dangerous_requests=True
)
从上面的代码来看,用GraphCypherQAChain
查询NEO4J
很简单,复杂的工作都由GraphCypherQAChain
干了。
后面我们会用
langgraph
来实现类似功能。,这可以让我们对GraphCypherQAChain
的实现思路有更加清晰的了解。
- 定义询问方法
def ask(question:str):"""询问图数据库内容"""response = chain.invoke({"query": question})print(f'response:\n{response}')
- 见证效果
我们问一个图数据库里面有答案的问题吧:
What was the cast of the Casino?
在执行的过程中,可以看到 LLM
推理出了 Cypher
查询语句:
> Entering new GraphCypherQAChain chain...
Generated Cypher:
MATCH (m:Movie {title: 'Casino'})<-[:ACTED_IN]-(a:Person) RETURN a.name
Full Context:
[{'a.name': 'James Woods'}, {'a.name': 'Joe Pesci'}, {'a.name': 'Robert De Niro'}, {'a.name': 'Sharon Stone'}]
最终给出的结果是:
{'query': 'What was the cast of the Casino?', 'result': 'The cast of Casino included James Woods, Joe Pesci, Robert De Niro, and Sharon Stone.'}
不错!
总结
通过上述演练,我们发现用 langchain
的 GraphQACypherChain
对图数据库 NEO4J
进行简单的查询还是比较容易实现的。
代码
本文涉及的所有代码以及相关资源都已经共享,参见:
- github
- gitee
为便于找到代码,程序文件名称最前面的编号与本系列文章的文档编号相同。
🪐感谢您观看,祝好运🪐