4、数据获取:公共数据库简介——DrugBank、UniProt、STITCH、STRING
说实话,我刚进这个领域的时候,面对一堆生物信息学数据库真的有点懵。每个库都说自己很牛,但到底该用哪个?怎么用?后来摸爬滚打几年,慢慢总结出一套自己的套路。这章我就把几个最核心的公共数据库掰开揉碎讲清楚——DrugBank、UniProt、STITCH、STRING。嗯,用好它们,你的药物-靶点网络分析基本就稳了。
4.1 DrugBank —— 药物和靶点的“黄金标准”
DrugBank 绝对是做药物-靶点分析绕不开的库。它收录了 FDA 批准的药物、实验性药物,以及它们对应的靶点、作用机制、代谢路径等信息。我个人习惯是,拿到一个新药先上 DrugBank 查它的靶点列表,准确率很高。
核心数据字段:
- DrugBank ID(如 DB01076)
- 药物名称、化学结构、SMILES
- 靶点蛋白 ID(UniProt ID)和靶点名称
- 药物-靶点相互作用类型(抑制剂、激动剂等)
- 文献引用、临床试验信息
你可以直接网页搜索,也能用 REST API 批量获取。举个例子,我用 Python 拉某个药物的靶点信息:
import requests
import json
drugbank_id = "DB01076"
url = f"https://go.drugbank.com/drugs/{drugbank_id}.json"
headers = {"Authorization": "Bearer YOUR_API_KEY"}
resp = requests.get(url, headers=headers)
data = resp.json()
targets = data.get("targets", [])
for t in targets:
print(t.get("name"), t.get("uniprot_id"))
我记得有一次做靶点验证,DrugBank 里一个药物的靶点列表和文献对不上。后来发现是版本差异。所以一定要记录你使用的数据库版本号,否则结果没法复现。
4.2 UniProt —— 蛋白质的“百科全书”
拿到靶点 ID 之后,下一步就是了解这个蛋白质到底是什么、有什么功能。UniProt 就是干这个的。它把 Swiss-Prot(人工校验)和 TrEMBL(自动注释)合并成一个全面且权威的蛋白质数据库。
常用功能:
- 根据 ID 检索蛋白质序列、结构域、功能注释
- ID 映射:在不同数据库(Entrez Gene、Ensembl、PDB)之间转换
- 检索同源蛋白、疾病关联信息
我自己用得最多的是 UniProt 的 REST API,特别稳。下面这个例子,把 DrugBank 的靶点 ID 映射成 UniProt ID:
import requests
mapping_url = "https://rest.uniprot.org/idmapping/run"
params = {
"from": "DRUGBANK_ID",
"to": "UNIPROTKB",
"ids": "DB01076"
}
resp = requests.post(mapping_url, data=params)
job_id = resp.json().get("jobId")
# 轮询获取结果
result_url = f"https://rest.uniprot.org/idmapping/results/{job_id}"
result = requests.get(result_url).json()
print(result)
你想想看,如果没有 UniProt,光一个药物靶点 ID 你都不知道它是什么蛋白。而且它的注释更新很及时,每周都会发布新版本。
4.3 STITCH —— 化合物-蛋白质互作“生态圈”
STITCH(Search Tool for Interacting Chemicals)解决了化学小分子和蛋白质之间互作关系的查询问题。它整合了 DrugBank、PDB、文献挖掘、实验数据等资源,覆盖范围极广——包括已知药物、环境污染物、代谢物等。
特点:
- 输入:化合物名称、SMILES、PubChem ID、InChI
- 输出:互作蛋白质列表,附带置信度评分
- 支持探索化学-蛋白质网络(通过 Cytoscape 可视化)
我曾经用它查过咖啡因的靶点——结果发现它能结合几十个蛋白质,出乎意料。不过要注意,STITCH 的评分(confidence score)默认很高,如果调太低可能会引入太多假阳性。我一般取 0.7 以上。
# 通过 STITCH API 查询咖啡因的靶点
import requests
params = {
"identifier": "caffeine",
"species": 9606, # 人
"confidence": 0.7,
"limit": 20
}
url = "https://stitch.embl.de/api/tsv-no-header/retrieve"
resp = requests.get(url, params=params)
print(resp.text[:500])
4.4 STRING —— 蛋白质-蛋白质互作“社交网络”
做药物-靶点网络分析,光知道药物和靶点之间的关系还不够,你还得知道靶点蛋白和哪些蛋白有相互作用。STRING 是目前最全的 PPI(蛋白质-蛋白质相互作用)数据库,整合了实验数据、共表达、文本挖掘、同源转移等信息。
核心参数:
- 输入:蛋白质列表(UniProt ID 或 Ensembl ID)
- 输出:互作网络,附带 combined score(0-1)
- 支持多种物种(默认人 9606)
我一般用 STRING 的 Python 客户端,或者直接调用它的 API。下面是一个批量查询的例子:
import requests
protein_list = ["P04637", "P53"] # TP53 的 UniProt ID 和基因名
params = {
"identifiers": "%0d".join(protein_list),
"species": 9606,
"limit": 10,
"required_score": 0.4
}
url = "https://string-db.org/api/tsv/network"
resp = requests.get(url, params=params)
# 返回 TSV 格式
lines = resp.text.strip().split("\n")
for line in lines[:5]:
print(line)
嗯,这里有个坑:STRING 的 combined_score 是综合了多种证据的数值,但不同的证据类型权重不一样。你需要根据问题决定阈值。我通常做敏感分析时用 0.4,做保守分析用 0.7。
4.5 数据库对比一览
为了让你快速掌握这四个库的核心差异,我整理了一张表:
| 数据库 | 核心数据 | 访问方式 | 典型用途 |
|---|---|---|---|
| DrugBank | 药物-靶点关系、药物属性 | Web、REST API、XML下载 | 已知药物的靶点发现 |
| UniProt | 蛋白质序列、功能、家族、结构域 | Web、REST API、SPARQL | 靶点蛋白的功能注释和 ID 映射 |
| STITCH | 化合物-蛋白质互作(含药物、代谢物) | Web、API、TSV下载 | 搜索化合物影响哪些蛋白 |
| STRING | 蛋白质-蛋白质相互作用证据 | Web、API、Cytoscape插件 | 扩展靶点蛋白的互作网络 |
4.6 数据获取整体流程
在实际项目中,我是按下面这个思路走的:先从 DrugBank 或 STITCH 拿到药物对应的靶点列表,然后用 UniProt 把靶点 ID 统一转换成标准 ID,最后再用 STRING 把靶点之间的互作网络拉出来。整个流程串起来后,就能构建一个完整的药物-靶点网络。
下面这张图能帮你理解四个数据库在流程中的位置: