# graphrag **Repository Path**: itluma2008/graphrag ## Basic Information - **Project Name**: graphrag - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2026-05-19 - **Last Updated**: 2026-05-20 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README 1、RAG基础:从入门到精通 1.1 RAG介绍 1.2 构建RAG应用 索引:文档加载、文本分块、向量嵌入和存储 检索:相似度、最大边际相关性 生成:LCEL、历史对话、重述用户问题 1.3 评估和优化 无参考评估:查询的文本、检索的上下文、回复的内容 RAGAS:使用LLM作为“评委”自动打分,上下文相关性、答案的相关性、忠实度、响应的真实性 a、多查询 b、HyDE c、重排序 RRF 重排序模型 d、混合检索 关键词(BM25)+相似度 A -> B -> C Advanced RAG -> GraphRAG -> Agentic RAG “知识图谱”Graph:人物关系 2、作业 第 1 题:查询所有电影的片名和上映年份,按年份升序排列 - 返回列名分别为"片名"和"年份" - 结果按年份从早到晚排列 MATCH (m:Movie) RETURN m.title, m.year ORDER BY m.year asc 第 2 题:找出评分高于 8.5 分的电影,返回片名和评分 - 使用 WHERE 过滤 rating 属性(严格大于 8.5) - 结果按评分从高到低排列 - 返回列名为"片名"和"评分" MATCH (m:Movie) WHERE m.rating > 8.5 RETURN m.title,m.rating ORDER BY m.rating DESC 第 3 题:查询张艺谋导演过的所有电影,返回片名、年份和该片是否获奖 - 通过 DIRECTED 关系从 Person 节点出发匹配 Movie - 获奖信息取自关系属性 award(布尔值) - 结果按年份升序排列 MATCH (p:Person{name:"张艺谋"})-[r:DIRECTED]->(m:Movie) RETURN m.title AS 片名, m.year AS 年份, r.award AS 获奖 ORDER BY m.year 第 4 题:查询巩俐参演过的所有电影及她扮演的角色 - 通过 ACTED_IN 关系匹配,取关系属性 role 作为角色名 - 同时返回该角色是否获奖(award 属性) - 返回列名为"电影""角色""获奖" MATCH (p:Person{name:"巩俐"})-[r:ACTED_IN]->(m:Movie) RETURN m.title, r.role, r.award 第 5 题:统计每位导演执导的电影数量,按数量降序排列 - 遍历所有 DIRECTED 关系,用 COUNT() 聚合 - 返回列名为"导演"和"执导数量" - 结果按执导数量从多到少排列 MATCH (p:Person)-[:DIRECTED]->(m:Movie) RETURN p.name AS 导演, count(m) as 执导数量 ORDER BY 执导数量 DESC 第 6 题:找出既是导演又是演员的人,列出姓名 - 同一个 Person 节点同时拥有 DIRECTED 和 ACTED_IN 出边 - 用 EXISTS { } 子句或两次 MATCH 实现 - 用 DISTINCT 去重,只返回姓名 MATCH (p:Person)-[:DIRECTED]->(m:Movie) MATCH (p)-[:ACTED_IN]->(:Movie) RETURN DISTINCT p.name AS 姓名 MATCH (p:Person)-[:DIRECTED]->(m:Movie) WHERE EXISTS {(p)-[:ACTED_IN]->(:Movie) } RETURN DISTINCT p.name AS 姓名 第 7 题:查询与张艺谋共同参演过同一部电影的演员 - 两个 Person 各自通过 ACTED_IN 指向同一个 Movie 节点 - 排除张艺谋本人(co <> zhang) - 返回合作演员姓名和共同电影名,用 DISTINCT 去重 OPTIONAL MATCH (p:Person{name:"张艺谋"})-[:ACTED_IN]->(m:Movie)<-[:ACTED_IN]-(co:Person) WHERE p <> co RETURN DISTINCT co.name as 合作演员,m.title AS 共同电影 第 8 题:查询张艺谋直接关注的人,以及这些人各自关注的人(二度关注) - 第一跳:张艺谋 -[:FOLLOWS]→ 直接关注者 - 第二跳:直接关注者 -[:FOLLOWS]→ 二度关注者(用 OPTIONAL MATCH) - 排除张艺谋自身出现在二度列表中 - 用 COLLECT(DISTINCT …) 将二度关注者收集成列表 MATCH (p:Person{name:"张艺谋"})-[:FOLLOWS]->(first:Person) OPTIONAL MATCH (first)-[:FOLLOWS]->(second:Person) WHERE p <> second RETURN first.name as 直接关注者,collect( DISTINCT second.name) AS 二度关注 MATCH(inner join):找不到就整行丢弃 OPTIONAL MATCH(left join):找不到就返回Null,但这一行保留 第 9 题:计算每位演员参演电影的平均评分,只保留参演 2 部以上的演员 - 用 AVG() 计算平均评分,COUNT() 统计参演数 - 先用 WITH 承接聚合结果,再用 WHERE 过滤参演数 ≥ 2 - 平均评分保留一位小数,结果按平均评分降序排列 MATCH (p:Person)-[:ACTED_IN]->(m:Movie) WITH p.name AS 演员, count(m) as 参演数, round(avg(m.rating)*10)/10 as 平均分 WHERE 参演数>=2 RETURN 演员, 参演数,平均分 ORDER BY 平均分 DESC 第 10 题:找出粉丝最多的 3 位明星,并列出其评分最高的一部作品(参演或执导均算) - 统计被 FOLLOWS 的次数(入度),取前 3 名 - 用 OPTIONAL MATCH 匹配该明星参演或执导的所有电影(DIRECTED|ACTED_IN) - 按电影评分降序排列后,用 COLLECT()[0] 取评分最高一部作为代表作 - 最终返回:明星姓名、粉丝数、代表作 MATCH (fan:Person)-[:FOLLOWS]->(star:Person) WITH star, count(fan) as 粉丝数 ORDER BY 粉丝数 DESC LIMIT 3 OPTIONAL MATCH (star)-[:DIRECTED|ACTED_IN]->(m:Movie) WITH star.name AS 明星, 粉丝数, m ORDER BY m.rating DESC return 明星, 粉丝数, collect(m.title)[0] AS 代表作 导出:neo4j-admin database dump neo4j --to-path=D:/LLM/graphgrag/data --overwrite-destination=true 导入: neo4j stop neo4j-admin database load neo4j --from-path=D:/LLM/graphgrag/data --overwrite-destination=true neo4j start 3、构建图谱索引:采用混合索引进行检索 3.1 向量索引:语义问题 3.2 全文索引:关键词匹配问题 “找和`运动鞋`语义相近的商品”--》向量索引-》跑步鞋、球鞋 找名称中精确包含 Nike 的品牌--》全文索引-》精确匹配 一句话:向量检索主要解决意思像不像,而全文检索字面有没有 全文索引:本质上就是倒排索引,先把文本切成词,再建立 “词-》包含这个词的节点” 的映射表 “Nike 运动鞋2024” -> 分词 -> ["Nike", "运动鞋", "2024"] 倒排表: Nike ->[节点A, 节点C, 节点F] 运动鞋 ->[节点A, 节点B, 节点D] 2024 ->[节点A, 节点E] 混合检索: 用户输入:“找跑鞋” 全文索引:精确找到含“跑鞋”关键词的节点 =》召回集 A 向量索引:语义中找“运动鞋”, "球鞋"等近义词 =》召回集 B 合并去重-》送入LLM生成答辩 4、实现GraphRAG的流程: a、用户输入|历史聊天内容 b、路由标签:通过大模型识别入口的节点类型+实体 c、节点检索(难点): User->Cypher直查 其他->向量+全文混合检索 d、Cypher语句生成:LLM根据入口节点+schema生成(Text2Sql) e、Cypher语句校验:语法校验(explain)+LLM逻辑验证 f、Cypher语句校正:LLM根据错误信息修正 g、执行Cypher语句:cypher_correcory+dirver.execute_query h、返回list[Document] 核心思路就是将自然语言转化为Cypher查询语句,从Neo4J图数据库中精确检索结构化知识。整体分六个阶段: 阶段一:路由标签识别:用LLM分析用户输入,识别查询涉及到哪些知识图谱的节点类型(SKU、SPU、Category1) 阶段二:入口节点检索 阶段三:生成Cypher语句 阶段四:Cypher语句验证 阶段五:Cypher语句校正 阶段六:执行并返回 重点: 1、混合索引的生成 2、混合检索的异步并发设计 3、多级Cypher质量保障机制:生成-》语法验证-》逻辑验证-》LLM校正-》规则校正 explain检查语法错误速度快,LLM验证覆盖逻辑错误(比如关系方向、缺少用户过滤条件),最后CypherQueryCorrector基于Schema做规则兜底 4、结构化输出:with_structured_output(RouteOutput) 5、Prompt工程设计 AI发展:说清楚(Prompt)->提供资料(Context RAG)->执行(Agent:Agent_Skills|OpenClaw|Harnes) 企业考察点: 1、稳定性方面:Cypher校正只执行一次,在实际情况下最好改成循环校正,同时execute_query应该增加一个超时控制 2、安全性方面:LLM生成Cypher存在注入风险,不可直接拼接用户输入。MATCH|RETURN DELETE 3、成本与延迟方面:缓存 4、可观测性:日志 5、模型选择:qwen\deepseek\gpt\glm qwen3-coder-480b