4、生物医学知识图谱概述:GO、KEGG、DrugBank、STITCH等常用资源介绍
做靶点特征建模的人,迟早会跟一堆生物医学数据库打交道。说实话,我刚入行那会儿也被这些缩写搞得头晕——GO、KEGG、DrugBank、STITCH……每个都号称是“知识图谱”,但实际能挖出什么,差别特别大。这一节我就带你捋一遍这些常用资源,看看它们到底存了什么、怎么用、在靶点建模里能顶什么用。
4.1 知识图谱在生物医学里的“骨架”作用
先别急着背数据库名。你想想看,一个靶点从基因到蛋白再到疾病和药物,中间经历了多少层级?如果只盯着一个数据库,就像只看一棵树的树枝,看不到整片森林。知识图谱就是把这些松散的节点(基因、蛋白、化合物、疾病、通路)用关系(激活、抑制、结合、治疗)串起来的大网。
我个人习惯把常用资源分成两类:一类是“本体/注释”型,比如GO,帮你搞清楚基因的功能归属;另一类是“关系/交互”型,比如KEGG和DrugBank,直接给出通路和药物靶点关联。STITCH则偏重化合物-蛋白相互作用。理解了这层分工,后面查数据才不会跑偏。
4.2 GO(基因本体):给基因贴“功能标签”
GO(Gene Ontology)不是存储基因序列的数据库,它是一套标准化的词汇表。说白了,就是把“这个基因在细胞里干什么”用三套维度说清楚:
- 细胞组分(Cellular Component)——基因产物在细胞的哪个位置干活(例如线粒体、细胞核)
- 分子功能(Molecular Function)——在分子层面做了什么(例如ATP结合、转录因子活性)
- 生物过程(Biological Process)——参与什么整体过程(例如DNA修复、细胞凋亡)
做靶点特征建模时,我常用GO来给基因抽取“功能向量”。举个例子,如果你要区分致癌基因和抑癌基因,只看序列是不行的,但GO里“细胞周期阻滞”这个过程的注释就非常说明问题。代码层面怎么拿?
# 用Python的mygene库(快速示例)
import mygene
mg = mygene.MyGeneInfo()
result = mg.query('TP53', fields='go')
print(result['hits'][0]['go'])
# 输出会包含BP、CC、MF三套结构
注意,GO的结构是有向无环图(DAG),不是树。也就是说一个基因可以有多个父类注释。我曾经为了一个“细胞迁移”相关基因,愣是在GO图的五个层级里找到了三条不同的路径,最后用路径相似度做了个特征——效果比直接用BLAST好一倍。
4.3 KEGG:通路可不是“图的拼接”
KEGG(Kyoto Encyclopedia of Genes and Genomes)最出名的是它的通路图。很多人以为通路图就是一个个节点连起来,其实KEGG的通路图里包含大量上下文——酶、小分子、化学反应、疾病关联。我个人觉得,KEGG在靶点发现中最大的价值在于“通路富集分析”。你拿到一组差异表达基因,塞进KEGG看看它们富集在哪些通路里,一下子就定位到关键模块了。
| 特征 | 说明 |
|---|---|
| 通路层级 | 代谢通路、信号转导通路、疾病通路等5大类 |
| 节点类型 | 基因/蛋白、化合物、酶、反应、疾病 |
| 关系类型 | 激活、抑制、催化、结合、翻译后修饰 |
| 可编程接口 | KEGG API(基于REST) |
KEGG的API示例(获取hsa00010通路的基因列表):
curl -X GET "https://rest.kegg.jp/get/hsa00010" \
-H "Content-Type: text/plain"
返回的数据是纯文本格式,包含通路描述、基因列表及其KO编号。你可以在脚本里解析出所有基因的ID,然后跟DrugBank的靶点列表做交叉。嗯,这里要注意:KEGG的许可证比较严格,商业用途需要付费。我们做学术研究还好,但如果你在公司里用,记得查一下合规性。
4.4 DrugBank:药物-靶点关系的“权威字典”
DrugBank本质上是一个精细化的药物知识图谱。每条药物记录都标明了靶点、酶、转运体、载体,还附带药理作用、作用机制、代谢路径等。做靶点预测的人最喜欢它的“已知靶点”列表,用来做训练集的正样本。
DrugBank支持XML和JSON格式下载。但要注意,全量XML文件很大(几个GB),解析起来要写一些批处理脚本。下面是一个用Python解析DrugBank XML的简单片段:
import xml.etree.ElementTree as ET
tree = ET.parse('drugbank.xml')
root = tree.getroot()
ns = {'db': 'http://www.drugbank.ca'}
for drug in root.findall('db:drug', ns):
name = drug.find('db:name', ns).text
targets = drug.findall('db:targets/db:target', ns)
for t in targets:
target_id = t.find('db:id', ns).text
print(name, target_id)
4.5 STITCH:化学物-蛋白相互作用的“高速公路”
STITCH(Search Tool for Interacting Chemicals)跟DrugBank不一样。它不局限于已知药物,而是把范围扩大到所有化学小分子和蛋白质的相互作用,包括实验验证、文献挖掘、结构预测等证据。我特别看中它的“置信度打分”,从0.1到0.9。做靶点筛选时,可以设一个阈值(比如0.7),过滤掉低置信相互用。
STITCH的数据格式是TSV,可以直接导入图数据库。举个例子:
# 下载STITCH的化学物-蛋白相互作用文件(人类)
wget http://stitch.embl.de/download/chemical_chemical.links.detailed.v5.0.tsv.gz
# 解压后字段:chemical1, chemical2, combined_score
在实际项目中,我常用STITCH来“逆向定位”——给定一个化合物,快速找出它可能结合的蛋白靶点,然后跟DrugBank的已知靶点做差异分析,寻找新的候选靶点。曾经有一个抗炎小分子,在DrugBank里只标记了两个靶点,但STITCH给出了10个高置信度互作蛋白,其中3个后来在文献中被验证为真。
4.6 这些资源怎么组合成知识图谱?
你手头有了GO的功能注释、KEGG的通路关系、DrugBank的药物-靶点链接、STITCH的化合物-蛋白互作……怎么装进一张图?下面这张图展示了我常用的组合思路:
你看,从GO、KEGG、DrugBank、STITCH四类资源中提取实体和关系后,融合成一个统一的知识图谱,然后就可以在上面做各种图模型分析。这可不是简单的“数据拼接”,而是需要解决实体对齐(同一个基因在不同库里的ID不同)、关系去重、置信度合并等问题。
4.7 选哪个?看你的下游任务
- 要做功能富集分析? 首推GO+KEGG,GO提供背景,KEGG提供通路上下文。
- 要找已知药靶关系做训练集? DrugBank最全,但别忘了交叉验证STITCH里未归档的相互作用。
- 要预测新化合物靶点? STITCH的广度好,配合药物化学结构相似度做图特征。
- 要构建完整疾病-靶点-药物通路图? 四者缺一不可,还得再加个DisGeNET(这个后面章节会介绍)。
说到底,知识图谱不是目的,搭建一个能服务于靶点特征建模的“可计算图”才是。我建议你在开始前先画一张类似上面那图的草图,明确每个数据源贡献什么类型的边和节点,再写代码去抓取、清洗、融合。这样走到图模型那一步时,才不会被数据质量卡住。