药物知识图谱与图神经网络概述
说实话,每次我向新同事解释“药物知识图谱”这个课题时,都会先问一个问题:
“你见过一个药物能治多种病吗?”
很多人点头。没错,比如阿司匹林,最初是退烧药,后来发现还能预防心血管疾病。这种“老药新用”的背后,靠的就是药物、靶点、疾病之间错综复杂的关系网。而这张网,其实就是知识图谱。
为什么是药物知识图谱?
传统的药物研发,往往盯着单个靶点或单个化合物。但真实生物系统哪有这么简单?一个蛋白会跟多个代谢通路交互,一种疾病可能是多个基因变异共同导致的。把所有这些实体(药物、基因、疾病、副作用)和它们的关系(激活、抑制、结合、诱导)结构化存起来,就成了知识图谱。
我在项目中遇到过最典型的场景是:客户想找一种既能降血糖又不引起体重增加的药物。如果只查单一关系,根本找不到。但跑到知识图谱里,沿着“药物→靶点→代谢通路→副作用”走一圈,很快就能锁定候选分子。说白了,知识图谱把“关系”本身变成了可计算的数据。
图神经网络能做什么?
有了知识图谱,我们还得让它“聪明”起来。传统方法只能查已存在的关系,而图神经网络(GNN)可以预测缺失的关系。比如已知两个蛋白与同一种疾病关联,但图谱中没直接连这条边,GNN能根据它们周围的邻居结构,推算出它们很可能相互作用。
怎么做到的?简单说,GNN会把每个节点(药物、蛋白)表示成一个向量,然后不断聚合邻居的信息,更新自己的向量。最后用这些向量去做链接预测、节点分类或图分类。听起来像黑魔法?嗯,其实可以理解成“让每个节点打听一下邻居都说了什么,再决定自己是什么”。
知识图谱 + GNN 的协同工作流
下面这张图能帮你快速建立起整体印象。我在实际项目中基本都按这个流程走:
技术栈概览:PyG 与 Neo4j
这套工作流里,两个工具是我最依赖的:
| 工具 | 职责 | 我常用的场景 |
|---|---|---|
| Neo4j | 图数据库,存储和查询知识图谱 | Cypher 查询子图、导出节点/边列表 |
| PyG(PyTorch Geometric) | 图神经网络框架,用于特征提取和模型训练 | 将 Neo4j 导出的图数据转为 PyG 的 Data 对象,训练 GCN/GAT |
两者怎么配合?我个人习惯先把原始数据(比如 DrugBank、CTD 数据库)导入 Neo4j,然后用 Cypher 提取特定子图(例如与某个疾病相关的所有药物-靶点路径),导出成 CSV 或直接通过 Python 驱动 neo4j 库拉取数据。接着在 PyG 里构建 Data 对象,输入 GNN 模型。
NeighborSampler 做 mini-batch 训练,才解决了这个问题。
一个具体的例子:药物重定位
假设我们有一个知识图谱,包含:
- 药物节点:阿司匹林、二甲双胍、瑞舒伐他汀……
- 靶点节点:COX-1、AMPK、HMGCR……
- 疾病节点:2型糖尿病、高血压、高脂血症……
- 关系:
靶向、治疗、副作用、相互作用
任务:找到一个已知治疗高血压的药物,可能也适合治疗糖尿病。怎么做?
- 用 Cypher 提取所有与“高血压”相关的药物及它们的靶点。
- 用 PyG 训练一个链接预测模型,预测那些尚未连接的“药物-疾病”边。
- 模型输出高分候选药物,交给药理专家验证。
我在一个真实项目中,就是用这套方法找到了一个原本用于抗抑郁的化合物,对某种罕见神经退行性疾病有潜力。虽然最终没有进入临床,但至少把候选范围从几千个缩小到十几个,大大降低了实验成本。
写在开头的话
这门课的目标很明确:让你能亲手搭建从知识图谱到图神经网络的完整 pipeline。我们会从数据准备讲起,然后深入 Cypher 查询和 PyG 的模型构建,最后落地成一个药物重定位的 demo。每一章我都会放上自己实战中踩过的坑,以及对应的代码片段。
如果你准备好了,我们就开始吧。