From 0bd4e3f38efe518e202a975dc3f6d8b9119e401c Mon Sep 17 00:00:00 2001 From: Andrew Su Date: Thu, 27 May 2021 09:42:19 -0700 Subject: [PATCH 1/2] revise and update README --- README.md | 63 +++++++++++++++++++++++++------------------------------ 1 file changed, 28 insertions(+), 35 deletions(-) diff --git a/README.md b/README.md index 5d682ed3..84769bea 100644 --- a/README.md +++ b/README.md @@ -5,44 +5,29 @@ ## Introduction -This GitHub repo serves as the development repo for the TRAPI API implementation of BioThings Explorer. +This GitHub repo serves as the development repo for the TRAPI API implementation of **BioThings Explorer (BTE)**. BTE is an engine for autonomously querying a distributed knowledge graph. The distributed knowledge graph is made up of biomedical APIs that have been annotated with semantically-precise descriptions of their inputs and outputs in the [SmartAPI registry](https://smart-api.info/). This project is primarily funded by the [NCATS Translator project](https://ncats.nih.gov/translator). There is also an older [python version of BioThings Explorer](https://github.com/biothings/biothings_explorer) that is currently not being actively developed. -### What's BioThings Explorer +An older version of the meta knowledge graph that is consumed by BTE is in this figure (which, although older, gives a nice conceptual visualization of API interoperability): -BioThings Explorer aims at helping users querying and linking results from a variety of biomedical relevant APIs through one interface. The project is funded by the [NCATS Translator project](https://ncats.nih.gov/translator). +![BTE Meta-KG](diagrams/smartapi_metagraph.png "BioThings Explorer metagraph") -### What's TRAPI +### What's TRAPI? -TRAPI stands for [Translator Reasoner API](https://github.com/NCATSTranslator/ReasonerAPI). It is a standard defined for APIs developed within NCATS Biomedical Translator project to allow easy information exchange among them. +TRAPI stands for [Translator Reasoner API](https://github.com/NCATSTranslator/ReasonerAPI). It is a standard defined for APIs developed within NCATS Biomedical Translator project to facilitate information exchange between resources. BTE exports results via TRAPI to maintain interoperability with other Translator tools. BTE can also _consume_ knowledge resources that expose the TRAPI interface, but it also can consume APIs that have been annotated in the [SmartAPI registry](https://smart-api.info/) using the [x-bte extension](https://x-bte-extension.readthedocs.io/en/latest/index.html) to the OpenAPI specification. -### Our TRAPI Interface +### Live TRAPI Instance -Please visit our TRAPI API landing page [here](http://bte_trapi.smart-api.info/). +We maintain a live instance of this application at https://api.bte.ncats.io/ that can be used for testing. Query Examples can be found [here](/examples). -### Some Query Examples - -Query Examples can be found [here](https://github.com/kevinxin90/BioThings_Explorer_TRAPI/tree/master/examples). - ---- - - -## Current Development Status - -Currently, the BioThings Explorer TRAPI API implements TRAPI v1.0.0 standard, and can be queried at https://api.bte.ncats.io/v1/query endpoint. - - -The TRAPI v0.9.2 standard is deprecated. But it can still be tested using https://api.bte.ncats.io/query endpoint. - --- -## Requirements -For development, you will only need Node.js and a node global package, e.g. npm, installed in your environment. +## Local installations -### Node +### Requirements -NOTE: Node version must be higher than v12. +For development, you will only need Node.js and a node global package, e.g. npm, installed in your environment. Your Node version must be higher than v12. - #### Node installation on Windows @@ -75,14 +60,14 @@ If you need to update `npm`, you can make it using `npm`! Cool right? After runn --- -## Install +### Installation - $ git clone https://github.com/biothings/BioThings_Explorer_TRAPI` - $ cd BioThings_Explorer_TRAPI` - $ npm install` + $ git clone https://github.com/biothings/BioThings_Explorer_TRAPI + $ cd BioThings_Explorer_TRAPI + $ npm install -## Running the project +### Running the project $ npm start @@ -96,11 +81,11 @@ By default, the `/v1/query` endpoint only supports 3 queries per min, you could `$ MAX_QUERIES_PER_MIN=5 npm start` -## Simple build for production +### Simple build for production $ npm build -## Deploy +### Deploy A docker file is included in the base directory and can be used to build the customized container @@ -116,11 +101,14 @@ docker-compose up Public Docker image located at [link](https://hub.docker.com/repository/docker/biothings/bte_reasoner_api) -## Usage +### Usage + +You now can POST queries to `http://:3000/v1/query`. + +Query Examples can be found [here](/examples). -`http://:3000` -## Test with local SmartAPI spec +### Test with local SmartAPI spec The TRAPI interface has `/test/query` endpoint which uses a SmartAPI spec stored at **test** folder named **smartapi.json** @@ -138,3 +126,8 @@ Then, Run the image and mount your local smartapi spec folder Now, you should be able to test your local smartapi using POST queries at: `http://localhost:3000/test/query` + +### Testing on a specific SmartAPI API + +By default, BTE queries all APIs specified in the the[ config.js file](https://github.com/biothings/BioThings_Explorer_TRAPI/blob/master/src/routes/v1/config.js). In some cases, you may want to override that default to specifically query a single API. For example, the SmartAPI record for the "EBI Proteins API) is [43af91b3d7cae43591083bff9d75c6dd](https://smart-api.info/registry?q=43af91b3d7cae43591083bff9d75c6dd). To instruct BTE to query that API only, you can POST your query to http://localhost:3000/v1/smartapi/43af91b3d7cae43591083bff9d75c6dd/query + From d82a4f9f732fb0641a0a1726cdf4547a98d119c1 Mon Sep 17 00:00:00 2001 From: Andrew Su Date: Thu, 27 May 2021 09:43:39 -0700 Subject: [PATCH 2/2] upload metagraph image --- diagrams/smartapi_metagraph.png | Bin 0 -> 25893 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 diagrams/smartapi_metagraph.png diff --git a/diagrams/smartapi_metagraph.png b/diagrams/smartapi_metagraph.png new file mode 100644 index 0000000000000000000000000000000000000000..a3b03a7c326a53e06b868ff7334ab057a22e01a6 GIT binary patch literal 25893 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