面向医学疾病知识的图谱问答系统:从公开疾病数据集(25 字段 / 8805 条 / 41.7MB)抽取 1200 个疾病、11244 个实体、57585 条关系,实现力导向图谱探索、多跳查询、症状反查(IDF 加权)与 6 类意图的规则问答,并导出 Neo4j 可导入文件。第 22 套「青瓷医案风」界面,全站不做诊断、关系不加权、同义词只提示不合并。
视频也可在 B 站视频页 观看
| 编程语言 | Python 3.8 及以上 |
|---|---|
| 后端框架 | Django 4.2 |
| 图谱构建 | 自定义 build_graph 管理命令(切分 / 归一 / 建边 / 度数 / Neo4j 导出) |
| 数据处理 | Python 标准库 csv + collections |
| 数据库 | MySQL 8.0(交付默认 SQLite,免安装) |
| 可视化 | ECharts 5(力导向图 / 柱状图 / 饼图,本地内置) |
| 数据规模 | 1200 疾病 / 11244 实体 / 57585 关系(源数据 8805 条) |
| 操作系统 | Windows / macOS / Linux |
| 启动方式 | 双击一键脚本,或 python manage.py runserver 8087 |
下面是交付包里的真实目录,共 60 个文件。只展示文件名,不含文件内容; 点击文件夹可逐层展开,看到每个模块是怎么拆分的。
点击任意一张可放大,支持左右切换(也可用键盘 ← → 键)










交付的任务书、开题报告与论文均为 Word 文档,下面是真实页面预览;点击可放大并左右切换:



是。源文件 41.7 MB、25 个字段、8805 条疾病,随包放在 源码/data/raw/Disease_Data.csv。图谱节点与关系全部从这份文件抽取,没有一条是合成的。
8805 条里先按「关系数 ≥ 6」筛,再按关系完整度取前 1200 条入图。全量入图会让力导向图无法阅读、页面明显卡顿。想要更多就调 medkg/settings.py 的 KG["MAX_DISEASES"] 再重跑 build_graph,建议不超过 2000。
源数据只说「这个病有这些症状」,不给同现次数或典型程度。按位置拍脑袋加权(排前面的更重要)结论无法解释,也无法向读者交代。所以权重统一为 1,改用症状自身的度数做区分度加权 —— 越少见的症状权重越高。
数据里确实两种都有。系统以(类型, 名称)为唯一键,存成两个节点,统计时分开算。若只按名字合并,症状反查会把疾病名当作症状统计,结果会失真。
因为数据里「发热」只关联 1 个疾病,而「发烧」关联 89 个,同义词没有合并。系统不会静默合并(那会改变统计口径),而是在页面提示「改搜发烧」。这个现象写进了论文 6.3 节,是本文最重要的发现之一。
不能,也不应该这样用。它只做公开资料的结构化整理与关系检索:症状反查返回的是「哪些病的症状与所选词重合最多」,不是医学结论。页面底部有固定免责声明,论文里也写明了。
6 类固定问法:病→症状、症状→病、病→药、病→科室、病→检查、是什么。用正则模板匹配,换一种说法可能就匹配不到 —— 但匹配不到时会明确说「没识别出实体」,而不是编一个答案。
能。build_graph 会同时导出 data/analysis/nodes.csv 与 rels.csv,字段就是 Neo4j LOAD CSV 需要的格式,页面「数据下载」里给了两段可直接用的 Cypher。
访客无需登录即可看全部 9 个页面并下载数据;管理员通过 Django admin 维护疾病、实体与关系,并查看构建与问答日志(演示账号 admin / admin123456)。
端口占用换 8088;缺依赖 pip install -r requirements.txt;图谱空白先查 static/vendor/echarts.min.js;改完 MAX_DISEASES 必须重跑 build_graph。说明文档第八节给了完整对照表。