4. 数据获取与来源:公共数据库与文献挖掘

数据获取是靶点图谱质控的第一步,也是基础中的基础。我经常跟团队说一句话:「垃圾进,垃圾出」。你后面质检做得再好,如果源头数据是脏的,整个项目可能都得返工。

这一章我带你实地走一遍常用数据源的获取流程。当然,不光是跑命令,更多是我踩过的坑和总结出的习惯。

4.1 核心公共数据库概览

做药物靶点图谱,三个数据库绕不开:DrugBank、ChEMBL、TCGA。它们的定位不同,质量特征也差很多。

数据库数据类型更新频率质控常见问题
DrugBank获批药物 + 靶点关联每年1-2次靶点标识符版本不一致
ChEMBL活性数据 + 靶点每季度活性值单位不统一,缺失
TCGA基因组 / 转录组 / 临床不定期样本ID错乱,批次效应

我个人习惯先把这三个库的元数据拉下来,建一个快照。这么做的好处是:一旦后面发现数据对不上,能很快定位是数据更新导致的差异,还是我处理过程出了问题。

4.2 DrugBank:手动下载与解析

DrugBank提供XML格式的完整数据包,但必须是注册用户。嗯,这里要注意:免费下载版和商用版字段不完全一样。

我记得有一次项目急着用,直接拿了免费版跑流程。结果发现「DrugBank ID」跟文献里对不上,浪费了两天时间。后来核实才知道,免费版里不少靶点标注的是「UniProt ID」,而不是内部ID。

推荐的获取方式:

# 登录后手动下载,不要用爬虫
# DrugBank 对自动化访问有限制
# 下载最新 full database XML (~1.2 GB)

# 解析用 Python + lxml
import lxml.etree as ET

tree = ET.parse('drugbank_all_full_database.xml')
root = tree.getroot()

ns = {'db': 'http://www.drugbank.ca'}
targets = root.findall('.//db:target', ns)

避坑: 我曾经因为没校验 schema 版本,解析出来的基因列表全是乱的。DrugBank 的 XML 格式偶尔会微调,建议下载时一并把 XSD 拉下来,做格式校验。

4.3 ChEMBL:API 与批量下载

ChEMBL 是我个人最喜欢用的。为什么?它开放、标准化、有 API。说白了,你可以用几条命令就把想要的靶点-化合物活性数据拉下来,不用跟几百 MB 的 XML 搏斗。

获取流程大致是:

  1. 用 ChEMBL web API 查询目标靶点
  2. 拉取关联的活性数据
  3. 校验 pChEMBL 值、标准类型和单位

举个实际例子:

# 使用 chembl_webresource_client
from chembl_webresource_client.new_client import new_client

molecule = new_client.molecule
target = new_client.target

# 根据 UniProt ID 查靶点
t = target.get('P00533')  # EGFR

# 拉取活性数据
activities = new_client.activity
res = activities.filter(target_chembl_id=t['target_chembl_id'])

# 只保留 IC50,单位 nM
clean = [r for r in res if r['standard_type'] == 'IC50'
         and r['standard_units'] == 'nM']

建议每次拉取数据后,立即记录 API 版本号 和 拉取时间戳。版本更迭时,同样的查询可能返回不同结果,有这个记录能帮你快速排查。

4.4 TCGA:临床与突变数据的获取

TCGA 的数据量最大,但也是最容易出问题的。我个人经验是:不要直接使用原始文件,最好走官方推荐的 GDC Data Portal 或 TCGA-Biolinks 包。

举个例子,下载某个癌种的体细胞突变信息:

# R 语言,使用 TCGAbiolinks
library(TCGAbiolinks)

query <- GDCquery(
    project = "TCGA-LUAD",
    data.category = "Simple Nucleotide Variation",
    data.type = "Masked Somatic Mutation",
    workflow.type = "Aliquot Ensemble Somatic Variant Merged and Masked"
)

GDCdownload(query)
data <- GDCprepare(query)

你想想看,如果直接去 AWS 公开存储桶里扒文件,有可能拿到非标准化的 VCF 格式。不同中心提交的 VCF 字段名都不一样,后期整合起来很痛苦。

我的习惯: 拉完 TCGA 数据后,先跑一个简单的样本 ID 去重和临床信息核对。TCGA 样本命名有固定规则(TCGA-XX-XXXX-XX),格式不匹配的行直接标红,不加到靶点图谱里。

4.5 文献挖掘:手动 vs 自动化

公共数据库之外,还有一大块数据来源是文献。很多靶点-疾病关联,尤其是比较新的,数据库还没收录。

文献挖掘有两条路:

  • 手动阅读 + 标准化录入:准确率高,但效率低。推荐用于核心靶点的核查。
  • 自动化 NER + 关系抽取:效率高,但噪声大。适合大规模筛选。

我在一个项目中试过用 PubTator 的 API 批量提取基因-疾病关联。结果发现,同样的基因名在不同上下文里可能被识别成药物或化合物。这种误识率必须人工复核。

# PubTator API 查询示例
import requests

pmid_list = ["12345678", "23456789"]
url = "https://www.ncbi.nlm.nih.gov/research/pubtator-api/publications/export/biocxml"

response = requests.post(url, data={"pmids": ",".join(pmid_list)})
print(response.text)

注意: 文献挖掘的结果 绝对不能直接入库。我曾经遇到过同一篇文献里的靶点名称被不同工具解析成两种基因,导致图谱里出现重复边。最好加一道「人工抽检」流程,按照 5%-10% 比例随机抽样验证。

4.6 多源数据整合策略

数据各自拉下来之后,最头疼的其实就是整合。不同库用的 ID 体系不同,字段语义也不同。

我建议的流程如下:

  1. ID 映射: 统一用 Ensembl Gene ID 或 UniProt ID 作为主键。
  2. 去重: 根据同一篇文献 / 同一个实验识别重复记录。
  3. 冲突处理: 如果一个靶点在不同库里关联的疾病不同,优先采信更高证据等级的源(如 FDA 标签 > 文献 > 数据库)。

下面这张图概括了整个数据获取与整合的逻辑链:

数据获取与整合流程框架 DrugBank 获批药物 + 靶点关联 ChEMBL 活性数据 + 靶点 TCGA 基因组 / 临床数据 文献挖掘 手工 / 自动化 NER 数据整合与 ID 映射 冲突处理 / 证据等级排序 输出:标准化靶点-药物关联表 虚线:文献挖掘补充 实线:主要数据流

4.7 质控要点小结

数据获取阶段,我个人最看重的质控点有三个:

  • 版本锁定: 所有数据源必须记录拉取时的版本号或日期。
  • 格式校验: 用 schema 或约定好的字段规范做自动化检查。
  • ID 无歧义: 统一 ID 体系,避免出现「同一个基因,三个名字」的情况。

你想想看,这些事看起来琐碎,但真到项目中期,数据越堆越多,早期的一个小疏忽就可能被放大。我宁愿在获取阶段多花半天做校验,也不愿意后期花一周去排查。