mcpField
O
opentargets-database

opentargets-database

github.com/jaechang-hits数据与数据库38473 次安装1 周前更新
代码仓库

关于 opentargets-database

opentargets-database 是面向研究人员和药物研发团队的技能,可通过 Open Targets Platform 公共 GraphQL API 查询数据,涵盖靶点-疾病评分、证据、药物、可成药性和安全性。

主要功能

  1. 01靶点-疾病关联评分
  2. 02来自多个数据源的证据
  3. 03已批准及研发中药物查询
  4. 04可成药性与安全性数据

适用场景

  1. 01为疾病筛选优先靶点
  2. 02查找与基因相关的疾病
  3. 03查看靶点对应药物及临床阶段
  4. 04检查靶点-疾病组合的遗传证据

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/jaechang-hits/sciagent-skills --skill opentargets-database

安装后在 Claude Code 中输入/opentargets-database确认已加载。

详细介绍

Open Targets Platform 数据库

概述

Open Targets Platform 整合了遗传学、基因组学、文献和药物数据库中的证据,系统地为 60,000 多个靶点和 20,000 多种疾病/表型计算靶点-疾病关联评分。公开的 GraphQL API(无需身份验证)提供关联评分、来自 20 多个数据源的证据(GWAS、ClinVar、ChEMBL、药物、通路、小鼠模型、表达数据),以及详细的药物-靶点-疾病关联信息。

适用场景

  • 根据总体关联评分和证据明细,为某种疾病筛选治疗靶点
  • 查找与目标基因相关的所有疾病及其置信度评分
  • 获取某个靶点的已获批和在研药物,以及作用机制和临床阶段
  • 评估靶点的成药性和可开发性(小分子、抗体、PROTAC 的可能性)
  • 提取某个靶点-疾病组合的遗传关联证据(GWAS 命中、变异到基因的映射)
  • 从 FAERS 和文献中探索某个药物靶点的安全性/不良事件数据
  • 查询生物活性 IC50/Ki 数据,请使用 chembl-database-bioactivity;查询临床试验详情,请使用 clinicaltrials-database-search

先决条件

  • Python 包:requests
  • 数据要求:基因符号(HGNC)、Ensembl 基因 ID、疾病 EFO ID 或药物名称
  • 环境:需要互联网连接;无需身份验证
  • 速率限制:未说明硬性限制;执行大型查询时(>100 个靶点)请合理设置请求间隔
pip install requests

快速入门

import requests

OT_URL = "https://api.platform.opentargets.org/api/v4/graphql"

def ot_query(gql, variables=None):
    r = requests.post(OT_URL, json={"query": gql, "variables": variables or {}})
    r.raise_for_status()
    return r.json()["data"]

# Top disease associations for BRCA1
query = """
query TargetDiseases($ensgId: String!) {
  target(ensemblId: $ensgId) {
    id
    approvedSymbol
    associatedDiseases(page: {index: 0, size: 5}) {
      rows {
        disease { id name }
        score
      }
    }
  }
}
"""
data = ot_query(query, {"ensgId": "ENSG00000012048"})
target = data["target"]
print(f"Target: {target['approvedSymbol']}")
for row in target["associatedDiseases"]["rows"]:
    print(f"  {row['disease']['name']}: {row['score']:.3f}")

核心 API

查询 1:按基因符号查找靶点

搜索靶点并获取基本元数据(Ensembl ID、生物类型、描述)。

import requests

OT_URL = "https://api.platform.opentargets.org/api/v4/graphql"

def ot_query(gql, variables=None):
    r = requests.post(OT_URL, json={"query": gql, "variables": variables or {}})
    r.raise_for_status()
    return r.json()["data"]

# Search by gene symbol
query = """
query SearchTarget($sym: String!) {
  search(queryString: $sym, entityNames: ["target"]) {
    hits {
      id
      name
      entity
      object {
        ... on Target {
          approvedSymbol
          approvedName
          biotype
          functionDescriptions
        }
      }
    }
  }
}
"""
data = ot_query(query, {"sym": "BRCA1"})
for hit in data["search"]["hits"][:3]:
    obj = hit.get("object", {})
    print(f"ID: {hit['id']} | {obj.get('approvedSymbol')} | {obj.get('biotype')}")
    descs = obj.get("functionDescriptions", [])
    if descs:
        print(f"  Function: {descs[0][:120]}")
