3、生物医学数据源概述:公开药物数据库(DrugBank、ChEMBL、PubChem)介绍与使用
做药物知识图谱绕不开三个公开库:DrugBank、ChEMBL、PubChem。我当年刚入行时也以为“数据库嘛,都一样”,结果发现每个库的定位、数据结构和更新策略完全不同。想把这几个库用好,得先摸清它们的脾气。
3.1 为什么需要公开药物数据库?
你想想看,一个药物的信息从发现到上市,涉及化合物结构、靶点、通路、临床实验、不良反应……这些数据分散在不同机构、不同格式的文献里。公开药物数据库的作用,就是把散落的数据整编成结构化、可查询、可下载的机器可读形式。我习惯把它们当作知识图谱的“地基”——地基不稳,上面画什么图都白搭。
实用角度看,它们帮我们解决三个核心问题:
- 实体对齐:同一个药物在不同论文里可能叫不同名字,需要统一标识符(如 DrugBank ID、ChEMBL ID、PubChem CID)
- 关系抽取:药物–靶点、化合物–活性、蛋白–通路——这些都是知识图谱的基本边
- 数据质量:公开库有审核机制,比从论文里乱抓数据靠谱得多
注意!不要直接拿原始数据就喂给知识图谱。每个库的版本、更新时间、字段定义都不同,一定要预处理和字段映射。我吃过一次亏:ChEMBL 的 assay 类型字段和 DrugBank 的 target 类型字段根本对不上,来回折腾了两天。
3.2 三大数据库深度对比
下面这张表是我在实际项目中总结的,列了最关键的区别。你可以先扫一眼,然后慢慢展开看细节。
| 维度 | DrugBank | ChEMBL | PubChem |
|---|---|---|---|
| 核心专注点 | 药物–靶点关系、临床信息 | 生物活性数据、化合物–靶点亲和力 | 小分子化合物、化学性质、生物活性 |
| 数据量 | ~13,000 药物实体(含获批+实验) | ~230 万化合物,~2000 万活性数据点 | ~1.1 亿化合物,~2.9 亿生物活性记录 |
| 更新频率 | 每年两次(5月/11月) | 约每半年一次 | 几乎每天更新 |
| 可下载格式 | XML, CSV, SQL 转储 | MySQL dump, SDF, CSV | FTP: SDF, CSV, JSON, XML |
| API 限制 | 500 请求/天(免费 key) | 无硬限制但建议速率 | 5 请求/秒(免费) |
| 知识图谱友好度 | 高(直接有靶点、通路字段) | 中(需解析 assay 和 target mapping) | 中低(全靠化合物关联) |
3.3 DrugBank —— 药物–靶点关系的权威源
我个人最喜欢的库就是 DrugBank。它的数据经过专家人工审核,尤其是在药物–靶点关系上,标注了“作用类型”(抑制剂、激动剂、拮抗剂)。我在做一个“药物重定位”知识图谱时,全靠 DrugBank 的靶点关联字段作为种子边。
用 API 获取一个药物的靶点示例(用 Python requests):
import requests
base = "https://api.drugbank.com/v1"
drug_id = "DB00001" # Lepirudin
headers = {"Authorization": "Bearer YOUR_API_KEY"}
# 获取药物基本信息
r = requests.get(f"{base}/drugs/{drug_id}", headers=headers)
data = r.json()
print(data["drug"]["name"])
# 输出: Lepirudin
# 获取靶点列表
targets = data["drug"]["targets"]
for t in targets:
print(t["id"], t["name"], t["action"])
小技巧:DrugBank 免费 API key 可申请,但每天 500 次。如果你要批量下载,建议直接用官方提供的 XML 转储文件,本地解析更快。我在项目中写过一个解析器,把 XML 中的 drug–target 关系抽成三元组。
3.4 ChEMBL —— 生物活性数据的宝库
ChEMBL 的核心价值在于它记录了化合物对靶点的具体活性实验数据(IC50、Ki、Kd 等)。如果你需要做 “化合物–靶点关系” 的量化关系图,ChEMBL 是绕不开的。我记得有一回帮制药公司做一个靶点选择性分析,ChEMBL 上某个靶点有 3000 多个化合物的活性数据,直接用来画热图和聚簇,非常爽。
下载 ChEMBL 全库并查询示例(本地 MySQL 版):
# 从 ftp://ftp.ebi.ac.uk/pub/databases/chembl/ChEMBLdb/ 下载最新版 dump
# 导入 MySQL
mysql -u root -p chembl_31 < chembl_31_mysql.sql
# 查询某化合物对靶点 ESR1 的 IC50
SELECT md.chembl_id, td.pref_name, act.standard_value, act.standard_units
FROM activities act
JOIN molecule_dictionary md ON act.molregno = md.molregno
JOIN target_dictionary td ON act.target_id = td.target_id
WHERE td.pref_name = 'Estrogen receptor alpha'
AND act.standard_type = 'IC50';
注意!ChEMBL 有多个版本(目前到 34),每次升级 schema 可能有小幅变化。如果你像我一样写脚本依赖表结构,一定要在更新后跑一遍字段验证。我踩过坑:32 版之前 activity_id 是字符串,33 版改成了整数。
3.5 PubChem —— 化合物信息的亚马逊
PubChem 是三者里数据量最大的,但也是最”杂”的。它由三个子库组成:Substance、Compound、BioAssay。Substance 存的是原始提交的样本,Compound 是去重后的唯一结构,BioAssay 是活性测试结果。做知识图谱时,我通常从 Compound 出发,关联 BioAssay 得到活性关系。
PubChem 的 PUG REST API 非常方便,举一个用 CID 查化合物名称和 SMILES 的例子:
import requests
cid = 2244 # Aspirin
r = requests.get(
f"https://pubchem.ncbi.nlm.nih.gov/rest/pug/compound/cid/{cid}/property/IUPACName,CanonicalSMILES/JSON"
)
data = r.json()
props = data["PropertyTable"]["Properties"][0]
print(props["IUPACName"])
# 输出: 2-acetyloxybenzoic acid
print(props["CanonicalSMILES"])
# 输出: CC(=O)OC1=CC=CC=C1C(=O)O
效率提示:PubChem 每天更新,如果你做的是长期知识图谱项目,建议用 FTP 下载全量 SDF,然后本地建索引。我一般用 download_pubchem.py 脚本定期增量同步。
3.6 如何选择与组合使用?
在实际项目中,我很少只用单个库。拿典型的药物–靶点–通路知识图谱来说:
- 实体节点:用 PubChem CID 作为化合物统一标识,用 DrugBank ID 标识药物
- 关系边:药物–靶点关系优先从 DrugBank 取(权威),ChEMBL 的活性数据作为补充证据(加权)
- 属性补充:化合物的 SMILES、MW、LogP 从 PubChem 抓;药物的临床阶段、ATC 分类从 DrugBank 抓
下面这张图展示了我常用的数据融合逻辑,看明白后你就知道三个库怎么配合了。
3.7 避坑指南与个人经验
- 版本问题:这三个库都有不同版本,尤其是 DrugBank 每年只更新两次,而 PubChem 天天变。做知识图谱时一定要记录数据源的版本号,否则后面溯源会抓狂。
- ID 映射:同一个化合物在三个库的 ID 不同。我建议建一个“ID 映射表”,用 InChIKey 或 SMILES 哈希作为映射桥。别直接用名称映射,因为同分异构体搞死人。
- 速率控制:免费 API 都有速率限制。我曾经写了一个循环忘了加 sleep,结果 DrugBank 直接封我 IP 一小时。所以写代码时一定要加 time.sleep(0.5) 之类的控制。
- 许可证:DrugBank 的免费版不允许商业重发布,ChEMBL 和 PubChem 相对宽松。如果你的知识图谱要对外商用,提前看许可协议。
一句话总结:DrugBank 给“关系”,ChEMBL 给“数字”,PubChem 给“结构”。三者配合,才能搭出靠谱的药物知识图谱。