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 Database

概要

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 は、疾患に Experimental Factor Ontology(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.sizeAssociations101~100001 ページあたりのレコード数
page.indexAssociations00~Nページネーションのページインデックス
orderByScoreAssociations"score""score"、コンポーネント ID関連性をスコア順に並べ替える
datasourceIdsEvidenceすべてのソースデータソース ID のリストソースでエビデンスを絞り込む
enableIndirectEvidencefalsetrue/false子疾患のエビデンスを含める
entityNamesSearchすべて["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']}")

トラブルシューティング

問題原因解決策
GraphQL エラーを伴う HTTP 400クエリの形式が不正、またはフィールド名が無効https://api.platform.opentargets.org/api/v4/graphql の GraphQL スキーマに照らしてクエリを確認してください
関連情報の rows が空EFO ID が認識されないsearch クエリを使って正しい EFO ID を検索してください
ターゲットが見つからない遺伝子シンボルと Ensembl ID の不一致まず search クエリを使って Ensembl ID を解決してください
大量の結果を取得するクエリが遅いpage.size が大きすぎる500 行を上限とし、複数のリクエストでページネーションしてください
創薬可能性データがないターゲットが評価されていないすべてのターゲットに創薬可能性のデータがあるわけではありません。tractability フィールドが null ではないことを確認してください
drugAndClinicalCandidates が空ChEMBL に医薬品とターゲットのエビデンスがない前臨床化合物の活性を調べるには chembl-database-bioactivity を使用してください

関連スキル

  • chembl-database-bioactivity — ターゲットに対する化合物の生物活性 IC50/Ki データ
  • clinicaltrials-database-search — Open Targets で見つかった医薬品の詳細な臨床試験情報
  • ensembl-database — Open Targets のクエリ入力に必要な Ensembl ID とバリアントの注釈
  • string-database-ppi — ターゲットの生物学的背景を把握するためのタンパク質間相互作用ネットワーク

参考資料

コメント