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

本文将基于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拷贝到 NEO4Jplugins 目录下,重启 NEO4J 即可。

  • 准备数据

我们准备了少量电影数据,可以直接下载 movies_small

  • 导入数据

装好了APOC插件后,就可以导入准备好的数据了。

我把 movies_small.csv 放在了 NEO4Jimport 文件夹下,才可以正常导入。

下面定义一个方法导入数据:

python 复制代码
def create_graph():
    """导入数据,创建图形数据库"""

    # 把movies_small.csv拷贝到neo4j的import文件夹内
    db_file_path = 'file:///movies_small.csv'

    movies_query = """
    LOAD CSV WITH HEADERS FROM 
    '%s'
    AS row
    MERGE (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查询图数据库:

python 复制代码
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 GraphCypherQAChain

chain = GraphCypherQAChain.from_llm(
    graph=enhanced_graph, llm=llm, verbose=True, allow_dangerous_requests=True
)

从上面的代码来看,用GraphCypherQAChain查询NEO4J很简单,复杂的工作都由GraphCypherQAChain干了。

后面我们会用langgraph来实现类似功能。,这可以让我们对GraphCypherQAChain的实现思路有更加清晰的了解。

  • 定义询问方法
python 复制代码
def ask(question:str):
    """询问图数据库内容"""

    response = chain.invoke({"query": question})
    print(f'response:\n{response}')
  • 见证效果

我们问一个图数据库里面有答案的问题吧:

text 复制代码
What was the cast of the Casino?

在执行的过程中,可以看到 LLM 推理出了 Cypher 查询语句:

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'}]

最终给出的结果是:

text 复制代码
{'query': 'What was the cast of the Casino?', 'result': 'The cast of Casino included James Woods, Joe Pesci, Robert De Niro, and Sharon Stone.'}

不错!

总结

通过上述演练,我们发现用 langchainGraphQACypherChain 对图数据库 NEO4J 进行简单的查询还是比较容易实现的。


代码

本文涉及的所有代码以及相关资源都已经共享,参见:

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

🪐感谢您观看,祝好运🪐

相关推荐
STLearner2 分钟前
ICML 2026 | LLM×Graph论文总结[2]【Graph4LLM,Graph4Agent,智能体记忆(Memory)
大数据·人工智能·python·深度学习·学习·机器学习·数据挖掘
To_OC9 小时前
啃完流式输出:从一个卡顿的 LLM 接口开始,我搞懂了数据流到底怎么 “流”
前端·javascript·llm
To_OC9 小时前
调了一上午 DeepSeek 参数,我终于摸透了 temperature 和 Top K 的真实作用
人工智能·llm·deepseek
郭老二9 小时前
【Python】基本语法:装饰器语法糖@
python
_Jimmy_10 小时前
Agent常用检索器的详细介绍
python·langchain
小柯南敲键盘11 小时前
图片翻译API接入与自动化实现指南
运维·python·自动化
旅僧11 小时前
Q-learning(自用)
python·机器学习
Python大数据分析@11 小时前
曝梁文锋称「一度不想维护C端用户,奈何赶不走」,DeepSeek真不需要C端用户吗?可能会有啥影响吗?
python
艾斯特_13 小时前
工作流与多Agent协作:LangGraph、MCP和A2A的应用分层
人工智能·python·ai
IT小盘13 小时前
04-大模型流式输出原理-SSE与Python实现
开发语言·网络·人工智能·python