跳转至

药物靶点数据库 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