知识图谱实战(三):图查询调用与 GraphRAG(完整代码)

知识图谱实战(三):图查询调用与 GraphRAG(完整代码)

图谱建好了怎么用?三层用法:Neo4j Browser 手动查、Python API 封装调用、和 LLM 结合做 GraphRAG(把图谱当"资料库"让大模型基于图谱回答)。这篇给完整可运行代码,收尾"采集→构建→调用"全流程。

前言

《知识图谱(一)数据采集》采数据、《知识图谱(二)Neo4j 构建》建图,这篇解决"怎么用":别人/系统怎么问知识图谱?答案分三种层次:

  1. 直接查:Neo4j Browser 里写 Cypher(《知识图谱(二)Neo4j 构建》讲过基础);
  2. 程序调用:Python 把图查询封装成函数,供业务系统调用;
  3. GraphRAG:把"图查询结果"当作事实喂给大模型,让 LLM 基于图谱回答——这是当前最火的结合方式,比纯 RAG(向量检索)更能回答"关系型问题"。
    在这里插入图片描述

一、Cypher 查询进阶(三种常见问题)

// 1. 某实体的所有直接关系
MATCH (n {name: '华为'})-[r]->(m) RETURN r.type AS 关系, m.name AS 对象;

// 2. 两实体之间有没有路径(几跳)
MATCH p = shortestPath((a {name: '任正非'})-[*..5]-(b {name: '深圳'}))
RETURN p;

// 3. 全图"枢纽"实体(关系最多的前 5 个)
MATCH (n)-[r]->() RETURN n.name AS 实体, count(r) AS 关系数
ORDER BY 关系数 DESC LIMIT 5;

shortestPath 回答"两人几度人脉"这类问题,是图的独有能力,SQL 很难写。

在这里插入图片描述

二、Python API 封装(供业务调用,完整代码)

pip install neo4j requests
# kg_query.py — 图查询 API 封装(完整可运行)
from neo4j import GraphDatabase

URI = "bolt://localhost:7687"
AUTH = ("neo4j", "12345678")      # 你的密码

driver = GraphDatabase.driver(URI, auth=AUTH)

def query_relations(entity):
    """查某实体的所有直接关系,返回 [(关系, 目标实体), ...]"""
    with driver.session() as session:
        result = session.run(
            "MATCH (n {name: $name})-[r]->(m) RETURN r.type AS rel, m.name AS target",
            name=entity)
        return [(rec["rel"], rec["target"]) for rec in result]

def query_neighbors(entity, hops=2):
    """查 N 跳内的邻居实体,返回 [(实体, 跳数), ...]"""
    with driver.session() as session:
        result = session.run(
            f"MATCH p = (n {{name: $name}})-[*1..{hops}]-(m) "
            "RETURN m.name AS target, length(p) AS depth LIMIT 20",
            name=entity)
        return [(rec["target"], rec["depth"]) for rec in result]

if __name__ == "__main__":
    print("华为的直接关系:", query_relations("华为"))
    print("任正非 2 跳邻居:", query_neighbors("任正非", 2))
    driver.close()

运行验证:python kg_query.py,期望打印出 《知识图谱(一)数据采集》/《知识图谱(二)Neo4j 构建》导入的三元组对应结果(如 华为的直接关系: [('总部位于', '深圳'), ('创始人', '任正非'), ...])——程序调用链路即通。

三、GraphRAG:图谱 + 大模型(完整代码)

核心思路:问题 → LLM 抽出实体 → 图库查该实体的周边事实 → 把事实拼给 LLM 回答。这样回答有"图谱依据",还能追关系链,比向量 RAG 更精确:

# kg_rag.py — GraphRAG(完整可运行;需本地 Ollama,见 《ControlNet 精准控图与 LoRA》装法)
import json
import requests
from neo4j import GraphDatabase

URI = "bolt://localhost:7687"
AUTH = ("neo4j", "12345678")
OLLAMA = "http://localhost:11434/api/generate"
MODEL = "qwen2.5:7b"

driver = GraphDatabase.driver(URI, auth=AUTH)

def extract_entities(question):
    """LLM 从问题中抽取实体名"""
    prompt = ("从问题中抽取实体名称,只输出 JSON 数组,例如 [\"华为\"]\n"
              f"问题:{question}")
    r = requests.post(OLLAMA, json={"model": MODEL, "prompt": prompt,
                                    "stream": False}, timeout=60)
    s = r.json()["response"]
    start, end = s.find("["), s.rfind("]") + 1
    return json.loads(s[start:end])

def graph_search(entity):
    """图库查询实体两跳内的关系事实"""
    with driver.session() as session:
        result = session.run(
            "MATCH (n {name: $name})-[r*1..2]-(m) "
            "RETURN n.name, m.name LIMIT 20", name=entity)
        lines = [f"{rec[0]} 与 {rec[1]} 存在关系" for rec in result]
        return ";".join(lines[:10]) or "图谱中未找到该实体"

def ask(question):
    entities = extract_entities(question)
    evidence = ";".join(graph_search(e) for e in entities)
    prompt = ("请仅依据以下图谱事实回答问题,事实不足时明确说明。\n"
              f"图谱事实:{evidence}\n问题:{question}")
    r = requests.post(OLLAMA, json={"model": MODEL, "prompt": prompt,
                                    "stream": False}, timeout=60)
    return r.json()["response"]

if __name__ == "__main__":
    print(ask("任正非和华为是什么关系?"))
    driver.close()

运行验证:先确认 Ollama 在跑(ollama list),再 python kg_rag.py,期望模型基于图谱事实回答"任正非是华为的创始人"这类答案(而不是瞎编)。实体没抽准/回答不对,先看"常见坑"。

四、RAG vs GraphRAG(什么时候用哪个)

对比 向量 RAG(《RAG 知识库实战》) GraphRAG(本篇)
数据形态 文档切片 + 向量 实体 + 关系图
擅长 "文档里有什么"模糊检索 "A 和 B 什么关系"精确查询
回答依据 相似段落 图结构事实
结合使用 两者互补:常规问答用 RAG,关系型问题走图谱

实践建议:文档多先上 RAG;关系密集(组织架构、供应链、人脉)再叠图谱——两个都做就是完整的"企业知识中台"。

五、常见坑

坑 解决
实体没抽准 提示词约束"从问题中提取名词实体";图谱里做实体归一化《知识图谱(一)数据采集》
图里查不到 实体名要和导入时一致(大小写/全称);先 MATCH (n) RETURN n.name 看有哪些
Ollama 没装/没启动 按 《ControlNet 精准控图与 LoRA》装 Ollama 并 ollama run qwen2.5:7b 拉模型
回答胡说 提示词里强调"仅依据图谱事实";事实不足要求"明确说明"
数据太少答不了 扩充采集《知识图谱(一)数据采集》+ 导入《知识图谱(二)Neo4j 构建》数据量

六、总结

  • 一句话:图谱调用 = Cypher 查询 + Python 封装 + GraphRAG 喂给大模型;
  • 三篇连起来就是完整闭环:47 采集抽取 → 48 Neo4j 建图 → 49 查询与 GraphRAG——从数据到可用的知识图谱服务;
  • 接单角度:企业知识图谱问答、智能档案检索、供应链关系分析都能用这套骨架交付,加界面/接口就是完整产品。

觉得有用点个赞收藏,知识图谱三连篇完结,有问题评论区见。

posted @ 2026-08-14 01:54  橘和柠  阅读(8)  评论(0)    收藏  举报