惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
B
Blog RSS Feed
宝玉的分享
宝玉的分享
腾讯CDC
博客园_首页
T
Tailwind CSS Blog
月光博客
月光博客
博客园 - 司徒正美
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
M
MIT News - Artificial intelligence
A
About on SuperTechFans
云风的 BLOG
云风的 BLOG
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
有赞技术团队
有赞技术团队
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
大猫的无限游戏
大猫的无限游戏
MongoDB | Blog
MongoDB | Blog
博客园 - 聂微东
V
Visual Studio Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
SecWiki News
SecWiki News
美团技术团队
P
Privacy International News Feed
H
Help Net Security
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Microsoft Security Blog
Microsoft Security Blog
Know Your Adversary
Know Your Adversary
Y
Y Combinator Blog
D
DataBreaches.Net
Project Zero
Project Zero
T
The Blog of Author Tim Ferriss
Cyberwarzone
Cyberwarzone
C
Cybersecurity and Infrastructure Security Agency CISA
C
Cisco Blogs
S
Schneier on Security
G
GRAHAM CLULEY
博客园 - 三生石上(FineUI控件)
Cisco Talos Blog
Cisco Talos Blog
小众软件
小众软件
Forbes - Security
Forbes - Security
D
Docker
T
Tenable Blog
S
Secure Thoughts
雷峰网
雷峰网
S
Security @ Cisco Blogs
T
The Exploit Database - CXSecurity.com
The Cloudflare Blog
博客园 - 【当耐特】
Spread Privacy
Spread Privacy
阮一峰的网络日志
阮一峰的网络日志

博客园 - 哥本哈士奇(aspnetx)

Raw Data Vault vs Business Data Vault Neo4j 多跳查询实战:从社交网络场景理解图遍历 Git 本地版本管理学习笔记 看完《低智商犯罪》,学习Cypher构建知识图谱 LangChain DeepAgents 学习笔记 LangChain Deepagent 版本0.6.1中间件一个bug 微软 SQL Server 版本演进史:从诞生到 SQL Server 2025 提升 Text2SQL 准确率 SQLServer Management Studio(SSMS) 22 Copilot 最佳实践学习笔记 SQLServer RAG笔记4:从服务层到前端交互 SQLServer RAG笔记5:为SQLServer 2025配置Ollama SQL Server RAG 笔记3:SQLServer2025 向量数据库 详解传统RAG、Text2SQL、Graph RAG:适用场景与问题示例汇总 SQL Server RAG 笔记2:图数据库服务层与前端可视化构建 SQL Server RAG 笔记1:图数据库构建 Neo4j 笔记(四):一篇文章如何入库的 数据仓库笔记 第六篇:PSA 层 SCD2 处理方式 数据仓库笔记 第五篇:Data Mart 层(数据集市) 数据仓库笔记 第四篇:Star Schema 层(维度建模) 数据仓库笔记 第三篇:常用缓慢变化维处理方式介绍 数据仓库笔记 第二篇:PSA 层(持久化暂存区)详解 数据仓库笔记 第一篇:数据仓库的定义、历史与意义 Neo4j 笔记(三):数据建模与程序连接实战 Neo4j 基础教程(二):Cypher CRUD 完全指南 Neo4j 基础教程(一):安装与快速入门 Power BI学习笔记第20篇:面试题汇总 · 第三篇:高级应用与最佳实践篇 Power BI学习笔记第19篇:面试题汇总 · 第二篇:数据建模与 DAX 篇 Power BI学习笔记第18篇:面试题汇总 · 第一篇:基础概念篇 Power BI学习笔记第15篇:企业级报表开发与最佳实践 Power BI学习笔记第13篇:高级可视化与自定义图表 Power BI学习笔记第14篇:Power Query 高级数据处理 Power BI学习笔记第12篇:DAX 高级计算与性能优化 Power BI学习笔记第11篇:高级数据建模与关系设计 Power BI学习笔记第10篇:实战案例 — 销售数据分析仪表板 Power BI学习笔记第08篇:报表交互与筛选器 Power BI学习笔记第09篇:Power BI Service 发布与共享 Power BI学习笔记第07篇:可视化图表设计与最佳实践 Power BI学习笔记第06篇:DAX 进阶:时间智能与复杂计算 Power BI学习笔记第05篇:DAX 基础:计算列与度量值 Power BI学习笔记第04篇:数据建模与关系管理 Power BI学习笔记第03篇:Power Query 数据清洗与转换 Power BI学习笔记第02篇:数据获取与连接数据源 Power BI学习笔记第01篇:Power BI 简介与环境搭建 Power BI Dashboard 常用布局方案推荐 Power BI 示例一览 OpenClaw 核心八大 MD 文件 Microsoft Agent Framework 智能体调用工具 Microsoft Agent Framework 创建智能体 一个简单案例理解OpenClaw的做梦过程 SQLAlchemy 学习笔记 LangChain RAG索引与查询 - 学习笔记 LangChain使用deep agent并且加载SKILL 本地系统对接大模型智能体的若干尝试 财务分析报告 - 常用Power BI DAX公式详解 用SKILL实现请假流程信息收集 使用小龙虾来操作猿编程的遥控车 使用OpenClaw的Skills对接本地系统 OpenClaw必装Skill全指南 Dify Agentic RAG 笔记 # 简单的神经网络计算过程 - 正负判断 使用Gradio构建AI前端 - RAG的QA模块 使用Gradio构建AI前端 - RAG召回测试 Streamlit + LangChain 1.0 简单实现智能问答前后端 利用AI Agent,辅助销售团队制定培训和考试内容 实现AI和BI整合的初步思路和探索-Part3 实现AI和BI整合的初步思路和探索-Part2 实现AI和BI整合的初步思路和探索 以《出师表》作为例子,对比通用分块和父子分块的区别 LangChain RAG 学习笔记:从文档加载到问答服务 记录无法修改OneDrive文件的解决方法 Power BI制作指标达成跟踪器 Power BI学习笔记-周报销售数据分析
Neo4j笔记(五):查询的处理流程
哥本哈士奇(aspnetx) · 2026-05-10 · via 博客园 - 哥本哈士奇(aspnetx)

