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种类型的数据,做图分析的好素材。
为什么选择这些KG?
我从一个实际项目经验来看:做药物重定位,DrugBank + CTD 的组合就够覆盖大多数场景。
加上 STRING 做 PPI 增强,效果比单用任何一个都好。成本嘛,就是数据对齐的工作量翻倍。

2.3 药物KG的数据结构

药物KG的基本单元是三元组 (头实体,关系,尾实体)。
但实际项目中,我习惯把KG看作一个多层异构图——

  • 节点类型:药物、靶标、疾病、基因、通路、副作用
  • 关系类型:激活、抑制、治疗、副作用、代谢
  • 属性:置信度、来源、时间戳、实验条件

你想想看,光一个“药物”节点就可能关联几十种关系,
如果模型只用单一的关系类型做embedding,信息损失太严重了。
RotatE和GCN的优势就在这里——它们天然支持多关系建模。

容易踩的坑:关系方向性
有些KG的关系是有向的,比如“药物治疗疾病”≠“疾病治疗药物”。
我曾经忽略方向去训练模型,结果AUC掉了15%。
检查KG时一定要确认关系类型是否对称。CTD里的decreases和increases就是典型的非对称关系。

2.4 本章核心结构一览

为了让你更直观地理解药物KG的数据流和结构,我画了一张图:
(以下SVG展示了数据源→知名KG→输出关系的逻辑链路)

药物KG数据源与知名KG关系图 数据源层 结构化数据库 DrugBank, UniProt 半结构化文本 ClinicalTrials 非结构化文献 PubMed, 专利 知名药物KG DrugBank CTD STRING KG三元组输出 (Drug:DB00001, has_target, Target:P01009) (Chemical:CID:123, causes, Disease:MESH:D000001)

从图里能看到,数据源经过ETL和实体对齐后,汇入DrugBank、CTD、STRING等KG。
最后输出的是标准化三元组,可以直接喂给RotatE或GCN模型。

我个人建议刚接触药物KG的同学,先从DrugBank的三元组文件开始跑实验——
数据结构干净,文档全,踩坑成本最低。CTD可以等模型调通后再加进来做多源融合。

一个小技巧
如果你手动下载过这些KG的官方dump,会发现格式不统一。
我写了一个简单的Python脚本做格式归一化,核心逻辑就是逐行读三元组,输出(头|关系|尾)的TAB分隔文件。
建议你也维护一套自己的ETL管道,能省去很多重复劳动。