Source code for TCT.trapi

"""
This is a wrapper around making calls to the Translator Reasoner API (TRAPI).

API Documentation: https://github.com/NCATSTranslator/ReasonerAPI

Additional API Documentation: https://github.com/NCATSTranslator/ReasonerAPI/blob/master/docs/reference.md
"""
import json

import requests

# TODO: incorporate object ids into the method.
[docs] def build_query(subject_ids:list[str], object_categories:list[str], predicates:list[str], return_json:bool=True, object_ids=None, subject_categories=None): """ This constructs a query json for use with TRAPI. Queries are of the form [subject_ids]-[predicates]-[object_categories]. The output for the query contains all the subject-predicate-object triples where the subject is in subject_ids, the object's category is in object_categories, and the predicate for the edge is in predicates. For a description of the existing biolink categories and predicates, see https://biolink.github.io/biolink-model/ Params ------ subject_ids A list of subject CURIE IDs - example: ["NCBIGene:3845"] object_categories A list of strings representing the object categories that we are interested in. Example: ["biolink:Gene"] predicates A list of predicates that we are interested in. Example: ["biolink:positively_correlated_with", "biolink:physically_interacts_with"]. return_json If true, returns a json string; if false, returns a dict. object_ids None by default subject_categories None by default Returns ------- A json string Examples -------- In this example, we want all genes that physically interact with gene 3845. >>> build_query(['NCBIGene:3845'], ['biolink:Gene'], ['biolink:physically_interacts_with']) "{'message': {'query_graph': { 'edges': {'e00': {'subject': 'n00', 'object': 'n01', 'predicates':['biolink:physically_interacts_with]}}, 'nodes': {'n00': {'ids': ['NCBIGene:3845']}, 'n01': {'categories': ['biolink':Gene']}}}}}" """ query_dict = { 'message': { 'query_graph': { 'edges': { 'e00': { 'subject': 'n00', 'object': 'n01', 'predicates': predicates } }, 'nodes': { 'n00': { 'ids': subject_ids }, 'n01': { 'categories': object_categories } }, } } } if return_json: return json.dumps(query_dict) else: return query_dict
[docs] def process_result(result:dict): """ Processes a TRAPI query result, returning a table of edges. Params ------ Returns ------- Examples -------- """
[docs] def query(url:str, query:str): """ Queries a single TRAPI endpoint. Params ------ url : str The URL for the API endpoint. query : str A JSON string representing the query, as produced by build_query Returns ------- A dict representing a result. Examples -------- >>> query = build_query(['NCBIGene:3845'], ['biolink:Gene'], ['biolink:physically_interacts_with']) >>> response = query(url, query) >>> print(response) """ # example: 1. get APIs, 2. get APIs that have the target object and subject types, and the target predicates. 3. build the query and run the query. response = requests.post(url, json=query) if response.status_code == 200: # TODO result = response.json().get("message", {}) kg = result.get("knowledge_graph", {}) edges = kg.get("edges", {}) if edges: return result elif "knowledge_graph" in result: return None else: raise requests.RequestException('Response from server had error, code ' + str(response.status_code) + ' ' + str(response))
[docs] def parallel_query(url_list:list[str]): """ """