Neo4j笔记(五):查询的处理流程

摘要

上一篇讲述了一篇文章如何通过LLM转换成Cypher,然后在Neo4J里运行,形成知识图谱。此篇接着上篇,继续梳理一个用户查询,如何通过图数据库以及大模型去汇总查询结果。

BTW:刚开始我尝试用langchain封装的方法,但后来发现langchaing的核心库以及对neo4j的封装,接口已经大变,很难对齐颗粒度,所以这里使用的方法是自己梳理的过程。


实现流程

整体流程图

flowchart TD A[用户提问] --> B[获取图谱 Schema] B --> C[LLM 生成 Cypher 查询] C --> D[Neo4j 执行查询] D --> E{查询成功?} E -->|是| F[获取查询结果] E -->|否| G[返回错误信息] F --> H[LLM 增强生成] H --> I[自然语言回答] G --> I style A fill:#f9f,stroke:#333,stroke-width:2px style I fill:#9f9,stroke:#333,stroke-width:2px

详细流程说明

sequenceDiagram participant User as 用户 participant LLM as 大语言模型 participant Neo4j as Neo4j图数据库 User->>LLM: 自然语言问题 + 图谱Schema LLM->>LLM: 生成 Cypher 查询语句 LLM-->>User: Cypher语句 User->>Neo4j: 执行 Cypher 查询 Neo4j-->>User: 返回查询结果 User->>LLM: 问题 + 查询结果 LLM->>LLM: 增强生成(总结回答) LLM-->>User: 自然语言回答

流程

  1. 用户提问 → 2. 获取图谱结构 → 3. 生成 Cypher → 4. 执行查询 → 5. LLM 汇总回答

大模型和图数据库的连接

环境配置

创建 .env 文件:

NEO4J_URL=bolt://localhost:7687
NEO4J_USER=neo4j
NEO4J_PASSWORD=your_password
OPENAI_API_KEY=your_api_key
OPENAI_BASE_URL=https://api.deepseek.com/v1

我这里用的是Deepseek,也可以根据自己的环境选择比如豆包,或者本地Ollama,或者Microsoft Foundry。

大模型调用

from langchain_openai import ChatOpenAI

llm = ChatOpenAI(
    model="deepseek-v4-flash",
    api_key=OPENAI_API_KEY,
    base_url=OPENAI_BASE_URL,
    temperature=0  # 设为 0 提高输出确定性
)

Neo4j 连接

