|
"""Open Targets GraphQL client – fetch gene ↔ disease ↔ drug associations. |
|
Docs: https://platform.opentargets.org/ |
|
No API‑key required (public endpoint). |
|
""" |
|
|
|
import httpx, textwrap, asyncio |
|
from typing import List, Dict |
|
|
|
_OT_URL = "https://api.platform.opentargets.org/api/v4/graphql" |
|
|
|
_QUERY_TEMPLATE = textwrap.dedent( |
|
""" |
|
query Assoc($gene: String!, $size: Int!) { |
|
associations(geneSymbol: $gene, size: $size) { |
|
rows { |
|
score |
|
datatypeId |
|
datasourceId |
|
disease { id name } |
|
target { id symbol } |
|
} |
|
} |
|
} |
|
""" |
|
) |
|
|
|
async def fetch_ot_associations(gene_symbol: str, *, size: int = 30) -> List[Dict]: |
|
payload = {"query": _QUERY_TEMPLATE, "variables": {"gene": gene_symbol, "size": size}} |
|
async with httpx.AsyncClient(timeout=15) as client: |
|
resp = await client.post(_OT_URL, json=payload) |
|
resp.raise_for_status() |
|
return resp.json()["data"]["associations"]["rows"] |