本地大模型编程实战(28)查询图数据库NEO4J(1)

打印 上一主题 下一主题

主题 1652|帖子 1652|积分 4956

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本文将基于langchain 框架,用LLM(大语言模型)查询图数据库NEO4J。
   使用 qwen2.5 做实验,用 llama3.1 查不出内容。
   
  

安装 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 文件夹下,才可以正常导入。
  下面定义一个方法导入数据:
  1. def create_graph():
  2.     """导入数据,创建图形数据库"""
  3.     # 把movies_small.csv拷贝到neo4j的import文件夹内
  4.     db_file_path = 'file:///movies_small.csv'
  5.     movies_query = """
  6.     LOAD CSV WITH HEADERS FROM
  7.     '%s'
  8.     AS row
  9.     MERGE (m:Movie {id:row.movieId})
  10.     SET m.released = date(row.released),
  11.         m.title = row.title,
  12.         m.imdbRating = toFloat(row.imdbRating)
  13.     FOREACH (director in split(row.director, '|') |
  14.         MERGE (p:Person {name:trim(director)})
  15.         MERGE (p)-[:DIRECTED]->(m))
  16.     FOREACH (actor in split(row.actors, '|') |
  17.         MERGE (p:Person {name:trim(actor)})
  18.         MERGE (p)-[:ACTED_IN]->(m))
  19.     FOREACH (genre in split(row.genres, '|') |
  20.         MERGE (g:Genre {name:trim(genre)})
  21.         MERGE (m)-[:IN_GENRE]->(g))
  22.     """ % (db_file_path)
  23.     graph.query(movies_query)
  24.     graph.refresh_schema()
  25.     print(graph.schema)
复制代码
执行完毕上述方法后,我们可以使用 NEO4J 的管理工具检察 刚才导入数据了。
查询图数据



  • GraphCypherQAChain
我们用最简朴的方式:使用GraphCypherQAChain查询图数据库:
  1. enhanced_graph = Neo4jGraph(enhanced_schema=True)
  2. print(enhanced_graph.schema)
  3. from langchain_ollama import ChatOllama
  4. llm = ChatOllama(model="qwen2.5",temperature=0, verbose=True)   #llama3.1查不出内容;EntropyYue/chatglm3生成的查询有问题报错
  5. # GraphQACypherChain
  6. from langchain_neo4j import GraphCypherQAChain
  7. chain = GraphCypherQAChain.from_llm(
  8.     graph=enhanced_graph, llm=llm, verbose=True, allow_dangerous_requests=True
  9. )
复制代码
从上面的代码来看,用GraphCypherQAChain查询NEO4J很简朴,复杂的工作都由GraphCypherQAChain干了。
   后面我们会用langgraph来实现类似功能。,这可以让我们对GraphCypherQAChain的实现思绪有更加清楚的了解。
  

  • 定义询问方法
  1. def ask(question:str):
  2.     """询问图数据库内容"""
  3.     response = chain.invoke({"query": question})
  4.     print(f'response:\n{response}')
复制代码


  • 见证结果
我们问一个图数据库内里有答案的问题吧:
  1. What was the cast of the Casino?
复制代码
在执行的过程中,可以看到 LLM 推理出了 Cypher 查询语句:
  1. > Entering new GraphCypherQAChain chain...
  2. Generated Cypher:
  3. MATCH (m:Movie {title: 'Casino'})<-[:ACTED_IN]-(a:Person) RETURN a.name
  4. Full Context:
  5. [{'a.name': 'James Woods'}, {'a.name': 'Joe Pesci'}, {'a.name': 'Robert De Niro'}, {'a.name': 'Sharon Stone'}]
复制代码
终极给出的结果是:
  1. {'query': 'What was the cast of the Casino?
  2. ', 'result': 'The cast of Casino included James Woods, Joe Pesci, Robert De Niro, and Sharon Stone.'}
复制代码
不错!
总结

通过上述演练,我们发现用 langchain 的 GraphQACypherChain 对图数据库 NEO4J 进行简朴的查询照旧比力容易实现的。

代码

本文涉及的全部代码以及相干资源都已经共享,参见:


  • github
  • gitee
   为便于找到代码,程序文件名称最前面的编号与本系列文章的文档编号相同。
  
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

干翻全岛蛙蛙

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表