2 数据来源:公开数据库(DrugBank、KEGG、ChEMBL 等)介绍与获取归纳总结

做药物图谱分析,第一步就是搞到靠谱的数据。你想想看,不管算法多漂亮,数据是脏的,结论就是废的。这些年我踩过不少坑——从网上爬下来一堆格式错乱的化合物,结果预处理花了三倍于分析的时间。所以这一章,咱就聊聊几个最常用的公开数据库,怎么获取,怎么避坑,以及我个人的一些习惯。

2.1 为什么是这些数据库?

药物信息学涉及的公开数据库少说有几十个,但真正做 Visual Analytics 用得最顺手、社区维护最勤的,无非这三家:DrugBank、KEGG、ChEMBL。它们分别覆盖了药物靶点、代谢通路和生物活性三个核心视角。

我的习惯:刚开始接触一个新项目时,我会先用 ChEMBL 跑一轮活性筛选,然后用 DrugBank 补充靶点信息,最后到 KEGG 里看通路上下文。这个顺序能避免信息过载。

下面这张图能帮你快速建立这三个数据库的定位关系:

药物图谱核心数据源结构 DrugBank 药物 + 靶点 获批/实验阶段 作用机制 KEGG 代谢通路 疾病-基因关联 通路图谱 ChEMBL 生物活性 IC50/Ki/EC50 文献挖掘 常见查询逻辑 1. 药物→ DrugBank → 靶点基因 → KEGG → 通路 2. 化合物 → ChEMBL → 活性数据 → 筛选候选 3. 疾病 → KEGG → 通路 → DrugBank → 已有药物 4. 三个数据库交叉验证,提升数据可信度 注:箭头表示数据流动方向,非集成工具链

2.2 DrugBank:药物与靶点权威库

DrugBank 是目前最全面的药物-靶点知识库。它把所有药物分为两类:获批药物 和 实验阶段药物。每个条目都包含化学结构、靶点、作用机制、药物相互作用等信息。

获取方式很简单。官方提供 XML 和 CSV 两种格式的完整下载。我个人习惯用 XML,因为结构更完整,但解析起来稍微费力一点。

关键字段速览:
字段名说明数据类型
drugbank-id唯一标识,如 DB00001字符串
name通用名字符串
targets靶点列表(基因名、UniProt ID)嵌套结构
groups分类(approved / experimental)枚举
drug-interactions药物-药物相互作用列表

用 Python 解析 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):
    drug_id = drug.find("db:drugbank-id", ns).text
    name = drug.find("db:name", ns).text
    targets = drug.findall("db:targets/db:target", ns)
    print(f"{drug_id}: {name}, {len(targets)} targets")
我曾经… 直接拿未过期的 DrugBank 完整 XML 去解析,结果内存爆了。那个文件解压后有 2GB 以上。建议先用 SAX 流式解析,或者用 Python 的 iterparse 逐元素处理。

2.3 KEGG:通路与系统生物学

KEGG(Kyoto Encyclopedia of Genes and Genomes)是日本京都大学和生物信息学中心维护的。它最出名的是通路图(Pathway Maps),但还包含疾病、基因、化合物、药物等多个子库。

获取方式有点特殊。KEGG 官方不提供完整的一键下载(受许可协议限制),但提供了 KEGG API,可以通过 HTTP GET 请求获取数据。我用得比较多的是 list 和 get 两个命令。

举个例子,获取 human 通路列表:

curl -X GET "https://rest.kegg.jp/list/pathway/hsa" > hsa_pathways.txt

然后获取具体通路内容:

curl -X GET "https://rest.kegg.jp/get/hsa00010" > glycolysis.txt

KEGG 返回的内容是纯文本格式,带一定的结构化缩进。我一般用 Python 正则解析:

import requests
import re

response = requests.get("https://rest.kegg.jp/get/hsa00010")
text = response.text
# 提取通路中的基因列表
genes = re.findall(r"([A-Z0-9]+)\s+\([^)]+\)", text)
print(genes[:10])
避坑指南:KEGG API 有调用频率限制,好像是每秒 1 次。我个人习惯加个 time.sleep(1),否则会被封 IP。还有,KEGG 的数据更新较慢,新近发表的药物通路可能还没收录。

2.4 ChEMBL:生物活性与文献挖掘

ChEMBL 由 EMBL-EBI 维护,是目前最大的开放药物活性数据库。它收录了从文献中手工挖掘的化合物-靶点结合数据,包括 IC50、Ki、EC50 等。这对 Visual Analytics 来说特别重要——你可以在图上直接标注活性值。

ChEMBL 提供两种获取路径:

  • 直接下载 MySQL dump:适合本地搭建全量数据库。文件较大(约 20GB 压缩后),但查询灵活。
  • ChEMBL Web Services API:轻量级,适合按需查询。我最常用的是 chembl_id_lookup 和 activity 端点。

用 API 查询某个化合物的活性数据(以 CHEMBL25 为例):

import requests

url = "https://www.ebi.ac.uk/chembl/api/data/activity"
params = {
    "molecule_chembl_id": "CHEMBL25",
    "limit": 10,
    "format": "json"
}
response = requests.get(url, params=params)
data = response.json()
for act in data["activities"]:
    print(act["standard_type"], act["standard_value"], act["standard_units"])

返回的结果一般包含活性类型、数值、单位、靶点等信息。我会直接转成 DataFrame 做后续分析。

三个数据库对比总表:
对比维度DrugBankKEGGChEMBL
核心内容药物-靶点代谢通路生物活性
数据粒度药物条目通路反应单一实验
获取方式XML/CSV 下载API 按需获取MySQL dump / API
更新频率每年 1-2 次不定期每季度
主要用途靶点发现通路分析活性筛选

2.5 获取数据的常见陷阱

这些年我总结出几个新手最容易犯的错:

  • 版本不一致:DrugBank 每年会出新版,不同版本之间字段可能变化。我建议在做项目前固定一个版本号,并在代码里写死版本校验。
  • ID 映射混乱:同一个药物在不同库里的 ID 不一样。需要用 UniProt、ChEBI 或 PubChem CID 做交叉映射。我一般先拉一张映射表。
  • 许可协议:KEGG 的学术和非商业使用是免费的,但商业使用需要付费。DrugBank 和 ChEMBL 相对宽松,但也要看具体条款。
  • 数据洁癖:ChEMBL 里有大量“不活跃”数据,如果全拿来用,Visual Analytics 图上会乱成一片。我习惯只保留 pChEMBL > 5 的条目。
注意: 批量下载数据时,一定先看数据库的使用条款。曾经有同事被 KEGG 警告过,因为他一天内发了超过 1 万次 API 请求。尊重规则,才能长期使用。

2.6 小结与实操建议

总结一下:做药物图谱 Visual Analytics,数据源选对了就成功了一半。我个人最常用的组合是 DrugBank 做靶点骨架、ChEMBL 做活性填充、KEGG 做通路上下文。在后续章节中,我会演示如何把这三个来源的数据融合成一个统一的知识图谱。

最后分享一个小技巧:写 Python 脚本时,把每个数据库的 API 调用封装成独立的函数,加上重试和日志。这样即使某个库挂了,也不影响整体流程。嗯,这就是经验带来的习惯。