3. 生物医学知识图谱介绍:常用数据库
做药物重定位,说白了就是给老药找新活儿。但你怎么知道这药还能干点别的?你得先搞清楚三个问题:这药打哪儿来?它跟哪些基因有关?这些基因之间怎么串通一气的?
这就要靠生物医学知识图谱了。我早年刚接触这个领域的时候,数据散得到处都是,PubMed上扒文献,UniProt里查蛋白,再把它们揉在一起,那叫一个痛苦。后来我发现,有一批成熟的数据库已经把这事儿干完了。今天我就聊聊我觉得最顺手的三个:DrugBank、DisGeNET 和 STRING。
3.1 三大数据库的核心定位
先给它们定个位。你可以把它们想象成三兄弟,各管一摊:
- DrugBank —— 管“药”和“靶点”。药长什么样,它打哪个蛋白。
- DisGeNET —— 管“基因”和“疾病”。哪个基因突变会让人生病。
- STRING —— 管“蛋白”和“蛋白”。这些蛋白之间怎么握手、怎么打架。
你在做重定位的时候,通常得把这三步串起来。举个例子:你先从DrugBank查到某药抑制了蛋白A,再从DisGeNET发现蛋白A的突变和疾病B相关,最后用STRING看看蛋白A还跟蛋白C有相互作用——蛋白C也许正是另一款药的靶点。你看看,新用途的线索就这么出来了。
核心逻辑: 药物重定位的三大基础问题 —— “药是什么?”、“病关联什么基因?”、“基因之间什么关系?” —— 正好对应这三个数据库。
3.2 DrugBank:药物与靶点的权威来源
DrugBank 是我用得最多的一个。它最新版本(5.1.12)收录了超过一万六千种药物,其中约2700种是FDA批准的。它的数据分两种:一种是药物分子本身的属性(分子量、SMILES、LogP),另一种是药物靶点的详细信息(靶点名称、基因符号、作用类型)。
我记得有一次做阿尔茨海默症的老药筛选,需要快速判断哪些药能透过血脑屏障。DrugBank 的“吸收”字段里直接就有BBB渗透性的标注,省了我大量做分子对接的工夫。
常用的查询方式:
- 按名称搜索: 输入药物通用名或商品名
- 按结构搜索: 通过SMILES或InChIKey
- 按靶点搜索: 输入基因符号,反向查找作用在它上面的药物
个人习惯: 我一般先用DrugBank的“药物-靶点”表格拉到TSV,再用Python的pandas做去重合并。别在网页前端一页一页点,效率太低。
来看看一个简单的API查询示例。DrugBank 的官方 API 需要申请密钥,但部分数据可通过他们的公开下载拿到。假设你有一个药物CID,想查它的靶点列表,伪代码大致这样:
# 模拟DrugBank API调用(需实际API Key)
GET /drugs/{drugbank_id}/targets
响应:
{
"drugbank_id": "DB00001",
"name": "Leptin",
"targets": [
{
"target_id": "T00001",
"gene_symbol": "LEPR",
"action": "agonist"
}
]
}
为什么要强调这个?因为我在写pipeline时经常要批量拉取几百个药物的靶点。API返回的JSON结构很规整,直接解析就行。当然,你也要注意频率限制,别把人家服务器打崩了。
3.3 DisGeNET:基因-疾病关联的集大成者
DisGeNET 是我在找“疾病靶点”时必查的数据库。它整合了来自专家评审、GWAS目录、动物模型和文献挖掘的数据。目前它收录了超过两万四千个基因和四万多种疾病之间的关联,总共超过一百一十万条记录。
它不是简单地告诉你“基因X和疾病Y有关”,它还会给每条关联打一个分数:EI(证据指数) 和 DSI(疾病特异性指数)。EI越高,说明支持这一关联的文献越多;DSI越高,说明这个基因只和少数几种疾病相关,特异性强。
为什么会这样? 有些基因(比如TP53)是“万能选手”,很多癌症都跟它有关。这种基因的DSI就很低。而像BRCA1,它和乳腺癌强相关,DSI就很高。你在做重定位时,我更建议关注DSI高的基因——因为它们跟某个疾病绑得紧,更容易形成靶点-药物-疾病的清晰逻辑链。
我曾经踩过的坑: 刚开始做的时候,我直接拿了DisGeNET的“所有”关联数据,没做过滤。结果下游分析全是假阳性。后来我加了一道阈值:只保留EI ≥ 0.3 且 来源至少包括“专家评审”或“GWAS”的记录。信噪比一下就上来了。
DisGeNET 的数据下载通常提供以下几种格式:
- variant_disease.tsv —— 变异-疾病关联
- gene_disease.tsv —— 基因-疾病关联(最常用)
- disease_class.tsv —— 疾病分类信息
你拿到的是这种结构的数据:
geneId geneSymbol diseaseId diseaseName score EI DSI
7157 TP53 C0033578 Prostate Cancer 0.95 0.92 0.28
672 BRCA1 C0678222 Breast Cancer 0.99 0.98 0.85
看到了吗?TP53的前列腺癌关联虽然得分高,但DSI才0.28,说明它跟很多癌症都有关,特异性一般。而BRCA1的DSI是0.85,特异性就强得多。这么一比较,筛选方向就清晰了。
3.4 STRING:蛋白质互作网络的基石
STRING 全称是 Search Tool for the Retrieval of Interacting Genes/Proteins。它提供已知和预测的蛋白质-蛋白质相互作用(PPI)数据。目前它涵盖了超过一万四千种生物,包括人类、小鼠、果蝇、大肠杆菌等等。
它给每条相互作用配了一个置信度分数(0到1000)。我个人习惯只取700以上的互作对,也就是“高置信度”的。为什么?因为低置信度的互作很多是来自文本挖掘的共现,不一定真的在物理上结合。你要是在知识图谱里塞太多这种边,推理出来的结果很容易漂移。
STRING的数据来源分几种:
- 实验验证: 酵母双杂交、免疫共沉淀等
- 数据库: 来自KEGG、Reactome等通路数据库
- 文本挖掘: PubMed摘要中的共现
- 预测: 基因邻域、基因融合、系统发育谱等
你在用API查询时,可以指定物种和置信度。示例如下:
GET https://string-db.org/api/json/network
?identifiers=TP53|BRCA1
&species=9606
&required_score=700
响应:
[
{
"stringId_A": "9606.ENSP00000269305",
"stringId_B": "9606.ENSP00000350283",
"preferredName_A": "TP53",
"preferredName_B": "BRCA1",
"score": 900
}
]
你看,这个查询返回了TP53和BRCA1之间的互作分数是900,属于非常高的置信度。你可以在你的知识图谱里放心地把这条边加上。
3.5 三者的集成关系
嗯,这里要注意。这三个数据库不是孤立的。你在做药物重定位知识图谱时,它们的集成才是核心。
我画了一张图,帮你理清它们之间的关系:
图中逻辑很直白:DrugBank告诉你药打哪个靶,你把这个靶的基因符号扔到DisGeNET里,看它跟哪个疾病强相关,再用STRING扩展出这个靶点的“朋友圈”(互作蛋白),这些朋友可能也是其他药的靶点。这就是重定位的典型推理路径。
3.6 数据库对比总结
最后,我帮你把这些库的核心信息整理成一张表。做项目选型时,直接看这个就够了:
| 数据库 | 核心实体 | 关系类型 | 数据规模(最新版) | 访问方式 | 典型用例 |
|---|---|---|---|---|---|
| DrugBank | 药物、靶点 | 药物←→靶点 | ~16,000 药物, ~5,000 靶点 | 网页、API、XML下载 | 查询某个药物的所有已知靶点 |
| DisGeNET | 基因、疾病、变异 | 基因→疾病 | ~24,000 基因, ~40,000 疾病 | 网页、API、TSV下载 | 获取与特定疾病相关的基因列表 |
| STRING | 蛋白 | 蛋白—蛋白 | ~14,000 物种, ~1,400M 互作 | 网页、API、TSV下载 | 扩展目标蛋白的互作网络 |
我的建议: 如果你刚开始搭知识图谱,先从Downloable的TSV文件入手,用Python读成DataFrame,再转成三元组(头实体、关系、尾实体)存到Neo4j或ArangoDB里。等数据量上来了,再考虑用API做增量更新。
好了,这三个数据库的基本情况就是这样。DrugBank给你基础药靶关系,DisGeNET帮你锚定疾病,STRING帮你扩展网络。三管齐下,药物重定位的图谱骨架就搭起来了。在后面的章节里,我会继续聊怎么把这些数据真正揉成一张图,以及怎么在上面跑图算法。