{ "cells": [ { "cell_type": "markdown", "id": "pursuant-separate", "metadata": { "papermill": { "duration": 0.026869, "end_time": "2021-03-22T10:46:16.607493", "exception": false, "start_time": "2021-03-22T10:46:16.580624", "status": "completed" }, "tags": [] }, "source": [ "# Meta functionalities of the EpiGraphDB platform" ] }, { "cell_type": "markdown", "id": "written-decade", "metadata": { "papermill": { "duration": 0.025289, "end_time": "2021-03-22T10:46:16.659074", "exception": false, "start_time": "2021-03-22T10:46:16.633785", "status": "completed" }, "tags": [] }, "source": [ "In this notebook we show the following aspects of the EpiGraphDB platform, and how to use the API to get the information:\n", "\n", "1. Metadata: meta nodes and meta edges, and the overall schema.\n", "2. Search for a specific node under the meta node.\n", "3. Cypher: how to query the database directly using Neo4j Cypher\n", "\n", "For detailed documentation on the API endpoints please visit:\n", "\n", "- The Swagger interface: http://api.epigraphdb.org\n", "- The sections regarding API endpoints on the documentation site: http://docs.epigraphdb.org/api/api-endpoints/" ] }, { "cell_type": "code", "execution_count": 1, "id": "united-valve", "metadata": { "execution": { "iopub.execute_input": "2021-03-22T10:46:16.692381Z", "iopub.status.busy": "2021-03-22T10:46:16.692014Z", "iopub.status.idle": "2021-03-22T10:46:17.093963Z", "shell.execute_reply": "2021-03-22T10:46:17.094608Z" }, "papermill": { "duration": 0.421274, "end_time": "2021-03-22T10:46:17.094891", "exception": false, "start_time": "2021-03-22T10:46:16.673617", "status": "completed" }, "tags": [] }, "outputs": [], "source": [ "from pprint import pformat\n", "\n", "import networkx as nx\n", "import pandas as pd\n", "import requests" ] }, { "cell_type": "code", "execution_count": 2, "id": "narrative-smell", "metadata": { "execution": { "iopub.execute_input": "2021-03-22T10:46:17.128485Z", "iopub.status.busy": "2021-03-22T10:46:17.128115Z", "iopub.status.idle": "2021-03-22T10:46:17.130122Z", "shell.execute_reply": "2021-03-22T10:46:17.129777Z" }, "papermill": { "duration": 0.019947, "end_time": "2021-03-22T10:46:17.130200", "exception": false, "start_time": "2021-03-22T10:46:17.110253", "status": "completed" }, "tags": [ "parameters" ] }, "outputs": [], "source": [ "# default parameters\n", "API_URL = \"https://api.epigraphdb.org\"" ] }, { "cell_type": "code", "execution_count": 3, "id": "sporting-blind", "metadata": { "execution": { "iopub.execute_input": "2021-03-22T10:46:17.160280Z", "iopub.status.busy": "2021-03-22T10:46:17.159938Z", "iopub.status.idle": "2021-03-22T10:46:17.162153Z", "shell.execute_reply": "2021-03-22T10:46:17.161625Z" }, "papermill": { "duration": 0.018866, "end_time": "2021-03-22T10:46:17.162285", "exception": false, "start_time": "2021-03-22T10:46:17.143419", "status": "completed" }, "tags": [ "injected-parameters" ] }, "outputs": [], "source": [ "# Parameters\n", "API_URL = \"https://api.epigraphdb.org\"\n" ] }, { "cell_type": "code", "execution_count": 4, "id": "rocky-spider", "metadata": { "execution": { "iopub.execute_input": "2021-03-22T10:46:17.202936Z", "iopub.status.busy": "2021-03-22T10:46:17.202394Z", "iopub.status.idle": "2021-03-22T10:46:17.347014Z", "shell.execute_reply": "2021-03-22T10:46:17.347389Z" }, "papermill": { "duration": 0.161663, "end_time": "2021-03-22T10:46:17.347511", "exception": false, "start_time": "2021-03-22T10:46:17.185848", "status": "completed" }, "tags": [] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "https://api.epigraphdb.org\n" ] }, { "data": { "text/plain": [ "True" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "print(API_URL)\n", "requests.get(f\"{API_URL}/ping\").json()" ] }, { "cell_type": "markdown", "id": "verbal-missile", "metadata": { "papermill": { "duration": 0.018825, "end_time": "2021-03-22T10:46:17.385164", "exception": false, "start_time": "2021-03-22T10:46:17.366339", "status": "completed" }, "tags": [] }, "source": [ "## Metadata" ] }, { "cell_type": "markdown", "id": "subsequent-helping", "metadata": { "papermill": { "duration": 0.018396, "end_time": "2021-03-22T10:46:17.423403", "exception": false, "start_time": "2021-03-22T10:46:17.405007", "status": "completed" }, "tags": [] }, "source": [ "Here we query for the metadata information using the endpoint `GET /meta/schema`, which will be used for downstream processing." ] }, { "cell_type": "code", "execution_count": 5, "id": "royal-mason", "metadata": { "execution": { "iopub.execute_input": "2021-03-22T10:46:17.459168Z", "iopub.status.busy": "2021-03-22T10:46:17.458820Z", "iopub.status.idle": "2021-03-22T10:46:17.623210Z", "shell.execute_reply": "2021-03-22T10:46:17.623835Z" }, "papermill": { "duration": 0.187001, "end_time": "2021-03-22T10:46:17.624010", "exception": false, "start_time": "2021-03-22T10:46:17.437009", "status": "completed" }, "tags": [] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "dict_keys(['nodes', 'edges', 'connections']) \n", "\n", "# nodes:\n", "{'Disease': {'count': 38960,\n", " 'properties': {'_id': {'indexed': True,\n", " 'type': 'STRING',\n", " 'unique': False},\n", " '_name': {'indexed': True,\n", " 'type': 'STRING',\n", " 'unique': False},\n", " '_source': {'indexed': False,\n", " 'type': 'LIST',\n", " 'unique': False},\n", " 'definition': {'indexed': False,\n", " 'type': 'STRING',\n", " 'unique': False},\n", " 'doid': {'indexed': True,\n", " 'type': 'LIST',\n", " 'unique': False},\n", " 'efo': {'indexed': False,\n", " 'type': 'LIST',\n", " \n", "\n", "# edges:\n", "{'BIORXIV_OBJ': {'count': 32651,\n", " 'properties': {'_source': {'array': True, 'type': 'LIST'}}},\n", " 'BIORXIV_PREDICATE': {'count': 32648,\n", " 'properties': {'_source': {'array': True,\n", " 'type': 'LIST'},\n", " 'count': {'array': False,\n", " 'type': 'INTEGER'},\n", " 'predicate': {'array': False,\n", " 'type': 'STRING'}}},\n", " 'BIORXIV_SUB': {'count': 32657,\n", " 'properties': {'_source': {'array': True, 'type': 'LIST'}}},\n", " 'BIORXIV_TO_LIT': {'count': 35211,\n", " 'properties': {'_source': {'array': True, 'type': 'LIST'}}},\n", " 'CPIC': {'count': 375,\n", " 'properties': {'_source': {'array': True, 'type': 'LIST'},\n", " 'cpic_level': {'array': False, 'type': 'STRING'},\n", " 'guideline': {'array': F \n", "\n", "# connections:\n", "[{'count': 2461,\n", " 'from_node': 'Drug',\n", " 'rel': 'OPENTARGETS_DRUG_TO_DISEASE',\n", " 'to_node': 'Disease'},\n", " {'count': 5763,\n", " 'from_node': 'Gene',\n", " 'rel': 'GENE_TO_DISEASE',\n", " 'to_node': 'Disease'},\n", " {'count': 8247,\n", " 'from_node': 'Disease',\n", " 'rel': 'MONDO_MAP_UMLS',\n", " 'to_node': 'LiteratureTerm'},\n", " {'count': 2819,\n", " 'from_node': 'Disease',\n", " 'rel': 'MONDO_MAP_EFO',\n", " 'to_node': 'Efo'},\n", " {'count': 2463,\n", " 'from_node': 'Pathway',\n", " 'rel': 'PATHWAY_CHILD_OF',\n", " 'to_node': 'Pathway'},\n", " {'count': 121873,\n", " 'from_node': 'Protein',\n", " 'rel': 'PROTEIN_IN_PATHWAY',\n", " 'to_node': 'Pathway'},\n", " {'count': 1969,\n", " 'from_node': 'LiteratureTerm',\n", " 'rel': 'MEDRXIV_PREDICATE',\n", " 'to_node': 'LiteratureTerm'},\n", " {'count': 16435,\n", " 'from_node': 'LiteratureTerm',\n", " 'rel': 'TERM_TO_GENE',\n", " 'to_node': 'Gene'},\n", " {'count': 32651,\n", " 'from_node': 'LiteratureTriple',\n", " 'rel': 'BIORXIV_OBJ',\n", " 'to_node': 'LiteratureTerm'},\n", " {'count': 32657,\n", " 'from_node': 'LiteratureTriple',\n", " 'rel': 'BIORXIV_SUB',\n", " 'to_node': 'Li \n", "\n" ] } ], "source": [ "endpoint = \"/meta/schema\"\n", "params = {\"graphviz\": False, \"plot\": False}\n", "r = requests.get(f\"{API_URL}{endpoint}\", params=params)\n", "r.raise_for_status()\n", "metadata = r.json()\n", "\n", "# Preview of metadata information\n", "keys = metadata.keys()\n", "print(pformat(keys), \"\\n\")\n", "for key in list(keys):\n", " print(f\"# {key}:\")\n", " print(pformat(metadata[key])[:1000], \"\\n\")" ] }, { "cell_type": "markdown", "id": "floral-extension", "metadata": { "papermill": { "duration": 0.026417, "end_time": "2021-03-22T10:46:17.676760", "exception": false, "start_time": "2021-03-22T10:46:17.650343", "status": "completed" }, "tags": [] }, "source": [ "### Meta nodes\n", "\n", "We can extract the specific meta node information as a pandas dataframe from the metadata." ] }, { "cell_type": "code", "execution_count": 6, "id": "filled-blood", "metadata": { "execution": { "iopub.execute_input": "2021-03-22T10:46:17.759212Z", "iopub.status.busy": "2021-03-22T10:46:17.744039Z", "iopub.status.idle": "2021-03-22T10:46:17.795459Z", "shell.execute_reply": "2021-03-22T10:46:17.794912Z" }, "papermill": { "duration": 0.093095, "end_time": "2021-03-22T10:46:17.795612", "exception": false, "start_time": "2021-03-22T10:46:17.702517", "status": "completed" }, "tags": [] }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
countproperties
Disease38,960{'_name': {'type': 'STRING', 'indexed': True, ...
Drug2,697{'molecule_type': {'type': 'STRING', 'indexed'...
Efo25,390{'_name': {'type': 'STRING', 'indexed': True, ...
Gene57,737{'druggability_tier': {'type': 'STRING', 'inde...
Gwas34,494{'note': {'type': 'STRING', 'indexed': False, ...
Literature3,995,672{'issn': {'type': 'STRING', 'indexed': False, ...
LiteratureTerm108,905{'_name': {'type': 'STRING', 'indexed': True, ...
LiteratureTriple5,609,945{'subject_id': {'type': 'STRING', 'indexed': T...
Pathway2,441{'_name': {'type': 'STRING', 'indexed': True, ...
Protein20,280{'name': {'type': 'STRING', 'indexed': True, '...
Tissue54{'name': {'type': 'STRING', 'indexed': True, '...
Variant99,005{'ref': {'type': 'STRING', 'indexed': False, '...
\n", "
" ], "text/plain": [ " count properties\n", "Disease 38,960 {'_name': {'type': 'STRING', 'indexed': True, ...\n", "Drug 2,697 {'molecule_type': {'type': 'STRING', 'indexed'...\n", "Efo 25,390 {'_name': {'type': 'STRING', 'indexed': True, ...\n", "Gene 57,737 {'druggability_tier': {'type': 'STRING', 'inde...\n", "Gwas 34,494 {'note': {'type': 'STRING', 'indexed': False, ...\n", "Literature 3,995,672 {'issn': {'type': 'STRING', 'indexed': False, ...\n", "LiteratureTerm 108,905 {'_name': {'type': 'STRING', 'indexed': True, ...\n", "LiteratureTriple 5,609,945 {'subject_id': {'type': 'STRING', 'indexed': T...\n", "Pathway 2,441 {'_name': {'type': 'STRING', 'indexed': True, ...\n", "Protein 20,280 {'name': {'type': 'STRING', 'indexed': True, '...\n", "Tissue 54 {'name': {'type': 'STRING', 'indexed': True, '...\n", "Variant 99,005 {'ref': {'type': 'STRING', 'indexed': False, '..." ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "meta_node_df = pd.DataFrame.from_dict(metadata[\"nodes\"], orient=\"index\")\n", "\n", "(\n", " meta_node_df.sort_index().assign(\n", " count=lambda df: df[\"count\"].apply(lambda x: f\"{x:,}\")\n", " )\n", ")" ] }, { "cell_type": "markdown", "id": "casual-demonstration", "metadata": { "papermill": { "duration": 0.029886, "end_time": "2021-03-22T10:46:17.853291", "exception": false, "start_time": "2021-03-22T10:46:17.823405", "status": "completed" }, "tags": [] }, "source": [ "### Meta relationships and connections\n", "\n", "We can also extract the meta relationship (edge) information, and the connections." ] }, { "cell_type": "code", "execution_count": 7, "id": "separate-reflection", "metadata": { "execution": { "iopub.execute_input": "2021-03-22T10:46:17.902561Z", "iopub.status.busy": "2021-03-22T10:46:17.901677Z", "iopub.status.idle": "2021-03-22T10:46:17.968732Z", "shell.execute_reply": "2021-03-22T10:46:17.969440Z" }, "papermill": { "duration": 0.096284, "end_time": "2021-03-22T10:46:17.969693", "exception": false, "start_time": "2021-03-22T10:46:17.873409", "status": "completed" }, "tags": [] }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
countpropertiesfrom_nodeto_node
MONDO_MAP_EFO2,819{'_source': {'array': False, 'type': 'STRING'}}DiseaseEfo
MONDO_MAP_UMLS8,247{'_source': {'array': False, 'type': 'STRING'}}DiseaseLiteratureTerm
OPENTARGETS_DRUG_TO_DISEASE2,461{'_source': {'array': True, 'type': 'LIST'}}DrugDisease
CPIC375{'pharmgkb_level_of_evidence': {'array': False...DrugGene
OPENTARGETS_DRUG_TO_TARGET6,534{'phase': {'array': False, 'type': 'STRING'}, ...DrugGene
EFO_CHILD_OF43,132{'_source': {'array': True, 'type': 'LIST'}}EfoEfo
GENE_TO_DISEASE5,763{'last_updated': {'array': False, 'type': 'STR...GeneDisease
XQTL_MULTI_SNP_MR3,015,233{'p': {'array': False, 'type': 'FLOAT'}, 'se':...GeneGwas
XQTL_SINGLE_SNP_MR_GENE_GWAS8,449,779{'p': {'array': False, 'type': 'FLOAT'}, 'se':...GeneGwas
GENE_TO_PROTEIN19,142{'_source': {'array': True, 'type': 'LIST'}}GeneProtein
EXPRESSED_IN2,918,240{'tpm': {'array': False, 'type': 'FLOAT'}, '_s...GeneTissue
GWAS_NLP_EFO12,302{'score': {'array': False, 'type': 'FLOAT'}, '...GwasEfo
GWAS_EFO_EBI281{'_source': {'array': True, 'type': 'LIST'}}GwasEfo
PRS118,124{'p': {'array': False, 'type': 'FLOAT'}, 'r2':...GwasGwas
MR_EVE_MR25,804,945{'b': {'array': False, 'type': 'FLOAT'}, 'se':...GwasGwas
GEN_COR840,960{'h2_intercept_SE': {'array': False, 'type': '...GwasGwas
OBS_COR17,932{'_source': {'array': True, 'type': 'LIST'}, '...GwasGwas
GWAS_NLP89,239,773{'score': {'array': False, 'type': 'FLOAT'}, '...GwasGwas
GWAS_TO_LITERATURE28,111,669{'_source': {'array': True, 'type': 'LIST'}}GwasLiterature
METAMAP_LITE5,556{'_source': {'array': True, 'type': 'LIST'}, '...GwasLiteratureTerm
GWAS_TO_LITERATURE_TRIPLE17,531,153{'pval': {'array': False, 'type': 'FLOAT'}, 'g...GwasLiteratureTriple
OPENGWAS_TOPHITS160,283{'_source': {'array': True, 'type': 'LIST'}, '...GwasVariant
GWAS_TO_VARIANT26,436{'se': {'array': False, 'type': 'FLOAT'}, 'nca...GwasVariant
TERM_TO_GENE16,435{'_source': {'array': False, 'type': 'STRING'}}LiteratureTermGene
SEMMEDDB_PREDICATE5,584,547{'count': {'array': False, 'type': 'INTEGER'},...LiteratureTermLiteratureTerm
BIORXIV_PREDICATE32,648{'count': {'array': False, 'type': 'INTEGER'},...LiteratureTermLiteratureTerm
MEDRXIV_PREDICATE1,969{'count': {'array': False, 'type': 'INTEGER'},...LiteratureTermLiteratureTerm
BIORXIV_TO_LIT35,211{'_source': {'array': True, 'type': 'LIST'}}LiteratureTripleLiterature
SEMMEDDB_TO_LIT10,589,785{'_source': {'array': True, 'type': 'LIST'}}LiteratureTripleLiterature
SEMMEDDB_SUB5,584,547{'_source': {'array': True, 'type': 'LIST'}}LiteratureTripleLiteratureTerm
BIORXIV_OBJ32,651{'_source': {'array': True, 'type': 'LIST'}}LiteratureTripleLiteratureTerm
BIORXIV_SUB32,657{'_source': {'array': True, 'type': 'LIST'}}LiteratureTripleLiteratureTerm
SEMMEDDB_OBJ5,584,547{'_source': {'array': True, 'type': 'LIST'}}LiteratureTripleLiteratureTerm
PATHWAY_CHILD_OF2,463{'_source': {'array': True, 'type': 'LIST'}}PathwayPathway
PROTEIN_IN_PATHWAY121,873{'_source': {'array': True, 'type': 'LIST'}}ProteinPathway
STRING_INTERACT_WITH827,184{'score': {'array': False, 'type': 'FLOAT'}, '...ProteinProtein
VARIANT_TO_GENE108,561{'amino_acids': {'array': False, 'type': 'STRI...VariantGene
XQTL_SINGLE_SNP_MR_SNP_GENE41,564{'_source': {'array': True, 'type': 'LIST'}}VariantGene
\n", "
" ], "text/plain": [ " count \\\n", "MONDO_MAP_EFO 2,819 \n", "MONDO_MAP_UMLS 8,247 \n", "OPENTARGETS_DRUG_TO_DISEASE 2,461 \n", "CPIC 375 \n", "OPENTARGETS_DRUG_TO_TARGET 6,534 \n", "EFO_CHILD_OF 43,132 \n", "GENE_TO_DISEASE 5,763 \n", "XQTL_MULTI_SNP_MR 3,015,233 \n", "XQTL_SINGLE_SNP_MR_GENE_GWAS 8,449,779 \n", "GENE_TO_PROTEIN 19,142 \n", "EXPRESSED_IN 2,918,240 \n", "GWAS_NLP_EFO 12,302 \n", "GWAS_EFO_EBI 281 \n", "PRS 118,124 \n", "MR_EVE_MR 25,804,945 \n", "GEN_COR 840,960 \n", "OBS_COR 17,932 \n", "GWAS_NLP 89,239,773 \n", "GWAS_TO_LITERATURE 28,111,669 \n", "METAMAP_LITE 5,556 \n", "GWAS_TO_LITERATURE_TRIPLE 17,531,153 \n", "OPENGWAS_TOPHITS 160,283 \n", "GWAS_TO_VARIANT 26,436 \n", "TERM_TO_GENE 16,435 \n", "SEMMEDDB_PREDICATE 5,584,547 \n", "BIORXIV_PREDICATE 32,648 \n", "MEDRXIV_PREDICATE 1,969 \n", "BIORXIV_TO_LIT 35,211 \n", "SEMMEDDB_TO_LIT 10,589,785 \n", "SEMMEDDB_SUB 5,584,547 \n", "BIORXIV_OBJ 32,651 \n", "BIORXIV_SUB 32,657 \n", "SEMMEDDB_OBJ 5,584,547 \n", "PATHWAY_CHILD_OF 2,463 \n", "PROTEIN_IN_PATHWAY 121,873 \n", "STRING_INTERACT_WITH 827,184 \n", "VARIANT_TO_GENE 108,561 \n", "XQTL_SINGLE_SNP_MR_SNP_GENE 41,564 \n", "\n", " properties \\\n", "MONDO_MAP_EFO {'_source': {'array': False, 'type': 'STRING'}} \n", "MONDO_MAP_UMLS {'_source': {'array': False, 'type': 'STRING'}} \n", "OPENTARGETS_DRUG_TO_DISEASE {'_source': {'array': True, 'type': 'LIST'}} \n", "CPIC {'pharmgkb_level_of_evidence': {'array': False... \n", "OPENTARGETS_DRUG_TO_TARGET {'phase': {'array': False, 'type': 'STRING'}, ... \n", "EFO_CHILD_OF {'_source': {'array': True, 'type': 'LIST'}} \n", "GENE_TO_DISEASE {'last_updated': {'array': False, 'type': 'STR... \n", "XQTL_MULTI_SNP_MR {'p': {'array': False, 'type': 'FLOAT'}, 'se':... \n", "XQTL_SINGLE_SNP_MR_GENE_GWAS {'p': {'array': False, 'type': 'FLOAT'}, 'se':... \n", "GENE_TO_PROTEIN {'_source': {'array': True, 'type': 'LIST'}} \n", "EXPRESSED_IN {'tpm': {'array': False, 'type': 'FLOAT'}, '_s... \n", "GWAS_NLP_EFO {'score': {'array': False, 'type': 'FLOAT'}, '... \n", "GWAS_EFO_EBI {'_source': {'array': True, 'type': 'LIST'}} \n", "PRS {'p': {'array': False, 'type': 'FLOAT'}, 'r2':... \n", "MR_EVE_MR {'b': {'array': False, 'type': 'FLOAT'}, 'se':... \n", "GEN_COR {'h2_intercept_SE': {'array': False, 'type': '... \n", "OBS_COR {'_source': {'array': True, 'type': 'LIST'}, '... \n", "GWAS_NLP {'score': {'array': False, 'type': 'FLOAT'}, '... \n", "GWAS_TO_LITERATURE {'_source': {'array': True, 'type': 'LIST'}} \n", "METAMAP_LITE {'_source': {'array': True, 'type': 'LIST'}, '... \n", "GWAS_TO_LITERATURE_TRIPLE {'pval': {'array': False, 'type': 'FLOAT'}, 'g... \n", "OPENGWAS_TOPHITS {'_source': {'array': True, 'type': 'LIST'}, '... \n", "GWAS_TO_VARIANT {'se': {'array': False, 'type': 'FLOAT'}, 'nca... \n", "TERM_TO_GENE {'_source': {'array': False, 'type': 'STRING'}} \n", "SEMMEDDB_PREDICATE {'count': {'array': False, 'type': 'INTEGER'},... \n", "BIORXIV_PREDICATE {'count': {'array': False, 'type': 'INTEGER'},... \n", "MEDRXIV_PREDICATE {'count': {'array': False, 'type': 'INTEGER'},... \n", "BIORXIV_TO_LIT {'_source': {'array': True, 'type': 'LIST'}} \n", "SEMMEDDB_TO_LIT {'_source': {'array': True, 'type': 'LIST'}} \n", "SEMMEDDB_SUB {'_source': {'array': True, 'type': 'LIST'}} \n", "BIORXIV_OBJ {'_source': {'array': True, 'type': 'LIST'}} \n", "BIORXIV_SUB {'_source': {'array': True, 'type': 'LIST'}} \n", "SEMMEDDB_OBJ {'_source': {'array': True, 'type': 'LIST'}} \n", "PATHWAY_CHILD_OF {'_source': {'array': True, 'type': 'LIST'}} \n", "PROTEIN_IN_PATHWAY {'_source': {'array': True, 'type': 'LIST'}} \n", "STRING_INTERACT_WITH {'score': {'array': False, 'type': 'FLOAT'}, '... \n", "VARIANT_TO_GENE {'amino_acids': {'array': False, 'type': 'STRI... \n", "XQTL_SINGLE_SNP_MR_SNP_GENE {'_source': {'array': True, 'type': 'LIST'}} \n", "\n", " from_node to_node \n", "MONDO_MAP_EFO Disease Efo \n", "MONDO_MAP_UMLS Disease LiteratureTerm \n", "OPENTARGETS_DRUG_TO_DISEASE Drug Disease \n", "CPIC Drug Gene \n", "OPENTARGETS_DRUG_TO_TARGET Drug Gene \n", "EFO_CHILD_OF Efo Efo \n", "GENE_TO_DISEASE Gene Disease \n", "XQTL_MULTI_SNP_MR Gene Gwas \n", "XQTL_SINGLE_SNP_MR_GENE_GWAS Gene Gwas \n", "GENE_TO_PROTEIN Gene Protein \n", "EXPRESSED_IN Gene Tissue \n", "GWAS_NLP_EFO Gwas Efo \n", "GWAS_EFO_EBI Gwas Efo \n", "PRS Gwas Gwas \n", "MR_EVE_MR Gwas Gwas \n", "GEN_COR Gwas Gwas \n", "OBS_COR Gwas Gwas \n", "GWAS_NLP Gwas Gwas \n", "GWAS_TO_LITERATURE Gwas Literature \n", "METAMAP_LITE Gwas LiteratureTerm \n", "GWAS_TO_LITERATURE_TRIPLE Gwas LiteratureTriple \n", "OPENGWAS_TOPHITS Gwas Variant \n", "GWAS_TO_VARIANT Gwas Variant \n", "TERM_TO_GENE LiteratureTerm Gene \n", "SEMMEDDB_PREDICATE LiteratureTerm LiteratureTerm \n", "BIORXIV_PREDICATE LiteratureTerm LiteratureTerm \n", "MEDRXIV_PREDICATE LiteratureTerm LiteratureTerm \n", "BIORXIV_TO_LIT LiteratureTriple Literature \n", "SEMMEDDB_TO_LIT LiteratureTriple Literature \n", "SEMMEDDB_SUB LiteratureTriple LiteratureTerm \n", "BIORXIV_OBJ LiteratureTriple LiteratureTerm \n", "BIORXIV_SUB LiteratureTriple LiteratureTerm \n", "SEMMEDDB_OBJ LiteratureTriple LiteratureTerm \n", "PATHWAY_CHILD_OF Pathway Pathway \n", "PROTEIN_IN_PATHWAY Protein Pathway \n", "STRING_INTERACT_WITH Protein Protein \n", "VARIANT_TO_GENE Variant Gene \n", "XQTL_SINGLE_SNP_MR_SNP_GENE Variant Gene " ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "meta_rel_df = pd.DataFrame.from_dict(metadata[\"edges\"], orient=\"index\").merge(\n", " pd.DataFrame.from_dict(\n", " {_[\"rel\"]: _ for _ in metadata[\"connections\"]}, orient=\"index\"\n", " )[[\"from_node\", \"to_node\"]],\n", " left_index=True,\n", " right_index=True,\n", ")\n", "\n", "(\n", " meta_rel_df.sort_values(by=[\"from_node\", \"to_node\"]).assign(\n", " count=lambda df: df[\"count\"].apply(lambda x: f\"{x:,}\")\n", " )\n", ")" ] }, { "cell_type": "markdown", "id": "informational-indie", "metadata": { "papermill": { "duration": 0.028925, "end_time": "2021-03-22T10:46:18.030025", "exception": false, "start_time": "2021-03-22T10:46:18.001100", "status": "completed" }, "tags": [] }, "source": [ "### Schema plot" ] }, { "cell_type": "markdown", "id": "electric-monitor", "metadata": { "papermill": { "duration": 0.014955, "end_time": "2021-03-22T10:46:18.064021", "exception": false, "start_time": "2021-03-22T10:46:18.049066", "status": "completed" }, "tags": [] }, "source": [ "We can generate a network diagram of the graph db schema using `networkx`." ] }, { "cell_type": "code", "execution_count": 8, "id": "grateful-rapid", "metadata": { "execution": { "iopub.execute_input": "2021-03-22T10:46:18.098560Z", "iopub.status.busy": "2021-03-22T10:46:18.098217Z", "iopub.status.idle": "2021-03-22T10:46:18.100621Z", "shell.execute_reply": "2021-03-22T10:46:18.100281Z" }, "papermill": { "duration": 0.020885, "end_time": "2021-03-22T10:46:18.100694", "exception": false, "start_time": "2021-03-22T10:46:18.079809", "status": "completed" }, "tags": [] }, "outputs": [], "source": [ "graph = nx.from_pandas_edgelist(meta_rel_df, source=\"from_node\", target=\"to_node\")" ] }, { "cell_type": "code", "execution_count": 9, "id": "corresponding-recorder", "metadata": { "execution": { "iopub.execute_input": "2021-03-22T10:46:18.135351Z", "iopub.status.busy": "2021-03-22T10:46:18.134965Z", "iopub.status.idle": "2021-03-22T10:46:18.551217Z", "shell.execute_reply": "2021-03-22T10:46:18.551675Z" }, "papermill": { "duration": 0.436452, "end_time": "2021-03-22T10:46:18.551837", "exception": false, "start_time": "2021-03-22T10:46:18.115385", "status": "completed" }, "tags": [] }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "nx.draw(\n", " G=graph,\n", " pos=nx.kamada_kawai_layout(graph),\n", " with_labels=True,\n", " node_color=\"white\",\n", ")" ] }, { "cell_type": "markdown", "id": "standard-invitation", "metadata": { "papermill": { "duration": 0.016735, "end_time": "2021-03-22T10:46:18.591504", "exception": false, "start_time": "2021-03-22T10:46:18.574769", "status": "completed" }, "tags": [] }, "source": [ "A detailed version of the shema plot can be obtained from the API:\n", "\n", "![schema_plot](https://api.epigraphdb.org/meta/schema?graphviz=true&plot=true)" ] }, { "cell_type": "markdown", "id": "fiscal-polyester", "metadata": { "papermill": { "duration": 0.016705, "end_time": "2021-03-22T10:46:18.623618", "exception": false, "start_time": "2021-03-22T10:46:18.606913", "status": "completed" }, "tags": [] }, "source": [ "## Search for specific node" ] }, { "cell_type": "markdown", "id": "annual-exhibit", "metadata": { "papermill": { "duration": 0.016179, "end_time": "2021-03-22T10:46:18.655534", "exception": false, "start_time": "2021-03-22T10:46:18.639355", "status": "completed" }, "tags": [] }, "source": [ "Users can use [the explorer on the Web UI](http://dev.epigraphdb.org/explore) to search for a specific node by:\n", "\n", "- fuzzy matching by \"name\" field.\n", "- exact matching by \"ID\" field if you know the its ID (e.g. the ID to a GWAS from IEU GWAS Database).\n", "\n", "Here we show how these are done at the API level using `Gwas` nodes as an example." ] }, { "cell_type": "markdown", "id": "floating-acquisition", "metadata": { "papermill": { "duration": 0.016488, "end_time": "2021-03-22T10:46:18.688480", "exception": false, "start_time": "2021-03-22T10:46:18.671992", "status": "completed" }, "tags": [] }, "source": [ "First we need to know what the \"ID\" and \"name\" fields are for the meta nodes using `GET /meta/nodes/id-name-schema`:" ] }, { "cell_type": "code", "execution_count": 10, "id": "thirty-syntax", "metadata": { "execution": { "iopub.execute_input": "2021-03-22T10:46:18.726381Z", "iopub.status.busy": "2021-03-22T10:46:18.726030Z", "iopub.status.idle": "2021-03-22T10:46:18.863583Z", "shell.execute_reply": "2021-03-22T10:46:18.864101Z" }, "papermill": { "duration": 0.159271, "end_time": "2021-03-22T10:46:18.864224", "exception": false, "start_time": "2021-03-22T10:46:18.704953", "status": "completed" }, "tags": [] }, "outputs": [ { "data": { "text/plain": [ "{'Disease': {'id': 'id', 'name': 'label'},\n", " 'Drug': {'id': 'label', 'name': 'label'},\n", " 'Efo': {'id': 'id', 'name': 'value'},\n", " 'Gene': {'id': 'ensembl_id', 'name': 'name'},\n", " 'Gwas': {'id': 'id', 'name': 'trait'},\n", " 'Literature': {'id': 'id', 'name': 'id'},\n", " 'LiteratureTerm': {'id': 'id', 'name': 'name'},\n", " 'LiteratureTriple': {'id': 'id', 'name': 'name'},\n", " 'Pathway': {'id': 'id', 'name': 'name'},\n", " 'Protein': {'id': 'uniprot_id', 'name': 'uniprot_id'},\n", " 'Tissue': {'id': 'id', 'name': 'name'},\n", " 'Variant': {'id': 'name', 'name': 'name'}}" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "r = requests.get(f\"{API_URL}/meta/nodes/id-name-schema\")\n", "r.raise_for_status()\n", "\n", "meta_node_fields = r.json()\n", "meta_node_fields" ] }, { "cell_type": "markdown", "id": "increasing-yield", "metadata": { "papermill": { "duration": 0.021819, "end_time": "2021-03-22T10:46:18.906403", "exception": false, "start_time": "2021-03-22T10:46:18.884584", "status": "completed" }, "tags": [] }, "source": [ "### Fuzzy matching" ] }, { "cell_type": "markdown", "id": "statutory-feedback", "metadata": { "papermill": { "duration": 0.017427, "end_time": "2021-03-22T10:46:18.946237", "exception": false, "start_time": "2021-03-22T10:46:18.928810", "status": "completed" }, "tags": [] }, "source": [ "Here we search for nodes can contain \"body mass index\" in their traits." ] }, { "cell_type": "code", "execution_count": 11, "id": "tested-bottle", "metadata": { "execution": { "iopub.execute_input": "2021-03-22T10:46:18.984611Z", "iopub.status.busy": "2021-03-22T10:46:18.981919Z", "iopub.status.idle": "2021-03-22T10:46:19.143190Z", "shell.execute_reply": "2021-03-22T10:46:19.142620Z" }, "papermill": { "duration": 0.180714, "end_time": "2021-03-22T10:46:19.143294", "exception": false, "start_time": "2021-03-22T10:46:18.962580", "status": "completed" }, "tags": [] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{'metadata': {'empty_results': False,\n", " 'query': 'MATCH (node: Gwas) WHERE node.trait =~ \"(?i).*body '\n", " 'mass index.*\" RETURN node LIMIT 10;',\n", " 'total_seconds': 0.021328},\n", " 'results': [{'node': {'_id': 'ieu-a-1089',\n", " '_name': 'Body mass index',\n", " '_source': ['OpenGWAS-2020-10-13'],\n", " 'author': 'Wood',\n", " 'build': 'HG19/GRCh37',\n", " 'category': 'Risk factor',\n", " 'id': 'ieu-a-1089',\n", " 'mr': '0',\n", " 'note': 'Dominance model? If so then not necessarily of '\n", " 'value for MR; Results from interim Biobank '\n", " 'release enriched for smokers; could lead to '\n", " 'bias through collider issues in MR',\n", " 'nsnp': '8654252',\n", " 'pmid': '26961502.0',\n", " 'population': 'European',\n", " 'sample_size': '120286.0',\n", " 'sex': 'Males and Females',\n", " 'subcategory': 'Anthropometric',\n", " 'trait': 'Body mass index',\n", " 'year': '2016.0'}},\n", " {'node': {'_id': 'ieu-a-974',\n", " '_name': 'Body mass index',\n", " '_source': ['OpenGWAS-2020-10-13'],\n", " 'author': 'Locke AE',\n", " 'build': 'HG19/GRCh37',\n", " 'category': 'Risk factor',\n", " 'id': 'ieu-a-974',\n", " 'mr': '1',\n", " 'nsnp': '2494613',\n", " 'pmid': '25673413.0',\n", " 'population': 'European',\n", " 'sample_size': '171977.0',\n", " 'sd': '4.77',\n", " 'sex': 'Females',\n", " 'subcategory': 'Anthropometric',\n", " 'trait': 'Body mass index',\n", " 'year': '2015.0'}},\n", " {'node': {'_id': 'ieu-a-95',\n", " '_name': 'Body mass index',\n", " '_source': ['OpenGWAS-2020-10-13'],\n", " 'author': 'Randall JC',\n", " 'build': 'HG19/GRCh37',\n", " 'category': 'Risk factor',\n", " 'id': 'ieu-a-95',\n", " 'mr': '1',\n", " 'nsnp': '2736876',\n", " 'pmid': '23754948.0',\n", " 'population': 'European',\n", " 'sample_size': '73137.0',\n", " 'sd': '4.77',\n", " 'sex': 'Females',\n", " 'subcategory': 'Anthropometric',\n", " 'trait': 'Body mass index',\n", " 'year': '2013.0'}},\n", " {'node': {'_id': 'ebi-a-GCST004904',\n", " '_name': 'Body mass index',\n", " '_source': ['OpenGWAS-2020-\n" ] } ], "source": [ "name = \"body mass index\"\n", "\n", "r = requests.get(f\"{API_URL}/meta/nodes/Gwas/search\", params={\"name\": name})\n", "r.raise_for_status()\n", "\n", "print(pformat(r.json())[:3000])" ] }, { "cell_type": "markdown", "id": "common-draft", "metadata": { "papermill": { "duration": 0.022528, "end_time": "2021-03-22T10:46:19.187856", "exception": false, "start_time": "2021-03-22T10:46:19.165328", "status": "completed" }, "tags": [] }, "source": [ "### Exact matching" ] }, { "cell_type": "markdown", "id": "thousand-listing", "metadata": { "papermill": { "duration": 0.020625, "end_time": "2021-03-22T10:46:19.231203", "exception": false, "start_time": "2021-03-22T10:46:19.210578", "status": "completed" }, "tags": [] }, "source": [ "Similarly, we can exact match a specific node by its ID." ] }, { "cell_type": "code", "execution_count": 12, "id": "challenging-offering", "metadata": { "execution": { "iopub.execute_input": "2021-03-22T10:46:19.272770Z", "iopub.status.busy": "2021-03-22T10:46:19.272432Z", "iopub.status.idle": "2021-03-22T10:46:19.413948Z", "shell.execute_reply": "2021-03-22T10:46:19.413550Z" }, "papermill": { "duration": 0.164685, "end_time": "2021-03-22T10:46:19.414047", "exception": false, "start_time": "2021-03-22T10:46:19.249362", "status": "completed" }, "tags": [] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{'metadata': {'empty_results': False,\n", " 'query': 'MATCH (node: Gwas {id: \"ieu-a-2\"}) RETURN node LIMIT '\n", " '10;',\n", " 'total_seconds': 0.012118},\n", " 'results': [{'node': {'_id': 'ieu-a-2',\n", " '_name': 'Body mass index',\n", " '_source': ['OpenGWAS-2020-10-13'],\n", " 'author': 'Locke AE',\n", " 'build': 'HG19/GRCh37',\n", " 'category': 'Risk factor',\n", " 'id': 'ieu-a-2',\n", " 'mr': '1',\n", " 'nsnp': '2555511',\n", " 'pmid': '25673413.0',\n", " 'population': 'Mixed',\n", " 'sample_size': '339224.0',\n", " 'sd': '4.77',\n", " 'sex': 'Males and Females',\n", " 'subcategory': 'Anthropometric',\n", " 'trait': 'Body mass index',\n", " 'year': '2015.0'}}]}\n" ] } ], "source": [ "id = \"ieu-a-2\"\n", "\n", "r = requests.get(f\"{API_URL}/meta/nodes/Gwas/search\", params={\"id\": id})\n", "r.raise_for_status()\n", "\n", "print(pformat(r.json())[:3000])" ] }, { "cell_type": "markdown", "id": "vietnamese-companion", "metadata": { "papermill": { "duration": 0.030923, "end_time": "2021-03-22T10:46:19.474984", "exception": false, "start_time": "2021-03-22T10:46:19.444061", "status": "completed" }, "tags": [] }, "source": [ "## Cypher (advanced)" ] }, { "cell_type": "markdown", "id": "proper-fantasy", "metadata": { "papermill": { "duration": 0.017481, "end_time": "2021-03-22T10:46:19.516610", "exception": false, "start_time": "2021-03-22T10:46:19.499129", "status": "completed" }, "tags": [] }, "source": [ "Advanced users that are familiar with Neo4j Cypher can query the database using Cypher directly." ] }, { "cell_type": "code", "execution_count": 13, "id": "incorporated-salem", "metadata": { "execution": { "iopub.execute_input": "2021-03-22T10:46:19.558119Z", "iopub.status.busy": "2021-03-22T10:46:19.557752Z", "iopub.status.idle": "2021-03-22T10:46:19.705581Z", "shell.execute_reply": "2021-03-22T10:46:19.704903Z" }, "papermill": { "duration": 0.171252, "end_time": "2021-03-22T10:46:19.705741", "exception": false, "start_time": "2021-03-22T10:46:19.534489", "status": "completed" }, "tags": [] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{'metadata': {'empty_results': False,\n", " 'query': 'MATCH (exposure:Gwas)-[mr:MR_EVE_MR]->(outcome:Gwas) '\n", " 'WHERE exposure.trait = \"Body mass index\" RETURN '\n", " 'exposure, outcome, mr LIMIT 2',\n", " 'total_seconds': 0.011951},\n", " 'results': [{'exposure': {'_id': 'ieu-a-974',\n", " '_name': 'Body mass index',\n", " '_source': ['OpenGWAS-2020-10-13'],\n", " 'author': 'Locke AE',\n", " 'build': 'HG19/GRCh37',\n", " 'category': 'Risk factor',\n", " 'id': 'ieu-a-974',\n", " 'mr': '1',\n", " 'nsnp': '2494613',\n", " 'pmid': '25673413.0',\n", " 'population': 'European',\n", " 'sample_size': '171977.0',\n", " 'sd': '4.77',\n", " 'sex': 'Females',\n", " 'subcategory': 'Anthropometric',\n", " 'trait': 'Body mass index',\n", " 'year': '2015.0'},\n", " 'mr': {'_source': ['MR-EvE-2021-03-10'],\n", " 'b': 0.0289678834636601,\n", " 'ci_low': -0.165265753333202,\n", " 'ci_upp': 0.22320152026052198,\n", " 'method': 'Simple mean',\n", " 'moescore': 0.77,\n", " 'nsnp': 37,\n", " 'pval': 0.771725286643359,\n", " 'se': 0.0990987942841133,\n", " 'selection': 'HF'},\n", " 'outcome': {'_id': 'prot-a-1729',\n", " '_name': 'Galectin-7',\n", " '_source': ['OpenGWAS-2020-10-13'],\n", " 'author': 'Sun BB',\n", " 'build': 'HG19/GRCh37',\n", " 'category': 'Immune system',\n", " 'id': 'prot-a-1729',\n", " 'mr': '1',\n", " 'nsnp': '10534735',\n", " 'pmid': '29875488.0',\n", " 'population': 'European',\n", " 'sample_size': '3301.0',\n", " 'sex': 'Males and Females',\n", " 'subcategory': 'Protein',\n", " 'trait': 'Galectin-7',\n", " 'year': '2018.0'}},\n", " {'exposure': {'_id': 'ieu-a-974',\n", " '_name': 'Body mass index',\n", " '_source': ['OpenGWAS-2020-10-13'],\n", " 'author': 'Locke AE',\n", " 'build': 'HG19/GRCh37',\n", " 'category': 'Risk factor',\n", " 'id': 'ieu-a-974',\n", " 'mr': '1',\n", " 'nsnp': '2494613',\n", " 'pmid': '25673413.0',\n", " 'population': 'European',\n", " 'sample_size': '171977.0',\n", " \n" ] } ], "source": [ "query = \"\"\"\n", " MATCH (exposure:Gwas)-[mr:MR_EVE_MR]->(outcome:Gwas) \n", " WHERE exposure.trait = \"Body mass index\"\n", " RETURN exposure, outcome, mr LIMIT 2\n", "\"\"\"\n", "\n", "r = requests.post(f\"{API_URL}/cypher\", json={\"query\": query})\n", "r.raise_for_status()\n", "\n", "print(pformat(r.json())[:3000])" ] }, { "cell_type": "markdown", "id": "defined-guinea", "metadata": { "papermill": { "duration": 0.031733, "end_time": "2021-03-22T10:46:19.770472", "exception": false, "start_time": "2021-03-22T10:46:19.738739", "status": "completed" }, "tags": [] }, "source": [ "Again for the detailed documentation on the API endpoints please visit:\n", "\n", "- The Swagger interface: http://api.epigraphdb.org\n", "- The sections regarding API endpoints on the documentation site: http://docs.epigraphdb.org/api/api-endpoints/" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.7" }, "papermill": { "default_parameters": {}, "duration": 5.210277, "end_time": "2021-03-22T10:46:21.001532", "environment_variables": {}, "exception": null, "input_path": "general-examples/platform-meta-functionalities.ipynb", "output_path": "general-examples/platform-meta-functionalities.ipynb", "parameters": { "API_URL": "https://api.epigraphdb.org" }, "start_time": "2021-03-22T10:46:15.791255", "version": "2.3.3" }, "toc-autonumbering": false }, "nbformat": 4, "nbformat_minor": 5 }