from langchain_neo4j import Neo4jGraph

graph = Neo4jGraph(
    url=NEO4J_URL,
    username=NEO4J_USER,
    password=NEO4J_PASS
)

第一步:文本转知识图谱

核心思想:利用 LLM 将自然语言文本转换为 Cypher 语句,自动创建知识图谱。

def text_to_knowledge_graph(text):
    prompt = f"""
请将以下文本转换为 Neo4j Cypher 语句:

文本:{text}

要求:
1. 识别实体作为节点(Person、Location、Event 等)
2. 识别关系作为边(COOPERATE_WITH、PERFORMED_AT 等)
3. 使用 MERGE 语句避免重复
4. 只输出 Cypher 语句
"""
    cypher = llm.invoke(prompt).content
    # 清理 markdown 代码块标记
    if cypher.startswith('```'):
        cypher = cypher.split('\n', 1)[1].rsplit('\n', 1)[0]
    graph.query(cypher)

正巧昨天跟苏鹏老师聊起了郭德纲,所以这里就用郭德纲和于谦来做示例。

输入文本示例

郭德纲 1973年出生,相声演员,与于谦长期搭档,2005年爆红
于谦 1969年出生,相声演员,擅长捧哏,常年和郭德纲合作

生成的 Cypher

MERGE (g:Person {name: '郭德纲', birth_year: 1973, occupation: '相声演员'})
MERGE (y:Person {name: '于谦', birth_year: 1969, occupation: '相声演员'})
MERGE (g)-[:COOPERATE_WITH]->(y)

生成的知识图谱

img

第二步:获取图谱结构

目的:获取数据库的 schema 信息,为生成准确的 Cypher 查询提供上下文。这个思路跟TEXT2SQL基本是一致的。

这里我选择的是先从APOC插件中获取图谱的schema信息,如果失败,再从Neo4j数据库中获取。由于APOC不是默认被安装的,所以目标Neo4j环境很有可能没有这个插件。

def get_graph_schema():
    # 获取节点标签
    labels = graph.query("CALL db.labels() YIELD label RETURN collect(label)")
    # 获取关系类型
    rels = graph.query("CALL db.relationshipTypes() YIELD relationshipType RETURN collect(relationshipType)")
    # 获取属性键
    props = graph.query("CALL db.propertyKeys() YIELD propertyKey RETURN collect(propertyKey)")
    
    # 尝试使用 APOC(如果安装)
    try:
        apoc_schema = graph.query("CALL apoc.meta.data()")
        return {"labels": labels, "relationships": rels, "properties": props, "apoc": apoc_schema}
    except:
        return {"labels": labels, "relationships": rels, "properties": props}

APOC 安装方法(tar包安装)

  1. 下载对应版本的 APOC jar 文件
  2. 放入 neo4j/plugins/ 目录
  3. 修改 neo4j.conf
    apoc.enabled=true
    apoc.meta.data.allowlist.all=true
    
  4. 重启 Neo4j

第三步:生成 Cypher 查询并汇总增强生成结果

其它方法都已经准备好,最终再通过如下方法做调度:

def query_and_summarize(question):
    # 获取图谱结构
    schema = get_graph_schema()
    
    # 生成 Cypher
    cypher_prompt = f"""
图谱结构:{schema}
用户问题:{question}
请生成 Cypher 查询语句。
"""
    cypher = llm.invoke(cypher_prompt).content
    
    # 执行查询
    result = graph.query(cypher)
    
    # LLM 汇总
    summary = llm.invoke(f"问题:{question}\n结果:{result}\n请用自然语言回答").content
    return summary

常见问题与解决方案

问题:LLM 返回带 markdown 代码块

错误信息

Invalid input '```cypher': expected 'MATCH', 'MERGE', ...

某些模型会带一些前置和后置标记,有些不会,所以需要根据实际情况处理下。

解决方案:清理代码块标记

if cypher.startswith('```'):
    cypher = cypher.split('\n', 1)[1].rsplit('\n', 1)[0]

总结

  1. LLM 作为翻译器:将自然语言转换为 Cypher,降低图数据库使用门槛
  2. Schema 信息的重要性:提供结构信息能大幅提高 Cypher 生成的准确性
  3. APOC 的价值:提供元数据查询等高级功能,但非必需
  4. 错误处理:LLM 输出可能不规范,需做好清理和验证