行业资讯
📅 2026/9/6 6:29:46
DeepGraph:实现“选中即问”的知识图谱语义查询方案
之前在业务梳理过程中遇到最多的一个需求是“能不能让我像用搜索引擎一样直接选中一段话就让系统自动给我找出相关的实体、关系和数据答案”传统知识图谱查询通常依赖 Cypher、SPARQL、甚至是复杂的图数据库 API非技术用户根本没法上手。为了解决这个问题我在项目里尝试封装了一套基于“选中即问”交互模式的知识图谱语义查询方案并把它命名为 DeepGraph。这篇文章会把 DeepGraph 从交互设计到核心代码实现完整拆开讲清楚“选中即问”的内部逻辑、实体识别与图谱查询的实现思路、常见报错排查以及生产落地的工程建议。内容偏向实战既有概念讲解也有可直接运行的代码示例适合对知识图谱、自然语言处理、后端接口封装感兴趣的开发者。1. DeepGraph 是什么“选中即问”要解决什么问题1.1 传统知识图谱查询的痛点知识图谱的价值在于把散落的数据组织成“实体—关系—实体”的结构化网络。但在实际使用中真正能从中拿到答案的人并不多原因主要有几个。第一查询门槛高。普通用户不会写 Cypher比如要查“张三在哪个部门”需要写MATCH (p:Person {name:张三})-[:BELONGS_TO]-(d:Department) RETURN d.name;这行语句对开发人员来说很简单但业务人员看到MATCH、RETURN就已经放弃了。第二交互链路长。用户得先知道图里有哪种实体类型、哪种关系类型才能构造出合法查询一旦关系名写错结果就是空的。第三结果不直观。传统的图查询返回的是节点和边的集合用户还要自己从上亿节点里找自己关心的那一部分。1.2 DeepGraph 的交互创新“选中即问”“选中即问”的思路非常直接用户不需要学习任何查询语言只需要在展示文本的页面里用鼠标选中一段文字系统就自动完成四件事识别选中文本中出现的实体。判断用户的查询意图例如“查属性”“查关系”“查路径”。将意图和实体转换为知识图谱查询语句。把查询结果渲染成通俗的答案并返回给前端。也就是说DeepGraph 是一个位于“用户”和“图数据库”之间的语义查询中间层。它把原来需要人工完成的「读文本—找实体—写查询」过程变成了一条自动化流水线。1.3 DeepGraph 的典型应用场景“选中即问”在以下场景中有很高的实用价值。企业知识库检索员工在规章制度文档中选中“离职流程”系统自动关联流程节点和负责部门。医疗辅助查询医生在病历文本中选中某个症状组合系统返回可能的诊断路径与药品关系。电商商品洞察运营在评论内容中选中“物流慢”系统自动分析相关商品、仓库和投诉记录的关系。科研文献分析研究者在论文摘要中选中某个方法名系统展示该方法对应的数据集、引用关系和演进路径。可以看到DeepGraph 本身并不绑定特定领域它更多的是一种“语义查询中间件”的架构思路。只要你的业务数据结构能建模成图就可以用上这套交互方式。2. DeepGraph 整体架构与核心流程2.1 架构分层DeepGraph 的架构可以分为四层层级职责核心组件交互层捕获用户选中的文本展示查询结果前端 JS、富文本组件语义理解层实体识别、意图分类、查询语句生成NLP 模型、规则引擎数据服务层连接图数据库执行查询格式化返回Neo4j Driver、REST API图谱存储层存储节点、关系、属性Neo4j、JanusGraph、NebulaGraph其中最关键的是语义理解层和数据服务层之间的配合。语义理解层将自然语言转换成查询条件数据服务层再根据查询条件去图里找答案。2.2 “选中即问”的完整请求链路一次“选中即问”的完整调用流程如下用户在前端页面选中一段文本。前端弹出悬浮按钮“提问”或“解释”。点击按钮后前端将选中文本 POST 到 DeepGraph 接口。DeepGraph 先做实体识别找出文本中的实体词。再做意图分类确定本次查询类型。根据实体和意图生成对应的图查询语句。执行查询并将结果封装为标准 JSON 结构。前端解析 JSON用卡片、列表或图可视化方式渲染。为了便于理解可以用一张流程列表代替复杂的架构图选中文本 - 实体识别 - 意图识别 - 查询生成 - 图谱查询 - 结果渲染2.3 DeepGraph 与普通全文检索的区别有朋友可能会问这不就是搜索吗我用 Elasticsearch 也能实现类似效果。这里需要区分两种思路。全文检索是基于关键词的倒排索引匹配适合“文档级检索”返回的是“哪些文档包含这个词”。DeepGraph 是基于实体关系的语义查询返回的是“实体之间的关系与属性答案”可以做到跨文档推理。举个例子。用户选中“A 公司投资了 B 公司B 公司的创始人是谁”全文检索能找到包含“B公司”的文档但很难直接告诉你创始人的名字。DeepGraph 可以通过图谱路径A公司 - 投资 - B公司 - 创始人 - 王某某直接给出答案。这就是选中即问的核心价值不是找到文档而是直接找到答案。3. 环境准备与图数据模型设计3.1 实验环境说明本文中的示例以常见稳定环境为准。版本信息请结合你自己的项目调整重点理解配置思路。操作系统Windows 10 / macOS / Linux 均可。Python 版本3.8 及以上。图数据库Neo4j Community 4.x 或 5.x。Web 框架Flask 2.x 或 FastAPI。实体识别组件HanLP 或 jieba 自定义词典。前端原生 JavaScript 简单 HTML 页面。建议在本地先安装 Neo4j Desktop 或通过 Docker 启动 Neo4j便于快速调试。3.2 图数据模型设计这里以“企业投资关系查询”作为示例场景因为它的关系结构清晰适合演示“选中即问”。定义三类节点公司节点属性有 name、industry、founded_year。人员节点属性有 name、position。产品节点属性有 name、category。定义三类关系(Company)-[:INVESTS]-(Company)表示投资关系属性有 amount、date。(Person)-[:FOUNDED]-(Company)表示创立关系。(Company)-[:PRODUCES]-(Product)表示公司生产某产品。在 Neo4j 中可以通过 Cypher 创建示例数据CREATE (c1:Company {name:云帆科技, industry:人工智能, founded_year:2015}); CREATE (c2:Company {name:蓝湖数据, industry:大数据, founded_year:2018}); CREATE (p1:Person {name:张明, position:CEO}); CREATE (p2:Person {name:李婷, position:CTO}); CREATE (p3:Product {name:DataFlow 平台, category:数据中台}); CREATE (c1)-[:INVESTS {amount:500, date:2023-06-01}]-(c2); CREATE (p1)-[:FOUNDED]-(c1); CREATE (p2)-[:FOUNDED]-(c2); CREATE (c1)-[:PRODUCES]-(p3);这个数据模型非常简单但它足够覆盖实体属性查询、关系查询、路径查询三类基本意图。3.3 为什么选 Neo4j 做演示Neo4j 是目前生态最成熟的图数据库之一Cypher 查询语言易读性好而且 Python 的neo4j驱动使用简单。本文的核心是 DeepGraph 的“选中即问”交互封装而不是图数据库选型对比所以用 Neo4j 做演示最合适。如果你后续要切换到其他图数据库只需要替换数据服务层的查询语法和驱动即可上层的语义理解层可以复用。4. DeepGraph 核心模块实现下面进入代码实现部分。我们将按模块拆解最后整合成一个可运行的 Flask 应用。4.1 项目结构建议先创建如下目录结构deepgraph-demo/ ├── app.py ├── graph_service.py ├── semantic_parser.py ├── entity_recognizer.py ├── templates/ │ └── index.html └── requirements.txtapp.pyFlask 主程序负责接收前端请求并返回结果。semantic_parser.py意图识别与查询语句生成。entity_recognizer.py实体识别模块。graph_service.py图数据库连接与查询执行。templates/index.html前端演示页面。4.2 实体识别模块实体识别是整个流程的第一步。如果实体都识别不准后面的意图识别和查询生成就失去了意义。为了减少对第三方模型的重度依赖这里采用“词典 规则”的方式实现。你可以提前把业务中的核心实体词放入词典文件也可以让系统在每次查询前动态加载数据库中的实体名称作为候选词。# 文件路径deepgraph-demo/entity_recognizer.py import jieba import re class EntityRecognizer: def __init__(self, entity_dict): entity_dict: 形如 {COMPANY: [云帆科技, 蓝湖数据], PERSON: [张明, 李婷]} self.entity_dict entity_dict self.type_map {} for entity_type, words in entity_dict.items(): for word in words: self.type_map[word] entity_type jieba.add_word(word) def recognize(self, text): 基于词典匹配 jieba 分词识别实体。 返回 [{word: 云帆科技, type: COMPANY, offset: 0}, ...] results [] # 先做词典精确匹配 for entity_type, words in self.entity_dict.items(): for word in words: start_idx 0 while True: pos text.find(word, start_idx) if pos -1: break results.append({ word: word, type: entity_type, offset: pos }) start_idx pos len(word) # 再用 jieba 分词做补充识别避免纯词典漏掉组合词 seg_list jieba.lcut(text) for seg in seg_list: if seg in self.type_map and seg not in [r[word] for r in results]: results.append({ word: seg, type: self.type_map[seg], offset: text.find(seg) }) # 按出现位置去重排序 seen set() unique_results [] for item in sorted(results, keylambda x: x[offset]): key (item[word], item[offset]) if key not in seen: seen.add(key) unique_results.append(item) return unique_results这个模块的优点是逻辑透明不依赖复杂模型上线后也方便调试。如果企业数据量增大可以替换为基于 BERT 的序列标注模型但接口可以保持一致。4.3 意图识别与查询生成实体识别完成后我们需要知道用户到底想问什么。比如同样包含“云帆科技”不同问法对应不同查询意图“云帆科技成立几年了” → 属性查询“云帆科技投资了哪些公司” → 关系查询“张明和云帆科技是什么关系” → 路径查询这里用关键词规则来做意图分类。生产环境如果意图种类特别多建议引入意图分类模型。# 文件路径deepgraph-demo/semantic_parser.py from entity_recognizer import EntityRecognizer class SemanticParser: def __init__(self, entity_recognizer: EntityRecognizer): self.recognizer entity_recognizer def parse(self, text): entities self.recognizer.recognize(text) intent self._classify_intent(text) return { entities: entities, intent: intent } def _classify_intent(self, text): if any(w in text for w in [成立, 创建, 哪年, 时间, 创始人, 是谁]): return ATTRIBUTE_QUERY if any(w in text for w in [投资, 生产, 旗下, 合作, 关系]): return RELATION_QUERY if any(w in text for w in [什么关系, 怎么关联, 路径]): return PATH_QUERY return ATTRIBUTE_QUERY def generate_cypher(self, parsed): 根据意图和实体生成 Cypher 查询。 这里是核心拼接逻辑生产环境需要更严格的校验。 intent parsed[intent] entities parsed[entities] if not entities: return None if intent ATTRIBUTE_QUERY: return self._build_attribute_query(entities) if intent RELATION_QUERY: return self._build_relation_query(entities) if intent PATH_QUERY: return self._build_path_query(entities) return None def _build_attribute_query(self, entities): # 简化示例只取第一个实体作为主体 entity entities[0] word entity[word] entity_type entity[type] # 这里不写死属性名而是返回所有属性由后续逻辑筛选 return fMATCH (n:{entity_type} {{name: {word}}}) RETURN properties(n) AS props; def _build_relation_query(self, entities): # 示例查询公司投资了哪些公司 entity entities[0] word entity[word] entity_type entity[type] return f MATCH (n:{entity_type} {{name: {word}}})-[r]-(m) RETURN type(r) AS relation, m.name AS target_name, labels(m)[0] AS target_type, r LIMIT 50; def _build_path_query(self, entities): if len(entities) 2: return None node_a entities[0] node_b entities[1] return f MATCH p shortestPath( (a:{node_a[type]} {{name: {node_a[word]}}})-[*..4]- (b:{node_b[type]} {{name: {node_b[word]}}}) ) RETURN p LIMIT 1; 这里需要特别强调不要把变量直接拼接进 Cypher上面只是演示思路。实际项目中必须使用 Neo4j 驱动提供的参数化查询防止 Cypher 注入。后面我们会给出参数化版本的查询代码。4.4 图数据库服务层图数据库服务层负责连接 Neo4j、执行查询、标准化返回结果。这里把查询和结果封装成GraphService类。# 文件路径deepgraph-demo/graph_service.py from neo4j import GraphDatabase class GraphService: def __init__(self, uri, user, password): self.driver GraphDatabase.driver(uri, auth(user, password)) def close(self): self.driver.close() def execute_query(self, cypher, parametersNone): 执行 Cypher 查询返回 list[dict] 格式结果。 if parameters is None: parameters {} records [] with self.driver.session() as session: result session.run(cypher, parameters) for record in result: records.append(record.data()) return records def search_entities_by_name(self, name): 根据名称模糊查询所有匹配节点。 供前端做联想、校验使用。 cypher MATCH (n) WHERE n.name CONTAINS $name RETURN n.name AS name, labels(n)[0] AS entity_type LIMIT 20; return self.execute_query(cypher, {name: name})参数化查询避免了字符串拼接带来的安全问题。上面的search_entities_by_name方法就使用了$name参数占位符。4.5 完整查询接口封装有了语义解析和图数据库服务接下来将它们组合成 Flask 接口。# 文件路径deepgraph-demo/app.py import json from flask import Flask, request, jsonify, render_template from entity_recognizer import EntityRecognizer from semantic_parser import SemanticParser from graph_service import GraphService app Flask(__name__) # 配置图数据库连接 GRAPH_CONFIG { uri: bolt://localhost:7687, user: neo4j, password: your_password } # 初始化实体词典 ENTITY_DICT { COMPANY: [云帆科技, 蓝湖数据], PERSON: [张明, 李婷], PRODUCT: [DataFlow 平台] } recognizer EntityRecognizer(ENTITY_DICT) parser SemanticParser(recognizer) graph_service GraphService(**GRAPH_CONFIG) app.route(/) def index(): return render_template(index.html) app.route(/api/ask, methods[POST]) def ask(): data request.get_json() text data.get(text, ).strip() if not text: return jsonify({code: 400, message: 选中文本不能为空}), 400 # 1. 语义解析 parsed parser.parse(text) entities parsed[entities] intent parsed[intent] if not entities: return jsonify({code: 404, message: 未识别到实体请换一种说法}), 404 # 2. 生成 Cypher cypher parser.generate_cypher(parsed) if not cypher: return jsonify({code: 404, message: 无法根据当前意图生成查询}), 404 # 3. 执行图谱查询 records graph_service.execute_query(cypher) # 4. 组装返回结果 result { code: 0, data: { intent: intent, entities: entities, cypher: cypher, records: records } } return jsonify(result, ensure_asciiFalse) app.route(/api/search_entity, methods[GET]) def search_entity(): name request.args.get(name, ) if not name: return jsonify({code: 400, message: 缺少name参数}), 400 records graph_service.search_entities_by_name(name) return jsonify({code: 0, data: records}, ensure_asciiFalse) if __name__ __main__: app.run(host0.0.0.0, port5000, debugTrue)ensure_asciiFalse是为了让返回的 JSON 中中文正常显示。实际开发中建议不要开启 debug 模式。5. 前端如何实现“选中即问”交互后端接口已经就绪前端要实现的核心能力是捕获用户选中的文本、弹出操作按钮、调用/api/ask接口、渲染返回结果。这里直接使用原生 JavaScript 实现不依赖前端框架方便大家直接跑通流程。5.1 前端页面结构!DOCTYPE html html langzh-CN head meta charsetUTF-8 titleDeepGraph 选中即问演示/title style body { font-family: Microsoft YaHei, sans-serif; max-width: 900px; margin: 40px auto; padding: 0 20px; line-height: 1.8; color: #333; } .highlight { background: #fff3cd; cursor: pointer; } #float-btn { position: fixed; display: none; background: #4a7cf7; color: #fff; border: none; padding: 6px 14px; border-radius: 6px; cursor: pointer; font-size: 14px; z-index: 9999; } #result-box { margin-top: 24px; border: 1px solid #e0e0e0; border-radius: 8px; padding: 16px; background: #fafafa; } .tag { display: inline-block; background: #e8f0fe; color: #1a56db; border-radius: 4px; padding: 2px 8px; margin-right: 8px; font-size: 13px; } /style /head body h2DeepGraph 选中即问演示/h2 p 请用鼠标选中下面文本中的任意实体或描述系统将自动调用后端接口返回知识图谱查询结果。 /p div idarticle 云帆科技是一家专注于人工智能领域的公司成立于2015年。2023年云帆科技投资了蓝湖数据。蓝湖数据的创始人是李婷。云帆科技旗下产品包括 DataFlow 平台。 张明是云帆科技的 CEO。 /div button idfloat-btn提问/button div idresult-box strong查询结果/strong div idresult-content选中文本后点击“提问”按钮查看结果。/div /div script src/static/demo.js/script /body /html这里把按钮放在页面中使用position: fixed定位当捕获选中事件时再移动到鼠标附近显示。5.2 前端捕获选中事件并调用接口// 文件路径deepgraph-demo/static/demo.js let selectedText ; function getSelectedText() { const selection window.getSelection(); if (selection selection.toString().trim()) { return selection.toString().trim(); } return ; } function showFloatBtn(x, y) { const btn document.getElementById(float-btn); btn.style.display block; btn.style.left (x 10) px; btn.style.top (y - 40) px; } function hideFloatBtn() { const btn document.getElementById(float-btn); btn.style.display none; } document.addEventListener(mouseup, function (event) { const text getSelectedText(); if (text) { selectedText text; showFloatBtn(event.clientX, event.clientY); } else { hideFloatBtn(); } }); document.getElementById(float-btn).addEventListener(click, async function () { if (!selectedText) { return; } try { const response await fetch(/api/ask, { method: POST, headers: { Content-Type: application/json }, body: JSON.stringify({ text: selectedText }) }); const result await response.json(); renderResult(result); } catch (error) { document.getElementById(result-content).innerHTML span stylecolor:red请求失败 error /span; } }); function renderResult(result) { const content document.getElementById(result-content); if (result.code ! 0) { content.innerHTML span stylecolor:red result.message /span; return; } const data result.data; let html div识别意图span classtag${data.intent}/span/div; html div stylemargin-top:8px识别实体; data.entities.forEach(entity { html span classtag${entity.word} (${entity.type})/span; }); html /div; if (data.cypher) { html div stylemargin-top:8pxstrong生成的Cypher/strongbrcode${data.cypher}/code/div; } if (data.records data.records.length 0) { html div stylemargin-top:12pxstrong图谱查询结果/strong/div; html ul; data.records.forEach(record { html li JSON.stringify(record, null, 2) /li; }); html /ul; } else { html div stylemargin-top:12px图谱中没有查询到相关结果。/div; } content.innerHTML html; }前端实现的要点在于mouseup事件。mouseup在鼠标左键抬起时触发此时通过window.getSelection()拿到用户选中的内容。拿到内容后显示一个“提问”悬浮按钮点击后再发起后端请求。这里是最简演示逻辑生产环境还需要考虑点击按钮时触发mouseup造成按钮消失的问题、触摸屏适配、多选框样式等问题。6. 运行项目并验证效果6.1 安装依赖在项目根目录执行pip install flask neo4j jieba如果你的环境比较干净也可以把依赖写入requirements.txtflask2.0 neo4j5.0 jieba0.42.1然后执行pip install -r requirements.txt6.2 启动 Neo4j 并导入示例数据确保 Neo4j 已启动然后在 Neo4j Browser 中运行第 3.2 小节的建数据语句。修改app.py中的数据库密码为你的实际密码GRAPH_CONFIG { uri: bolt://localhost:7687, user: neo4j, password: your_password }6.3 启动 Flask 应用在项目根目录执行python app.py浏览器访问http://localhost:5000在页面文本中选中“云帆科技成立于2015年”中的“云帆科技”点击“提问”按钮后端会返回实体类型和查询结果。预期结果类似{ code: 0, data: { intent: ATTRIBUTE_QUERY, entities: [ { word: 云帆科技, type: COMPANY, offset: 0 } ], cypher: MATCH (n:COMPANY {name: 云帆科技}) RETURN properties(n) AS props;, records: [ { props: { name: 云帆科技, industry: 人工智能, founded_year: 2015 } } ] } }如果你选中“云帆科技投资了哪些公司”意图分类会命中RELATION_QUERY返回投资关系目标节点信息。7. 常见问题与排查思路在实际开发中比较常见的问题集中在实体识别、意图误判、查询生成和数据库连接这几块。问题现象常见原因解决思路接口返回“未识别到实体”实体词典里没有覆盖选中的词检查ENTITY_DICT把业务高频词加入词典或者定期从图数据库中同步实体名称实体识别出来多个词但都属于同一实体类型查询结果不准确词典匹配过于激进把长词拆成了短词增加最长匹配优先策略给 jieba 自定义词典添加完整词意图分类错误关键词规则覆盖不足同义表达多扩充同义词规则生产环境建议使用文本分类模型Cypher 语法错误Neo4j 版本差异或者属性名写错先在 Neo4j Browser 中手动运行生成的 Cypher 验证查询结果返回为空图数据库中没有该实体调用/api/search_entity模糊查询确认节点是否存在前端点击按钮后悬浮按钮消失mouseup事件和按钮点击事件冲突给按钮点击事件添加event.stopPropagation()或使用mousedown延迟关闭中文乱码Flask 返回 JSON 默认 ASCII 编码在jsonify中传入ensure_asciiFalse或者让前端用 UTF-8 解析如果项目中的查询需求比较复杂建议先做一个“Cypher 调试页面”把生成的查询语句和参数展示出来。Debug 的时候能看到真实查询能省大量排查时间。8. 生产环境落地的最佳实践8.1 安全与权限控制“选中即问”本质上是把自然语言转换为图查询因此必须把安全问题放在第一位。第一一定要使用参数化查询。不要像示例中简单直接拼接字符串。在上文semantic_parser.py中只是为了演示逻辑用了 f-string真正的生产代码应该返回结构化的查询参数再由graph_service执行。# 安全写法示例 cypher MATCH (n:Company {name: $name}) RETURN properties(n) AS props; params {name: 云帆科技}第二接口要有鉴权机制。/api/ask如果暴露在公网别人可以任意传文本进来对图数据库发起大量查询。建议至少加上 Token 校验、IP 白名单、调用频率限制。第三对查询结果做脱敏。知识图谱中可能包含员工手机号、薪资、内部业务数据等敏感属性。接口返回前要按角色过滤属性不能把所有properties(n)一股脑返回。8.2 查询性能优化图数据库查询的响应时间直接影响“选中即问”的交互体验。重点优化以下几个方面。为实体的name属性创建索引或唯一约束。查询中使用LIMIT控制返回量。避免高成本的[*..]不定长路径查询限制路径最大深度。对高频查询做结果缓存。例如相同实体和意图组合可以在 Redis 中设置 5 分钟缓存。对复杂路径查询设置超时时间避免慢查询拖垮数据库。Neo4j 建索引示例CREATE INDEX company_name_index FOR (n:Company) ON (n.name); CREATE INDEX person_name_index FOR (n:Person) ON (n.name);8.3 实体识别的工程化升级简单词典匹配在业务初期够用但一旦遇到以下情况就会吃力用户用缩写或别名指代实体例如“云帆”指代“云帆科技”。不同实体同名需要结合上下文消歧。文本中实体数量很多需要判断“当前选中文本中最核心的实体”。生产环境建议采用“词典匹配 预训练模型”融合的方式。先用词典做快速召回再用序列标注模型处理长尾实体最后用实体的上下文向量做实体链接。8.4 意图识别的工程化升级规则关键词的维护成本会随着业务复杂度快速上升。当意图类别超过 10 类时建议使用小样本意图分类模型例如基于 Sentence-BERT 的语义相似度匹配。将历史点击数据积累为训练集持续迭代模型。在意图置信度低于阈值时返回候选意图列表由前端引导用户确认。8.5 配置管理与版本发布DeepGraph 服务涉及词典、模型、Cypher 模板、图数据库连接等多个配置。生产环境建议配置文件与代码仓库分离使用环境变量或配置中心管理。图数据库密码不要写在代码里配置中心统一管理。实体词典和查询模板升级时先做灰度发布观察接口错误率。发布前在测试环境完整跑一遍核心查询用例。8.6 日志与监控一套完整的日志体系能让异常排查效率大幅提升。至少需要记录以下信息请求原文用户选中了哪段文本。实体识别结果识别出了哪些实体、置信度如何。意图分类结果命中了哪类意图。生成的 Cypher建议脱敏后记录便于复现问题。查询耗时按接口、意图、实体类型维度做统计。图数据库异常连接超时、Cypher 执行异常等。监控指标中重点观察/api/ask的 P95 耗时时长、实体识别覆盖率、意图分类准确率、查询空结果率。如果空结果率偏高很可能是实体词典覆盖不足或者图谱数据缺失。9. 后续扩展方向目前这套 DeepGraph 演示版已经能跑通“选中即问”的最小闭环。如果你想在此基础上继续深入可以考虑以下几个方向。多轮会话当前实现是单轮问答。可以引入会话管理让用户在上一轮结果基础上继续提问例如“它投资了哪些公司”中的“它”指代上一轮的“云帆科技”。结果图可视化将图谱查询结果用力导向图方式渲染展示节点和关系路径。自动生成查询模板通过历史查询积累高频模式自动优化 Cypher 生成逻辑。接入大模型做答案润色用大模型把图查询结果转换成自然语言答案但需要在答案生成环节增加事实约束避免模型幻觉。数据血缘管理利用“选中即问”的能力在数据治理平台中实现表、指标、任务的溯源查询。建议在实际业务中先选择一个高频场景切入把数据质量做扎实再逐步扩展实体类型和意图范围。“选中即问”的价值依赖底层图谱数据的完整性和准确性数据模型设计得越贴合业务查询效果越好。