# Direct lookup by Ensembl ID
query2 = """
query Target($ensgId: String!) {
  target(ensemblId: $ensgId) {
    id approvedSymbol approvedName biotype
    tractability { label modality value }
  }
}
"""
data2 = ot_query(query2, {"ensgId": "ENSG00000141510"})  # TP53
t = data2["target"]
print(f"\n{t['approvedSymbol']} ({t['id']}): {t['biotype']}")
print("Tractability:")
for tr in t.get("tractability", [])[:5]:
    print(f"  {tr['modality']} | {tr['label']}: {tr['value']}")
查询 2:靶点-疾病关联

获取某个靶点与所有相关疾病的关联评分。

import requests, pandas as pd

OT_URL = "https://api.platform.opentargets.org/api/v4/graphql"

def ot_query(gql, variables=None):
    r = requests.post(OT_URL, json={"query": gql, "variables": variables or {}})
    r.raise_for_status()
    return r.json()["data"]

query = """
query Associations($ensgId: String!, $size: Int!) {
  target(ensemblId: $ensgId) {
    approvedSymbol
    associatedDiseases(page: {index: 0, size: $size}, orderByScore: "score") {
      count
      rows {
        disease { id name therapeuticAreas { name } }
        score
        datatypeScores { id score }
      }
    }
  }
}
"""
data = ot_query(query, {"ensgId": "ENSG00000012048", "size": 20})
target = data["target"]
assoc = target["associatedDiseases"]
print(f"{target['approvedSymbol']}: {assoc['count']} associated diseases")

rows = []
for r in assoc["rows"]:
    scores = {d["id"]: d["score"] for d in r.get("datatypeScores", [])}
    rows.append({
        "disease": r["disease"]["name"],
        "disease_id": r["disease"]["id"],
        "overall_score": round(r["score"], 4),
        "genetics": round(scores.get("genetic_association", 0), 3),
        "drugs": round(scores.get("known_drug", 0), 3),
        "literature": round(scores.get("literature", 0), 3),
    })

df = pd.DataFrame(rows)
print(df.head(10).to_string(index=False))
查询 3:疾病-靶点关联

给定一种疾病,获取所有相关靶点并按评分排序。

import requests, pandas as pd

OT_URL = "https://api.platform.opentargets.org/api/v4/graphql"

def ot_query(gql, variables=None):
    r = requests.post(OT_URL, json={"query": gql, "variables": variables or {}})
    r.raise_for_status()
    return r.json()["data"]

query = """
query DiseaseTargets($efoId: String!, $size: Int!) {
  disease(efoId: $efoId) {
    id name
    associatedTargets(page: {index: 0, size: $size}, orderByScore: "score") {
      count
      rows {
        target { id approvedSymbol biotype }
        score
        datatypeScores { id score }
      }
    }
  }
}
"""
# EFO_0000305 = breast carcinoma
data = ot_query(query, {"efoId": "EFO_0000305", "size": 10})
disease = data["disease"]
print(f"Disease: {disease['name']}")
print(f"Total associated targets: {disease['associatedTargets']['count']}")

for row in disease["associatedTargets"]["rows"][:5]:
    t = row["target"]
    print(f"  {t['approvedSymbol']:12s} score={row['score']:.3f} biotype={t['biotype']}")
查询 4:靶点的已知药物

获取已获批和在研药物、作用机制及临床阶段。

import requests, pandas as pd

OT_URL = "https://api.platform.opentargets.org/api/v4/graphql"

def ot_query(gql, variables=None):
    r = requests.post(OT_URL, json={"query": gql, "variables": variables or {}})
    r.raise_for_status()
    return r.json()["data"]

query = """
query KnownDrugs($ensgId: String!) {
  target(ensemblId: $ensgId) {
    approvedSymbol
    drugAndClinicalCandidates {
      count
      rows {
        maxClinicalStage
        drug { id name drugType maximumClinicalStage mechanismsOfAction { rows { mechanismOfAction } } }
        diseases { disease { id name } }
      }
    }
  }
}
"""
data = ot_query(query, {"ensgId": "ENSG00000146648"})  # EGFR
target = data["target"]
drugs_data = target["drugAndClinicalCandidates"]
print(f"{target['approvedSymbol']}: {drugs_data['count']} drug-indication pairs")

