2. 药物知识图谱概述:数据源与知名KG
做药物KG,说白了就是把零零散散的生物医药数据串起来。
我刚开始接触这个领域时,第一反应是——这东西不就是个大号的数据库嘛?
后来踩过几次坑才发现,真正的难点不在数据多少,而在数据长什么样、怎么对齐。
这一节,我们聊聊药物KG的数据从哪来,圈里公认好用的KG有哪些。
2.1 药物KG的数据源
数据源这东西,我习惯先分成三类:
- 结构化数据库——关系型表、RDF三元组、CSV,直接能读。
- 半结构化文本——XML、JSON、PubMed摘要,需要抽实体和关系。
- 非结构化文献——PDF全文、专利,得靠NLP硬啃。
我个人建议新手优先从结构化数据入手,并不是偷懒,而是你想想看——
非结构化数据里一个基因名写错拼写,能把整个KG带偏。这个问题我在项目里碰到过不下十次。
常见数据源清单:
| 数据源 | 类型 | 主要内容 | 更新频率 |
|---|---|---|---|
| DrugBank | 结构化 | 药物-靶标-通路 | 季度 |
| CTD | 结构化 | 化学-疾病关联 | 月更新 |
| PubMed | 非结构化 | 文献摘要 | 每日 |
| UniProt | 结构化 | 蛋白质功能注释 | 每周 |
| ClinicalTrials.gov | 半结构化 | 临床试验方案 | 实时 |
我曾经直接拿PubMed摘要做实体抽取,结果一个疾病名在一篇文献里出现三种写法——
「阿尔茨海默症」「AD」「Alzheimer's disease」。后来我不得不先做实体标准化映射。
建议:不管用哪种数据源,先做entity alignment。
2.2 知名药物KG
圈子里有几个KG,基本是绕不开的。我用过其中四个,挑主要的说说。
2.2.1 DrugBank
DrugBank是药物KG的“老大哥”。
它把药物分成小分子药、生物药、营养药,每条药物记录都关联靶标、酶、载体、代谢酶。
# 一个典型的DrugBank药物-靶标关系三元组
Drug:DrugBank:DB00001 has_target Target:UniProt:P01009
Drug:DrugBank:DB00001 has_target Target:UniProt:P01011
Drug:DrugBank:DB00001 approved Indication:Alzheimer's disease
我做过一个实验:用DrugBank的关系做link prediction,模型效果比随机基线提升了30%+。
但有个细节——DrugBank里有些关系是“推断的”,不是实验验证的。
做KG时一定要看清字段里的Evidence标签,否则模型把猜测当事实,结果会崩。
2.2.2 CTD(Comparative Toxicogenomics Database)
CTD主打化学-基因-疾病三角关系。
它的特色是关系带语境,比如“化学X通过上调基因Y抑制疾病Z”。
# CTD的关系三元组示例
Chemical:CID:123 causes Disease:MESH:D000001
Chemical:CID:123 increases Gene:Symbol:TP53
Gene:Symbol:TP53 associated Disease:MESH:D000001
嗯,这里要注意:CTD的关系里很多是从文献自动抽取的,置信度参差不齐。
我一般只保留Evidence: validated级别的边,或者用置信度阈值过滤。
2.2.3 其他值得关注的KG
- STRING——蛋白质-蛋白质相互作用,做药物靶标发现时常用。
- DGIdb——药物-基因交互数据库,偏向临床用药。
- Hetionet——一个综合KG,融合了29种类型的数据,做图分析的好素材。
我从一个实际项目经验来看:做药物重定位,DrugBank + CTD 的组合就够覆盖大多数场景。
加上 STRING 做 PPI 增强,效果比单用任何一个都好。成本嘛,就是数据对齐的工作量翻倍。
2.3 药物KG的数据结构
药物KG的基本单元是三元组 (头实体,关系,尾实体)。
但实际项目中,我习惯把KG看作一个多层异构图——
- 节点类型:药物、靶标、疾病、基因、通路、副作用
- 关系类型:激活、抑制、治疗、副作用、代谢
- 属性:置信度、来源、时间戳、实验条件
你想想看,光一个“药物”节点就可能关联几十种关系,
如果模型只用单一的关系类型做embedding,信息损失太严重了。
RotatE和GCN的优势就在这里——它们天然支持多关系建模。
有些KG的关系是有向的,比如“药物治疗疾病”≠“疾病治疗药物”。
我曾经忽略方向去训练模型,结果AUC掉了15%。
检查KG时一定要确认关系类型是否对称。CTD里的
decreases和increases就是典型的非对称关系。
2.4 本章核心结构一览
为了让你更直观地理解药物KG的数据流和结构,我画了一张图:
(以下SVG展示了数据源→知名KG→输出关系的逻辑链路)
从图里能看到,数据源经过ETL和实体对齐后,汇入DrugBank、CTD、STRING等KG。
最后输出的是标准化三元组,可以直接喂给RotatE或GCN模型。
我个人建议刚接触药物KG的同学,先从DrugBank的三元组文件开始跑实验——
数据结构干净,文档全,踩坑成本最低。CTD可以等模型调通后再加进来做多源融合。
如果你手动下载过这些KG的官方dump,会发现格式不统一。
我写了一个简单的Python脚本做格式归一化,核心逻辑就是逐行读三元组,输出
(头|关系|尾)的TAB分隔文件。建议你也维护一套自己的ETL管道,能省去很多重复劳动。