药物靶点数据库 DrugBank & TTD¶
一句话说明¶
DrugBank 和 TTD 是查询"某个基因/蛋白有什么药可以打它"或"某个药打的是哪个靶点"的核心数据库,做药物基因组学和药物重定位分析时离不开它们。
核心知识点¶
1. DrugBank 简介¶
- 地址:https://go.drugbank.com
- 内容:收录 ~19,900 种药物(DrugBank 6.0,含已批准药物 4,800+、实验药物 8,800+、生物技术药 4,300+ 等)
- 特色:药物-靶点关系、药代动力学参数、药物相互作用、化学结构
- 数据格式:XML、CSV 可下载(学术免费)
- 版本:DrugBank 6.0(2025 最新)
2. TTD 简介¶
- 全称:Therapeutic Target Database(治疗靶点数据库)
- 地址:https://db.idrblab.net/ttd/
- 内容:~3,500 个靶点,~40,000 种药物
- 特色:靶点验证状态分级(临床验证/文献报道/预测)、通路信息
- 优势:靶点分类体系更详细,适合靶点发现研究
3. 其他相关数据库¶
| 数据库 | 特点 | 用途 |
|---|---|---|
| ChEMBL | 生物活性数据(IC50等) | 药物筛选 |
| PubChem | 化学结构和生物活性 | 化合物搜索 |
| DGIdb | 药物-基因互作 | 基因组分析 |
| STITCH | 化学物-蛋白互作 | 网络分析 |
| OpenTargets | 靶点-疾病关联 | 靶点验证 |
| BindingDB | 结合亲和力数据 | 分子对接 |
4. 常见应用场景¶
- 药物重定位:已有药物能否用于新适应症
- 靶点发现:某个差异基因是否可成药(druggable)
- 药物相互作用预测:多药联用的潜在风险
- 基因组注释:在突变基因中标注哪些有对应的药物
实战代码¶
# === DrugBank 数据解析与查询 ===
import xml.etree.ElementTree as ET # XML解析
import pandas as pd # 数据处理
def parse_drugbank_xml(xml_path):
"""解析 DrugBank XML 文件,提取药物-靶点关系"""
ns = "{http://www.drugbank.ca}" # XML命名空间
tree = ET.parse(xml_path) # 解析XML
root = tree.getroot() # 根节点
records = [] # 存储记录
for drug in root.findall(f"{ns}drug"): # 遍历每个药物
drug_name = drug.findtext(f"{ns}name") # 药物名
drug_type = drug.get("type") # 类型
drugbank_id = drug.findtext(f"{ns}drugbank-id") # DrugBank ID
# 获取药物类别
groups = [g.text for g in
drug.findall(f"{ns}groups/{ns}group")] # 状态分组
# 获取靶点信息
for target in drug.findall(f"{ns}targets/{ns}target"):
target_name = target.findtext(f"{ns}name") # 靶点名
gene_name = target.findtext(
f"{ns}polypeptide/{ns}gene-name") # 基因名
organism = target.findtext(f"{ns}organism") # 物种
actions = [a.text for a in
target.findall(f"{ns}actions/{ns}action")] # 作用类型
records.append({
"drug_id": drugbank_id,
"drug_name": drug_name,
"drug_type": drug_type,
"groups": "; ".join(groups), # 药物状态
"target_name": target_name,
"gene_name": gene_name,
"organism": organism,
"actions": "; ".join(actions), # 作用方式
})
return pd.DataFrame(records)
# 使用示例
# df = parse_drugbank_xml("drugbank_all_full_database.xml")
# === DGIdb GraphQL API 查询(v5.0+,无需下载文件) ===
import requests # HTTP请求
def query_dgidb(gene_list):
"""通过 DGIdb GraphQL API 查询基因的药物互作(v5.0+)"""
url = "https://dgidb.org/api/graphql" # GraphQL 端点
query = """
query GetInteractions($genes: [String!]!) {
genes(names: $genes) {
nodes {
name
interactions {
drug { name conceptId }
interactionScore
interactionTypes { type directionality }
sources { sourceDbName }
}
}
}
}
"""
variables = {"genes": gene_list} # 查询变量
resp = requests.post( # GraphQL 用 POST
url,
json={"query": query, "variables": variables}
)
data = resp.json() # 解析JSON
results = []
for gene_node in data.get("data", {}).get("genes", {}).get("nodes", []):
gene = gene_node["name"] # 基因名
for interaction in gene_node.get("interactions", []):
drug = interaction.get("drug", {}).get("name", "") # 药物名
sources = [s["sourceDbName"] for s in
interaction.get("sources", [])] # 来源列表
int_types = [t["type"] for t in
interaction.get("interactionTypes", [])] # 互作类型
results.append({
"gene": gene,
"drug": drug,
"interaction_type": "; ".join(int_types),
"source": "; ".join(sources),
})
result_df = pd.DataFrame(results)
return result_df
# 查询示例:差异基因中哪些可成药
genes_of_interest = ["EGFR", "BRAF", "TP53", "KRAS", "PIK3CA"]
drug_interactions = query_dgidb(genes_of_interest)
print(f"\n查询 {len(genes_of_interest)} 个基因的药物互作:")
print(f"找到 {len(drug_interactions)} 个药物-基因互作对")
# 按基因统计
for gene in genes_of_interest:
gene_drugs = drug_interactions[drug_interactions["gene"] == gene]
print(f"\n {gene}: {len(gene_drugs)} 个药物")
if len(gene_drugs) > 0:
print(f" 示例: {', '.join(gene_drugs['drug'].head(3))}")
# === 命令行方式批量查询 DGIdb(GraphQL API v5.0+) ===
# 1. 批量查询基因列表(GraphQL POST 请求)
curl -s -X POST https://dgidb.org/api/graphql \
-H "Content-Type: application/json" \
-d '{
"query": "query { genes(names: [\"EGFR\",\"BRAF\",\"ALK\",\"ROS1\",\"NTRK1\"]) { nodes { name interactions { drug { name } interactionTypes { type } sources { sourceDbName } } } } }"
}' | python3 -m json.tool > dgidb_results.json # 格式化输出
# 2. 提取可操作靶点
python3 -c "
import json
with open('dgidb_results.json') as f:
data = json.load(f)
for node in data.get('data',{}).get('genes',{}).get('nodes',[]):
gene = node['name']
drugs = [i['drug']['name'] for i in node['interactions']]
print(f'{gene}: {len(drugs)} drugs')
for d in drugs[:5]:
print(f' - {d}')
"
面试常问点¶
★ DrugBank 和 ChEMBL 有什么区别?¶
参考答案:DrugBank 侧重于临床已用药物的综合信息(药代动力学、适应症、相互作用等),是"临床药物百科全书"。ChEMBL 侧重于药物发现阶段的生物活性数据(IC50、Ki、EC50 等实验数据),是"药物筛选数据仓库",收录了几百万条化合物-靶点的生物活性记录。做临床分析用 DrugBank,做药物发现/筛选研究用 ChEMBL。
★ 怎么判断一个基因是否"可成药"(druggable)?¶
参考答案:判断标准包括:(1) 蛋白是否有已知的小分子结合位点(如激酶的 ATP 结合位点);(2) 蛋白是否是细胞表面受体(可以用抗体药物靶向);(3) 在 DGIdb/DrugBank 中是否已有对应的药物或在研化合物;(4) 蛋白是否属于已知的可成药蛋白家族(如激酶、GPCR、核受体、离子通道等)。DGIdb 将基因分为"可成药类别"(druggable categories),可以快速筛查。像 TP53、RAS 这些虽然在肿瘤中非常重要,但传统上被认为"不可成药"(undruggable),不过近年来有了突破(如 KRAS G12C 抑制剂 Sotorasib)。
速查卡片¶
| 问题 | 答案 |
|---|---|
| DrugBank 内容 | ~19,900种药物的综合信息(DrugBank 6.0) |
| TTD 内容 | ~3,500靶点,靶点验证状态 |
| DGIdb | 药物-基因互作聚合数据库 |
| ChEMBL | 生物活性数据(IC50等) |
| 可成药家族 | 激酶、GPCR、核受体、离子通道 |
| API 查询 | DGIdb 提供GraphQL API(v5.0+) |
| DrugBank 格式 | XML(学术免费) |
| 药物重定位 | 已有药物→新适应症 |
| OpenTargets | 靶点-疾病关联证据 |
| undruggable 突破 | KRAS G12C → Sotorasib |