药物知识图谱简介:节点、边、关系、常用数据集
说起药物知识图谱,我得先坦白一件事。我记得刚接触知识图谱那会儿,觉得这玩意儿不就是个复杂的数据库吗?后来在项目中踩了几次坑才明白——它是把生物医学里那些零散的关系,变成机器可以推理的结构化知识。说白了,就是给AI一张“药物关系网”。
咱们先看这张网由什么组成。其实就三样东西:节点、边、关系。听起来简单,但里面门道不少。
节点:知识图谱里的“实体”
节点就是现实世界里的东西。在药物领域,节点可以是:
- 药物(Drug):比如阿司匹林、伊马替尼。
- 疾病(Disease):比如2型糖尿病、非小细胞肺癌。
- 基因(Gene):比如EGFR、BRCA1。
- 蛋白质(Protein):比如HER2、PD-L1。
- 副作用(Side Effect):比如恶心、肝毒性。
- 通路(Pathway):比如EGFR信号通路。
每种节点有什么用?我个人习惯用领域前缀区分,比如“DRUG:阿斯匹林”这样。避坑指南:不要混用ID格式。我以前见过一个项目,同一种药在数据库中既有CID又有DrugBank ID,结果模型训练时把同一个实体当成两个不同节点处理——白白浪费算力。
| 节点类型 | 示例 | 常用ID来源 |
|---|---|---|
| 药物 | 伊马替尼 | DrugBank、ChEMBL |
| 疾病 | 慢性粒细胞白血病 | Disease Ontology、ICD-10 |
| 基因 | BCR-ABL | NCBI Gene、HGNC |
| 副作用 | 皮疹 | SIDER、MedDRA |
边:连接节点的“关系”
边就是两个节点之间的连线。每条边都带有语义——这就是知识图谱比普通数据库聪明的地方。
常见的药物KG关系包括:
- TREATS:药物治疗疾病
- CAUSES:药物引起副作用
- TARGETS:药物靶向蛋白
- INTERACTS_WITH:药物相互作用
- ASSOCIATED_WITH:基因与疾病关联
这里面有个坑:关系的方向性。我曾经在项目中用无向边表示“药物-靶点”关系,结果模型推理时完全混乱。后来换成有向边(DRUG → TARGETS → PROTEIN),效果才正常。你想想看,连方向都不对,图神经网络怎么学得会?
三元组:知识图谱的基本单元
知识图谱里最小单位是三元组:(头实体, 关系, 尾实体)。
例如:
(伊马替尼, TREATS, 慢性粒细胞白血病)
(伊马替尼, TARGETS, BCR-ABL蛋白)
(慢性粒细胞白血病, ASSOCIATED_WITH, BCR-ABL基因)
每个三元组就是一条知识。一个完整的药物KG可能包含几百万甚至上亿条这样的三元组。存储格式我推荐用RDF或TSV,后面讲数据处理时会细说。
常用数据集:别重复造轮子
做药物KG建模,数据集的选择很关键。下面几个是我在项目里反复用到的:
| 数据集名称 | 节点数 | 关系类型 | 特点 |
|---|---|---|---|
| DrugBank | ~15,000药物 | 药物-靶点、药物-疾病、药物-副作用 | 手工标注,质量高但规模小 |
| ChEMBL | ~200万生物活性数据 | 药物-靶点、活性值 | 数据量大,但噪声多 |
| Hetionet | ~50,000节点 | 24种关系 | 整合多种生物知识,适合图学习 |
| Biokg | ~85,000实体 | 93种关系 | 大规模药物KG数据集 |
我个人习惯先用Hetionet做原型——它的关系类型丰富但数量适中,非常适合调试超参数。等模型跑通了再换到更大规模的数据集。否则一上来就用Biokg,你光数据处理就得忙活半天。
知识图谱的构建流程
下面这张图展示了药物KG的构建和训练逻辑:
为什么需要走这个流程?你想想看,直接从原始数据扔到模型里训练,结果只能是垃圾进垃圾出。我建议每做完一步都做个验证:实体数量合理吗?关系分布均衡吗?
避坑指南:常见问题与对策
- 实体对齐不一致:同一个基因在不同数据集中用不同ID,必须统一映射。我用过一个轻量工具叫Bon Jovi(不是歌手),专门做生物实体对齐。
- 关系稀疏性:很多关系只出现几次,模型学不到有效信息。我的做法是合并低频关系,或者用关系侧加权。
- 数据泄露风险:训练集和测试集不能有共享实体。我吃过一次亏:测试集中出现了训练集的热门药物,导致验证效果虚高。
药物知识图谱的节点、边、关系,说白了就是给复杂生物系统画地图。有了这张地图,我们才能在上面跑超参数搜索、做药物重定位预测。下面几章,咱们会深入到具体的模型结构和搜索策略上。