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 的 API 需要申请密钥,免费版有调用次数限制。如果只是做小批量查询,直接网页下载 XML 格式全库文件也行,大概几百兆。

我记得有一次做靶点验证,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])
注意:STITCH 的 API 访问速度较慢,且对大批量查询有限制。建议缓存结果,不要每次都实时拉取。另外,STITCH 数据版本更新频率不高(约1-2年一次),使用时注意检查版本。

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 把靶点之间的互作网络拉出来。整个流程串起来后,就能构建一个完整的药物-靶点网络。

下面这张图能帮你理解四个数据库在流程中的位置:

药物-靶点网络分析:数据获取流程 药物-靶点 网络 DrugBank 药物-靶点关系 UniProt 蛋白质功能注释 STITCH 化合物-蛋白互作 STRING 蛋白-蛋白互作 流程解读 先用 DrugBank/STITCH 找出靶点,再用 UniProt 标准化,最后用 STRING 扩展互作网络
核心思路:四个数据库各有侧重,但拼在一起就能形成完整的“药物 → 靶点蛋白 → 蛋白互作网络”数据链。实际项目里,我一般先通过 DrugBank 或 STITCH 拿到初始靶点,再用 UniProt 清洗 ID,最后用 STRING 做网络扩展。这样产出的网络既准确又丰富。