rows = []
for r in drugs_data["rows"]:
    drug = r["drug"]
    moa = drug.get("mechanismsOfAction") or {}
    moa_first = (moa.get("rows") or [{}])[0].get("mechanismOfAction")
    first_disease = (r.get("diseases") or [{}])[0].get("disease") or {}
    rows.append({
        "drug": drug["name"],
        "type": drug["drugType"],
        "maxClinicalStage": r["maxClinicalStage"],
        "approved": drug["maximumClinicalStage"] == "PHASE_4",
        "indication": first_disease.get("name", "n/a"),
        "mechanism": moa_first,
    })

df = pd.DataFrame(rows).drop_duplicates(subset=["drug", "indication"])
print(df.head(10).to_string(index=False))
查询 5:特定靶点-疾病组合的证据

获取某个靶点-疾病组合的详细证据记录(GWAS、ClinVar、文献)。

import requests

OT_URL = "https://api.platform.opentargets.org/api/v4/graphql"

def ot_query(gql, variables=None):
    r = requests.post(OT_URL, json={"query": gql, "variables": variables or {}})
    r.raise_for_status()
    return r.json()["data"]

query = """
query Evidence($ensgId: String!, $efoId: String!) {
  disease(efoId: $efoId) {
    evidences(
      ensemblIds: [$ensgId]
      enableIndirect: true
      size: 10
      datasourceIds: ["gwas_catalog", "clinvar", "chembl"]
    ) {
      count
      rows {
        datasourceId
        score
        variantRsId
        studyId
        publicationYear
        clinicalSignificances
      }
    }
  }
}
"""
data = ot_query(query, {"ensgId": "ENSG00000012048", "efoId": "EFO_0000305"})
evidences = data["disease"]["evidences"]
print(f"Evidence records: {evidences['count']}")
for ev in evidences["rows"][:5]:
    print(f"  Source: {ev['datasourceId']:20s} | Score: {ev['score']:.3f}")
查询 6:安全性和不良事件

获取某个靶点的已知不良事件和安全性数据。

import requests

OT_URL = "https://api.platform.opentargets.org/api/v4/graphql"

def ot_query(gql, variables=None):
    r = requests.post(OT_URL, json={"query": gql, "variables": variables or {}})
    r.raise_for_status()
    return r.json()["data"]

query = """
query Safety($ensgId: String!) {
  target(ensemblId: $ensgId) {
    approvedSymbol
    safetyLiabilities {
      event
      effects { direction dosing }
      biosamples { tissueLabel cellLabel }
      datasource
    }
  }
}
"""
data = ot_query(query, {"ensgId": "ENSG00000146648"})  # EGFR
target = data["target"]
print(f"Safety liabilities for {target['approvedSymbol']}:")
for s in target.get("safetyLiabilities", [])[:5]:
    print(f"  Event: {s['event']}")
    # 2025 schema: `datasource` is a scalar literature-citation string,
    # not the legacy `datasources[{name, pmid}]` list of objects
    print(f"    Source: {s.get('datasource', 'n/a')}")
    for eff in s.get("effects", []) or []:
        print(f"    Effect: direction={eff.get('direction')} dosing={eff.get('dosing')}")

核心概念

关联评分

Open Targets 使用调和和聚合方法,将多个数据源的证据合并为 0–1 的关联评分。子评分包括:genetic_association、somatic_mutation、known_drug、affected_pathway、literature、RNA_expression、animal_model 等。评分越高,表示证据越多、力度越强。

疾病的 EFO ID

Open Targets 使用实验因子本体(EFO)标识符表示疾病(例如,乳腺癌的 EFO_0000305)。查询关联之前,请使用 search 查询按疾病名称查找 EFO ID。

常见工作流

工作流 1:疾病靶点优先级排序

目标:给定一种疾病,按总体评分对所有相关靶点排序,并导出证据明细。

import requests, pandas as pd, time

OT_URL = "https://api.platform.opentargets.org/api/v4/graphql"

