Initial commit
This commit is contained in:
403
skills/opentargets-database/scripts/query_opentargets.py
Normal file
403
skills/opentargets-database/scripts/query_opentargets.py
Normal file
@@ -0,0 +1,403 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Open Targets Platform GraphQL Query Helper
|
||||
|
||||
This script provides reusable functions for querying the Open Targets Platform
|
||||
GraphQL API. Use these functions to retrieve target, disease, drug, and
|
||||
association data.
|
||||
|
||||
Dependencies: requests (pip install requests)
|
||||
"""
|
||||
|
||||
import requests
|
||||
import json
|
||||
from typing import Dict, List, Optional, Any
|
||||
|
||||
|
||||
# API endpoint
|
||||
BASE_URL = "https://api.platform.opentargets.org/api/v4/graphql"
|
||||
|
||||
|
||||
def execute_query(query: str, variables: Optional[Dict[str, Any]] = None) -> Dict[str, Any]:
|
||||
"""
|
||||
Execute a GraphQL query against the Open Targets Platform API.
|
||||
|
||||
Args:
|
||||
query: GraphQL query string
|
||||
variables: Optional dictionary of variables for the query
|
||||
|
||||
Returns:
|
||||
Dictionary containing the API response data
|
||||
|
||||
Raises:
|
||||
Exception if the API request fails or returns errors
|
||||
"""
|
||||
payload = {"query": query}
|
||||
if variables:
|
||||
payload["variables"] = variables
|
||||
|
||||
try:
|
||||
response = requests.post(BASE_URL, json=payload, timeout=30)
|
||||
response.raise_for_status()
|
||||
data = response.json()
|
||||
|
||||
if "errors" in data:
|
||||
raise Exception(f"GraphQL errors: {data['errors']}")
|
||||
|
||||
return data.get("data", {})
|
||||
|
||||
except requests.exceptions.RequestException as e:
|
||||
raise Exception(f"API request failed: {str(e)}")
|
||||
|
||||
|
||||
def search_entities(query_string: str, entity_types: Optional[List[str]] = None) -> List[Dict[str, Any]]:
|
||||
"""
|
||||
Search for targets, diseases, or drugs by name or identifier.
|
||||
|
||||
Args:
|
||||
query_string: Search term (e.g., "BRCA1", "alzheimer", "aspirin")
|
||||
entity_types: Optional list to filter by entity type ["target", "disease", "drug"]
|
||||
|
||||
Returns:
|
||||
List of search results with id, name, entity type, and description
|
||||
"""
|
||||
query = """
|
||||
query search($queryString: String!, $entityNames: [String!]) {
|
||||
search(queryString: $queryString, entityNames: $entityNames, page: {size: 10}) {
|
||||
hits {
|
||||
id
|
||||
entity
|
||||
name
|
||||
description
|
||||
}
|
||||
}
|
||||
}
|
||||
"""
|
||||
|
||||
variables = {"queryString": query_string}
|
||||
if entity_types:
|
||||
variables["entityNames"] = entity_types
|
||||
|
||||
result = execute_query(query, variables)
|
||||
return result.get("search", {}).get("hits", [])
|
||||
|
||||
|
||||
def get_target_info(ensembl_id: str, include_diseases: bool = False) -> Dict[str, Any]:
|
||||
"""
|
||||
Retrieve comprehensive information about a target gene.
|
||||
|
||||
Args:
|
||||
ensembl_id: Ensembl gene ID (e.g., "ENSG00000157764")
|
||||
include_diseases: Whether to include top associated diseases
|
||||
|
||||
Returns:
|
||||
Dictionary with target information including tractability, safety, expression
|
||||
"""
|
||||
disease_fragment = """
|
||||
associatedDiseases(page: {size: 10}) {
|
||||
rows {
|
||||
disease {
|
||||
id
|
||||
name
|
||||
}
|
||||
score
|
||||
datatypeScores {
|
||||
componentId
|
||||
score
|
||||
}
|
||||
}
|
||||
}
|
||||
""" if include_diseases else ""
|
||||
|
||||
query = f"""
|
||||
query targetInfo($ensemblId: String!) {{
|
||||
target(ensemblId: $ensemblId) {{
|
||||
id
|
||||
approvedSymbol
|
||||
approvedName
|
||||
biotype
|
||||
functionDescriptions
|
||||
|
||||
tractability {{
|
||||
label
|
||||
modality
|
||||
value
|
||||
}}
|
||||
|
||||
safetyLiabilities {{
|
||||
event
|
||||
effects {{
|
||||
dosing
|
||||
organsAffected
|
||||
}}
|
||||
biosamples {{
|
||||
tissue {{
|
||||
label
|
||||
}}
|
||||
}}
|
||||
}}
|
||||
|
||||
geneticConstraint {{
|
||||
constraintType
|
||||
score
|
||||
exp
|
||||
obs
|
||||
}}
|
||||
|
||||
{disease_fragment}
|
||||
}}
|
||||
}}
|
||||
"""
|
||||
|
||||
result = execute_query(query, {"ensemblId": ensembl_id})
|
||||
return result.get("target", {})
|
||||
|
||||
|
||||
def get_disease_info(efo_id: str, include_targets: bool = False) -> Dict[str, Any]:
|
||||
"""
|
||||
Retrieve information about a disease.
|
||||
|
||||
Args:
|
||||
efo_id: EFO disease identifier (e.g., "EFO_0000249")
|
||||
include_targets: Whether to include top associated targets
|
||||
|
||||
Returns:
|
||||
Dictionary with disease information
|
||||
"""
|
||||
target_fragment = """
|
||||
associatedTargets(page: {size: 10}) {
|
||||
rows {
|
||||
target {
|
||||
id
|
||||
approvedSymbol
|
||||
approvedName
|
||||
}
|
||||
score
|
||||
datatypeScores {
|
||||
componentId
|
||||
score
|
||||
}
|
||||
}
|
||||
}
|
||||
""" if include_targets else ""
|
||||
|
||||
query = f"""
|
||||
query diseaseInfo($efoId: String!) {{
|
||||
disease(efoId: $efoId) {{
|
||||
id
|
||||
name
|
||||
description
|
||||
therapeuticAreas {{
|
||||
id
|
||||
name
|
||||
}}
|
||||
synonyms {{
|
||||
terms
|
||||
}}
|
||||
{target_fragment}
|
||||
}}
|
||||
}}
|
||||
"""
|
||||
|
||||
result = execute_query(query, {"efoId": efo_id})
|
||||
return result.get("disease", {})
|
||||
|
||||
|
||||
def get_target_disease_evidence(ensembl_id: str, efo_id: str,
|
||||
data_types: Optional[List[str]] = None) -> List[Dict[str, Any]]:
|
||||
"""
|
||||
Retrieve evidence linking a target to a disease.
|
||||
|
||||
Args:
|
||||
ensembl_id: Ensembl gene ID
|
||||
efo_id: EFO disease identifier
|
||||
data_types: Optional filter for evidence types (e.g., ["genetic_association", "known_drug"])
|
||||
|
||||
Returns:
|
||||
List of evidence records with scores and sources
|
||||
"""
|
||||
query = """
|
||||
query evidences($ensemblId: String!, $efoId: String!, $dataTypes: [String!]) {
|
||||
disease(efoId: $efoId) {
|
||||
evidences(ensemblIds: [$ensemblId], datatypes: $dataTypes, size: 100) {
|
||||
rows {
|
||||
datasourceId
|
||||
datatypeId
|
||||
score
|
||||
targetFromSourceId
|
||||
studyId
|
||||
literature
|
||||
cohortPhenotypes
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
"""
|
||||
|
||||
variables = {"ensemblId": ensembl_id, "efoId": efo_id}
|
||||
if data_types:
|
||||
variables["dataTypes"] = data_types
|
||||
|
||||
result = execute_query(query, variables)
|
||||
return result.get("disease", {}).get("evidences", {}).get("rows", [])
|
||||
|
||||
|
||||
def get_known_drugs_for_disease(efo_id: str) -> Dict[str, Any]:
|
||||
"""
|
||||
Get drugs known to be used for a disease.
|
||||
|
||||
Args:
|
||||
efo_id: EFO disease identifier
|
||||
|
||||
Returns:
|
||||
Dictionary with drug information including phase, targets, and status
|
||||
"""
|
||||
query = """
|
||||
query knownDrugs($efoId: String!) {
|
||||
disease(efoId: $efoId) {
|
||||
knownDrugs {
|
||||
uniqueDrugs
|
||||
uniqueTargets
|
||||
rows {
|
||||
drug {
|
||||
id
|
||||
name
|
||||
drugType
|
||||
maximumClinicalTrialPhase
|
||||
}
|
||||
targets {
|
||||
id
|
||||
approvedSymbol
|
||||
}
|
||||
phase
|
||||
status
|
||||
mechanismOfAction
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
"""
|
||||
|
||||
result = execute_query(query, {"efoId": efo_id})
|
||||
return result.get("disease", {}).get("knownDrugs", {})
|
||||
|
||||
|
||||
def get_drug_info(chembl_id: str) -> Dict[str, Any]:
|
||||
"""
|
||||
Retrieve information about a drug.
|
||||
|
||||
Args:
|
||||
chembl_id: ChEMBL identifier (e.g., "CHEMBL25")
|
||||
|
||||
Returns:
|
||||
Dictionary with drug information
|
||||
"""
|
||||
query = """
|
||||
query drugInfo($chemblId: String!) {
|
||||
drug(chemblId: $chemblId) {
|
||||
id
|
||||
name
|
||||
synonyms
|
||||
drugType
|
||||
maximumClinicalTrialPhase
|
||||
hasBeenWithdrawn
|
||||
withdrawnNotice {
|
||||
reasons
|
||||
countries
|
||||
}
|
||||
mechanismsOfAction {
|
||||
actionType
|
||||
mechanismOfAction
|
||||
targetName
|
||||
targets {
|
||||
id
|
||||
approvedSymbol
|
||||
}
|
||||
}
|
||||
indications {
|
||||
disease
|
||||
efoId
|
||||
maxPhaseForIndication
|
||||
}
|
||||
}
|
||||
}
|
||||
"""
|
||||
|
||||
result = execute_query(query, {"chemblId": chembl_id})
|
||||
return result.get("drug", {})
|
||||
|
||||
|
||||
def get_target_associations(ensembl_id: str, min_score: float = 0.0) -> List[Dict[str, Any]]:
|
||||
"""
|
||||
Get all disease associations for a target, filtered by minimum score.
|
||||
|
||||
Args:
|
||||
ensembl_id: Ensembl gene ID
|
||||
min_score: Minimum association score (0-1) to include
|
||||
|
||||
Returns:
|
||||
List of disease associations with scores
|
||||
"""
|
||||
query = """
|
||||
query targetAssociations($ensemblId: String!) {
|
||||
target(ensemblId: $ensemblId) {
|
||||
associatedDiseases(page: {size: 100}) {
|
||||
count
|
||||
rows {
|
||||
disease {
|
||||
id
|
||||
name
|
||||
}
|
||||
score
|
||||
datatypeScores {
|
||||
componentId
|
||||
score
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
"""
|
||||
|
||||
result = execute_query(query, {"ensemblId": ensembl_id})
|
||||
associations = result.get("target", {}).get("associatedDiseases", {}).get("rows", [])
|
||||
|
||||
# Filter by minimum score
|
||||
return [assoc for assoc in associations if assoc.get("score", 0) >= min_score]
|
||||
|
||||
|
||||
# Example usage
|
||||
if __name__ == "__main__":
|
||||
# Example 1: Search for a gene
|
||||
print("Searching for BRCA1...")
|
||||
results = search_entities("BRCA1", entity_types=["target"])
|
||||
for result in results[:3]:
|
||||
print(f" {result['name']} ({result['id']})")
|
||||
|
||||
# Example 2: Get target information
|
||||
if results:
|
||||
ensembl_id = results[0]['id']
|
||||
print(f"\nGetting info for {ensembl_id}...")
|
||||
target_info = get_target_info(ensembl_id, include_diseases=True)
|
||||
print(f" Symbol: {target_info.get('approvedSymbol')}")
|
||||
print(f" Name: {target_info.get('approvedName')}")
|
||||
|
||||
# Show top diseases
|
||||
diseases = target_info.get('associatedDiseases', {}).get('rows', [])
|
||||
if diseases:
|
||||
print(f"\n Top associated diseases:")
|
||||
for disease in diseases[:3]:
|
||||
print(f" - {disease['disease']['name']} (score: {disease['score']:.2f})")
|
||||
|
||||
# Example 3: Search for a disease
|
||||
print("\n\nSearching for Alzheimer's disease...")
|
||||
disease_results = search_entities("alzheimer", entity_types=["disease"])
|
||||
if disease_results:
|
||||
efo_id = disease_results[0]['id']
|
||||
print(f" Found: {disease_results[0]['name']} ({efo_id})")
|
||||
|
||||
# Get known drugs
|
||||
print(f"\n Known drugs for {disease_results[0]['name']}:")
|
||||
drugs = get_known_drugs_for_disease(efo_id)
|
||||
for drug in drugs.get('rows', [])[:5]:
|
||||
print(f" - {drug['drug']['name']} (Phase {drug['phase']})")
|
||||
Reference in New Issue
Block a user