def ot_query(gql, variables=None):
    r = requests.post(OT_URL, json={"query": gql, "variables": variables or {}})
    r.raise_for_status()
    return r.json()["data"]

def disease_search(name):
    q = 'query S($q:String!){search(queryString:$q,entityNames:["disease"]){hits{id name}}}'
    data = ot_query(q, {"q": name})
    return [(h["id"], h["name"]) for h in data["search"]["hits"][:3]]

def get_top_targets(efo_id, n=50):
    q = """
    query($efoId:String!,$size:Int!){
      disease(efoId:$efoId){
        name
        associatedTargets(page:{index:0,size:$size},orderByScore:"score"){
          count
          rows{
            target{id approvedSymbol biotype}
            score
            datatypeScores { id score }
          }
        }
      }
    }"""
    data = ot_query(q, {"efoId": efo_id, "size": n})
    disease = data["disease"]
    rows = []
    for row in disease["associatedTargets"]["rows"]:
        t = row["target"]
        scores = {d["id"]: round(d["score"], 3) for d in row.get("datatypeScores", [])}
        rows.append({
            "target": t["approvedSymbol"],
            "ensembl_id": t["id"],
            "biotype": t["biotype"],
            "overall_score": round(row["score"], 4),
            **scores
        })
    return disease["name"], pd.DataFrame(rows)

# Step 1: Find EFO ID for disease
candidates = disease_search("non-small cell lung carcinoma")
print("Disease candidates:", candidates)

# Step 2: Get top targets
disease_name, df = get_top_targets("EFO_0003060", n=50)
df.to_csv("target_prioritization.csv", index=False)
print(f"\nTop targets for {disease_name}:")
cols = [c for c in ["target", "overall_score", "genetic_association", "known_drug", "literature", "rna_expression", "somatic_mutation"] if c in df.columns]
print(df[cols].head(10).to_string(index=False))
工作流 2:药物-靶点-疾病关联

目标:针对某个靶点,获取所有药物及其相关适应症和临床阶段。

import requests, pandas as pd

OT_URL = "https://api.platform.opentargets.org/api/v4/graphql"

def ot_query(gql, variables=None):
    r = requests.post(OT_URL, json={"query": gql, "variables": variables or {}})
    r.raise_for_status()
    return r.json()["data"]

query = """
query($ensgId:String!){
  target(ensemblId:$ensgId){
    approvedSymbol
    drugAndClinicalCandidates{
      count
      rows{
        maxClinicalStage
        drug{id name drugType maximumClinicalStage mechanismsOfAction { rows { mechanismOfAction } } }
        diseases { disease { id name } }
      }
    }
  }
}"""

targets = {
    "EGFR": "ENSG00000146648",
    "ERBB2": "ENSG00000141736",
}

all_rows = []
for sym, ensg in targets.items():
    data = ot_query(query, {"ensgId": ensg})
    for row in data["target"]["drugAndClinicalCandidates"]["rows"]:
        drug = row["drug"]
        moa = drug.get("mechanismsOfAction") or {}
        moa_first = (moa.get("rows") or [{}])[0].get("mechanismOfAction")
        first_disease = (row.get("diseases") or [{}])[0].get("disease") or {}
        all_rows.append({
            "target": sym,
            "drug": drug["name"],
            "drug_type": drug["drugType"],
            "maxClinicalStage": row["maxClinicalStage"],
            "approved": drug["maximumClinicalStage"] == "PHASE_4",
            "indication": first_disease.get("name", "n/a"),
            "mechanism": moa_first,
        })

df = pd.DataFrame(all_rows)
df.to_csv("drug_target_matrix.csv", index=False)
print(df.head(10).to_string(index=False))

关键参数

参数模块默认值范围/选项作用
page.size关联101–10000每页记录数
page.index关联00–N分页页码
orderByScore关联"score""score"、组件 ID按评分对关联排序
datasourceIds证据所有来源数据源 ID 列表按来源筛选证据
enableIndirect证据falsetrue/false包含子级疾病证据
entityNames搜索所有["target"]、["disease"]筛选搜索实体类型

最佳实践

  1. 疾病使用 EFO ID:疾病名称可能不同;运行关联查询前,始终使用 search 查询获取规范的 EFO ID,以避免名称匹配问题。

  2. 分页获取完整结果集:默认页面大小为 10;使用 page.size: 10000 获取完整结果,但请注意,这可能会返回很大的数据负载。

  3. 按 datatypeScores 筛选:验证遗传靶点时,筛选 genetic_association 子评分 > 0.1;重新定位药物时,优先考虑 known_drug 子评分。

  4. 在证据查询中使用 enableIndirect: true,以纳入疾病亚型(EFO 层级中的子项)的证据。

  5. 缓存 GraphQL 响应:Open Targets 数据每季度更新;分析期间缓存响应,以避免重复调用 API。

常见配方

配方:将疾病名称转换为 EFO ID

使用场景:将疾病名称解析为关联查询所需的 EFO ID。

import requests

OT_URL = "https://api.platform.opentargets.org/api/v4/graphql"

query = """
query($q: String!) {
  search(queryString: $q, entityNames: ["disease"]) {
    hits { id name score }
  }
}"""
r = requests.post(OT_URL, json={"query": query, "variables": {"q": "breast cancer"}})
for hit in r.json()["data"]["search"]["hits"][:5]:
    print(f"{hit['id']}: {hit['name']} (score={hit['score']:.3f})")
配方:评估靶点可成药性

使用场景:评估靶点是否适用于小分子、抗体或 PROTAC。

import requests

OT_URL = "https://api.platform.opentargets.org/api/v4/graphql"

query = """
query($ensgId: String!) {
  target(ensemblId: $ensgId) {
    approvedSymbol
    tractability { label modality value }
  }
}"""
r = requests.post(OT_URL, json={"query": query, "variables": {"ensgId": "ENSG00000141510"}})
t = r.json()["data"]["target"]
print(f"Tractability for {t['approvedSymbol']}:")
for tr in t.get("tractability", []):
    if tr["value"]:
        print(f"  [{tr['modality']}] {tr['label']}")
配方:疾病的已批准药物

使用场景:查找具有 4 期证据的疾病所有已批准药物。

import requests, pandas as pd

OT_URL = "https://api.platform.opentargets.org/api/v4/graphql"

query = """
query($efoId: String!) {
  disease(efoId: $efoId) {
    name
    drugAndClinicalCandidates { count rows {
      maxClinicalStage
      drug { name maximumClinicalStage drugType }
    }}
  }
}"""
r = requests.post(OT_URL, json={"query": query, "variables": {"efoId": "EFO_0000305"}})
data = r.json()["data"]["disease"]
approved = [row for row in data["drugAndClinicalCandidates"]["rows"] if row["drug"]["maximumClinicalStage"] == "PHASE_4"]
print(f"Approved drugs for {data['name']}: {len(approved)}")
for row in approved[:5]:
    print(f"  {row['drug']['name']} ({row['drug']['drugType']})  maxStage={row['maxClinicalStage']}")

故障排除

问题原因解决方案
HTTP 400,并出现 GraphQL 错误查询格式错误或字段名称无效在 https://api.platform.opentargets.org/api/v4/graphql 检查查询是否符合 GraphQL 架构
关联结果中的 rows 为空EFO ID 未被识别使用 search 查询查找正确的 EFO ID
未找到靶点基因符号与 Ensembl ID 不匹配先使用 search 查询解析 Ensembl ID
大型结果集查询缓慢page.size 过大最多设置为 500 行;通过多次请求分页查询
缺少可成药性数据尚未评估该靶点并非所有靶点都有可成药性数据;检查 tractability 字段是否非空
drugAndClinicalCandidates 为空ChEMBL 中没有药物-靶点证据使用 chembl-database-bioactivity 获取临床前化合物活性

相关技能

  • chembl-database-bioactivity — 化合物对靶点的生物活性 IC50/Ki 数据
  • clinicaltrials-database-search — 通过 Open Targets 找到的药物的详细临床试验信息
  • ensembl-database — 作为 Open Targets 查询输入所需的 Ensembl ID 和变异注释
  • string-database-ppi — 用于分析靶点生物学背景的蛋白质-蛋白质相互作用网络

参考资料

评论

支持 Markdown