From 737d84396e69f1a84d33138d8523c2edbc5540cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Toma=C5=BE=20Mohori=C4=8D?= Date: Sat, 14 Sep 2024 06:54:50 +0000 Subject: [PATCH 1/3] Some major changes to the workflow: (1) Instead of EnrichR API the pathways are extracted with Python package gseapy. (2) Therefore previous stage 01 is split into three stages, one for download, one for processing and one for verification. --- .devcontainer/requirements.txt | 2 +- dvc.yaml | 18 ++++++- pathways.parquet | Bin 0 -> 183758 bytes stages/00_environment.sh | 1 + stages/01_download.py | 58 +---------------------- stages/02_build.py | 23 --------- stages/02_process.py | 84 +++++++++++++++++++++++++++++++++ stages/03_verify.py | 51 ++++++++++++++++++++ stages/04_build.py | 32 +++++++++++++ 9 files changed, 187 insertions(+), 82 deletions(-) create mode 100644 pathways.parquet delete mode 100644 stages/02_build.py create mode 100755 stages/02_process.py create mode 100755 stages/03_verify.py create mode 100755 stages/04_build.py diff --git a/.devcontainer/requirements.txt b/.devcontainer/requirements.txt index b7f5142..f3a121b 100644 --- a/.devcontainer/requirements.txt +++ b/.devcontainer/requirements.txt @@ -4,4 +4,4 @@ biobricks==0.3.7 fastparquet==2024.5.0 pyarrow==16.1.0 dvc==3.51.1 -dvc-s3==3.2.0 +dvc-s3==3.2.0 \ No newline at end of file diff --git a/dvc.yaml b/dvc.yaml index de6c315..1df8d16 100644 --- a/dvc.yaml +++ b/dvc.yaml @@ -10,10 +10,24 @@ stages: outs: - download + process: + cmd: python stages/02_process.py + deps: + - stages/02_process.py + outs: + - download + + verify: + cmd: python stages/03_verify.py + deps: + - stages/02_process.py + outs: + - download + build: - cmd: python stages/02_build.py + cmd: python stages/04_build.py deps: - - stages/02_build.py + - stages/03_verify.py - download outs: - brick diff --git a/pathways.parquet b/pathways.parquet new file mode 100644 index 0000000000000000000000000000000000000000..ec4c1e8502b0fabdf91cad5098f3460a52a1a3a2 GIT binary patch literal 183758 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

-tF$W{GSq9Y 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 literal 0 HcmV?d00001 diff --git a/stages/00_environment.sh b/stages/00_environment.sh index b915019..8109c59 100644 --- a/stages/00_environment.sh +++ b/stages/00_environment.sh @@ -1,3 +1,4 @@ #!/usr/bin/env bash pip install edelweiss-data +pip install gseapy \ No newline at end of file diff --git a/stages/01_download.py b/stages/01_download.py index 3e354e8..7dc87dc 100755 --- a/stages/01_download.py +++ b/stages/01_download.py @@ -11,7 +11,7 @@ overview_path = pathlib.Path("download") dataset_path = overview_path / "temposeq" pathways_path = overview_path / "pathways" -log_file_path = overview_path / "files.txt" +log_file_path = overview_path / "downloaded_files.txt" log_fold_change_threshold = 2 adjusted_p_value_threshold = 0.05 @@ -35,63 +35,9 @@ log_file.write(str(file_path) + "\n") # process individual datasets -for dataset_id in tqdm(datasets['Dataset id'], desc="Processing individual datasets"): +for dataset_id in tqdm(datasets['Dataset id'], desc="Download individual datasets"): file_path = dataset_path / f'{dataset_id}.csv' dataset = api.get_published_dataset(id=dataset_id, version='latest') data_frame = dataset.get_data() data_frame.to_csv(file_path, index=False) log_file.write(str(file_path) + "\n") - -# process pathways -def get_pathways_for_gene(gene_symbol): - """Fetch pathways associated with a gene symbol using the Enrichr API.""" - ENRICHR_URL = "https://amp.pharm.mssm.edu/Enrichr/addList" - ENRICHR_URL_A = 'https://amp.pharm.mssm.edu/Enrichr/enrich?userListId=%s&backgroundType=%s' - GENE_SET_LIBRARY = "KEGG_2015" - - payload = { 'list': (None, str(gene_symbol)), 'description': (None, "No description") } - response = requests.post(url=ENRICHR_URL, files=payload) - response.raise_for_status() - - user_list_id = json.loads(response.text)['userListId'] - - time.sleep(2) - - response_gene_list = requests.get(ENRICHR_URL_A % (str(user_list_id), GENE_SET_LIBRARY)) - response_gene_list.raise_for_status() - - enrichr_results = json.loads(response_gene_list.text)[GENE_SET_LIBRARY] - - return pd.DataFrame([{ - 'Gene symbol': gene_symbol, - 'Rank': result[0], - 'Pathway': result[1], - 'p-value': result[2], - 'Adj. p-value': result[6], - 'Odds Ratio': result[3], - 'Combined score': result[4] - } for result in enrichr_results]) - -columns = ['Gene symbol', 'Rank', 'Pathway', 'p-value', 'Adj. p-value', 'Odds Ratio', 'Combined score'] -degs_pathways = pd.DataFrame(columns=columns) - -for dataset_id in tqdm(datasets['Dataset id'], desc="Processing pathways"): - file_path = pathways_path / f'{dataset_id}_pathways.csv' - dataset = api.get_published_dataset(id=dataset_id, version='latest') - data_frame = dataset.get_data() - - is_significant_fold_change = (data_frame['logFC'] > log_fold_change_threshold) | \ - (data_frame['logFC'] < -log_fold_change_threshold) - is_significant_p_value = data_frame['padj'] < adjusted_p_value_threshold - - degs_data_frame = data_frame[is_significant_fold_change & is_significant_p_value] - - if not degs_data_frame.empty: - for _, gene_row in degs_data_frame.iterrows(): - pathways = get_pathways_for_gene(gene_row['SYMBOL']) - degs_pathways = pd.concat([degs_pathways, pathways], ignore_index=True) - - degs_pathways.to_csv(file_path, index=False) - log_file.write(str(file_path) + "\n") - else: - print(f"Missing required columns in dataset {dataset_id}") diff --git a/stages/02_build.py b/stages/02_build.py deleted file mode 100644 index a7f10db..0000000 --- a/stages/02_build.py +++ /dev/null @@ -1,23 +0,0 @@ -import os, pathlib -import pandas as pd - -# Set list path where you can store additional information or lists, if needed -dldir = pathlib.Path("download") - -# Create brick directory to store Parquet files -brickpath = pathlib.Path("brick") -(brickpath / "temposeq.parquet").mkdir(parents=True, exist_ok=True) -(brickpath / "pathways.parquet").mkdir(parents=True, exist_ok=True) - -# Read the list of input files -file_paths = [line.strip() for line in open(dldir / "files.txt", "r")] - -# Process each file path -for inputpath in file_paths: - outputpath = inputpath.replace("download", "brick")\ - .replace("temposeq", "temposeq.parquet")\ - .replace("pathways", "pathways.parquet")\ - .replace(".csv", ".parquet") - - pd.read_csv(inputpath).to_parquet(outputpath) - diff --git a/stages/02_process.py b/stages/02_process.py new file mode 100755 index 0000000..bcc8bfd --- /dev/null +++ b/stages/02_process.py @@ -0,0 +1,84 @@ +import pandas as pd +import pathlib +from tqdm import tqdm +import gseapy as gp + +# Define paths and variables +overview_path = pathlib.Path("download") +dataset_path = overview_path / "temposeq" +downloaded_file_path = overview_path / "downloaded_files.txt" +overview_file_path = overview_path / "overview.csv" +log_file_path = overview_path / "processed_files.txt" +pathways_file_path = overview_path / "pathways.csv" + +LOG_FOLD_CHANGE_THRESHOLD = 2 +ADJUSTED_P_VALUE_THRESHOLD = 0.05 +GENE_SET_LIBRARY = "WikiPathway_2023_Human" + +# Ensure directories exist +dataset_path.mkdir(parents=True, exist_ok=True) + +# Read the overview dataset +datasets = pd.read_csv(overview_file_path) + +# Check that all temposeq datasets have been downloaded in the previous step +downloaded_file = open(downloaded_file_path, "r") +downloaded_files = downloaded_file.read().splitlines() +downloaded_files = downloaded_files[1 : ] # remove the first file, which is the overview file + +if len(downloaded_files) == datasets.shape[0]: + print("All temposeq datasets have been downloaded. Proceed with processing.") +else: + print("""Number of temposeq datasets and downloaded files do not match.\n + Number of temposeq datasets: {0}\n + Number of downloaded files: {1}""".format(datasets.shape[0], len(downloaded_files))) + quit() + + +# Initiate the log file that will store processed filepaths +log_file = open(log_file_path, "w") + +degs_data_frame = pd.DataFrame() + +# Loop over downloaded temposeq files and identify deg and process the pathways +for dataset_id in tqdm(datasets['Dataset id'], desc="Collecting de genes"): + temposeq_path = dataset_path / f'{dataset_id}.csv' + data_frame = pd.read_csv(temposeq_path) + + is_significant_fold_change = (data_frame['logFC'] > LOG_FOLD_CHANGE_THRESHOLD) | \ + (data_frame['logFC'] < -LOG_FOLD_CHANGE_THRESHOLD) + + is_significant_p_value = data_frame['padj'] < ADJUSTED_P_VALUE_THRESHOLD + + tmp_degs_data_frame = data_frame[is_significant_fold_change & is_significant_p_value][['SYMBOL']] + degs_data_frame = pd.concat([degs_data_frame, tmp_degs_data_frame], axis=0, ignore_index=True) + + log_file.write(str(temposeq_path) + "\n") + +degs_data_frame = degs_data_frame.drop_duplicates(subset=['SYMBOL']) + +# process pathways +def get_pathways_for_gene(gene_symbol, gene_set_library): + enr = gp.enrich(gene_list=[gene_symbol], + gene_sets=gene_set_library, + background=None, + outdir=None, + verbose=False) + return enr.results + +# Process deg genes +degs_pathways = pd.DataFrame() +for _, gene_row in tqdm(degs_data_frame.iterrows(), desc=f"Processing {degs_data_frame.shape[0]} de genes"): + + if pd.isna(gene_row['SYMBOL']): + continue + + if gene_row['SYMBOL'] == "": + continue + + pathways = get_pathways_for_gene(gene_row['SYMBOL'], GENE_SET_LIBRARY) + if isinstance(pathways, pd.DataFrame): + if not pathways.empty: + degs_pathways = pd.concat([degs_pathways, pathways], ignore_index=True) + +degs_pathways.to_csv(pathways_file_path, index=False) \ No newline at end of file diff --git a/stages/03_verify.py b/stages/03_verify.py new file mode 100755 index 0000000..7d23fa6 --- /dev/null +++ b/stages/03_verify.py @@ -0,0 +1,51 @@ +import pandas as pd +import pathlib + +# Define paths and variables +overview_path = pathlib.Path("download") +downloaded_file_path = overview_path / "downloaded_files.txt" +processed_file_path = overview_path / "processed_files.txt" +overview_file_path = overview_path / "overview.csv" +verification_file_path = overview_path / "verification_success.txt" + +# Check that verification file does not exist +try: + verification_file_path.unlink() + print('Verification file deleted') +except: + print("Verification file doesn't exist") + + +# Read the overview dataset +overview_file_path = overview_path / 'overview.csv' +datasets = pd.read_csv(overview_file_path) + +# Read the downloaded file list +downloaded_file = open(downloaded_file_path, "r") +downloaded_files = downloaded_file.read().splitlines() +downloaded_files = downloaded_files[1 : ] # remove the first file, which is the overview file + +# Read the processed file list +processed_file = open(processed_file_path, "r") +processed_files = processed_file.read().splitlines() + +# Check that all temposeq datasets have been downloaded +if len(downloaded_files) == datasets.shape[0]: + print("Verification step 1: OK.\nAll temposeq datasets have been downloaded.") +else: + print("""Verification failed.\nNumber of temposeq datasets and downloaded files do not match.\n + Number of temposeq datasets: {0}\n + Number of downloaded files: {1}""".format(datasets.shape[0], len(downloaded_files))) + quit() + +# Check that all temposeq datasets have been downloaded +if len(processed_files) == datasets.shape[0]: + print("Verification step 2: OK.\nAll temposeq datasets have been processed.") +else: + print("""Verification failed.\nNumber of temposeq datasets and processed files do not match.\n + Number of temposeq datasets: {0}\n + Number of processed files: {1}""".format(datasets.shape[0], len(processed_files))) + quit() + +log_file = open(verification_file_path, "w") +log_file.write(f"Verification successful.") \ No newline at end of file diff --git a/stages/04_build.py b/stages/04_build.py new file mode 100755 index 0000000..d3c4ed5 --- /dev/null +++ b/stages/04_build.py @@ -0,0 +1,32 @@ +import os, pathlib +import pandas as pd + +# Set list path where you can store additional information or lists, if needed +dldir = pathlib.Path("download") + +# Check if verification file exists +verification_success = dldir / "verification_success.txt" +if not verification_success.is_file(): + print("Stop building because verification failed.") + quit() + +# Create brick directory to store Parquet files +brickpath = pathlib.Path("brick") +(brickpath / "temposeq.parquet").mkdir(parents=True, exist_ok=True) + +# Build temposeq parquet files +# Read the list of temposeq files +file_paths = [line.strip() for line in open(dldir / "downloaded_files.txt", "r")] + +# Process each temposeq file +for inputpath in file_paths: + outputpath = inputpath.replace("download", "brick")\ + .replace("temposeq", "temposeq.parquet")\ + .replace(".csv", ".parquet") + + pd.read_csv(inputpath).to_parquet(outputpath) + +# Build pathways parquet file +inputpath = dldir / "pathways.csv" +outputpath = inputpath.name.replace("download", "brick").replace(".csv", ".parquet") +pd.read_csv(inputpath).to_parquet(outputpath) \ No newline at end of file From 0c9060a95f4ec8156949cbcd1a7bf50728504b9a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Toma=C5=BE=20Mohori=C4=8D?= Date: Tue, 29 Oct 2024 12:31:05 +0000 Subject: [PATCH 2/3] Initial commit for RDF (see notebook eutr-rdf-first-try.ipynb) --- .vscode/settings.json | 5 + stages/eutr-rdf-first-try.ipynb | 491 ++++++++++++++++++++++++++++++++ stages/playground.ipynb | 372 ++++++++++++++++++++++++ 3 files changed, 868 insertions(+) create mode 100644 .vscode/settings.json create mode 100644 stages/eutr-rdf-first-try.ipynb create mode 100644 stages/playground.ipynb diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..b242572 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,5 @@ +{ + "githubPullRequests.ignoredPullRequestBranches": [ + "main" + ] +} \ No newline at end of file diff --git a/stages/eutr-rdf-first-try.ipynb b/stages/eutr-rdf-first-try.ipynb new file mode 100644 index 0000000..fb146a3 --- /dev/null +++ b/stages/eutr-rdf-first-try.ipynb @@ -0,0 +1,491 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 38, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'1.1.3'" + ] + }, + "execution_count": 38, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import gseapy\n", + "gseapy.__version__" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Defaulting to user installation because normal site-packages is not writeable\n", + "Requirement already satisfied: rdflib in /home/vscode/.local/lib/python3.9/site-packages (7.0.0)\n", + "Requirement already satisfied: pyparsing<4,>=2.1.0 in /home/vscode/.local/lib/python3.9/site-packages (from rdflib) (3.1.4)\n", + "Requirement already satisfied: isodate<0.7.0,>=0.6.0 in /home/vscode/.local/lib/python3.9/site-packages (from rdflib) (0.6.1)\n", + "Requirement already satisfied: six in /home/vscode/.local/lib/python3.9/site-packages (from isodate<0.7.0,>=0.6.0->rdflib) (1.16.0)\n", + "\n", + "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m A new release of pip is available: \u001b[0m\u001b[31;49m23.0.1\u001b[0m\u001b[39;49m -> \u001b[0m\u001b[32;49m24.2\u001b[0m\n", + "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m To update, run: \u001b[0m\u001b[32;49mpip install --upgrade pip\u001b[0m\n", + "Defaulting to user installation because normal site-packages is not writeable\n", + "Requirement already satisfied: rdflib-hdt in /home/vscode/.local/lib/python3.9/site-packages (3.1)\n", + "Requirement already satisfied: rdflib>=4.2 in /home/vscode/.local/lib/python3.9/site-packages (from rdflib-hdt) (7.0.0)\n", + "Requirement already satisfied: pybind11>=2.2.4 in /home/vscode/.local/lib/python3.9/site-packages (from rdflib-hdt) (2.13.6)\n", + "Requirement already satisfied: isodate<0.7.0,>=0.6.0 in /home/vscode/.local/lib/python3.9/site-packages (from rdflib>=4.2->rdflib-hdt) (0.6.1)\n", + "Requirement already satisfied: pyparsing<4,>=2.1.0 in /home/vscode/.local/lib/python3.9/site-packages (from rdflib>=4.2->rdflib-hdt) (3.1.4)\n", + "Requirement already satisfied: six in /home/vscode/.local/lib/python3.9/site-packages (from isodate<0.7.0,>=0.6.0->rdflib>=4.2->rdflib-hdt) (1.16.0)\n", + "\n", + "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m A new release of pip is available: \u001b[0m\u001b[31;49m23.0.1\u001b[0m\u001b[39;49m -> \u001b[0m\u001b[32;49m24.2\u001b[0m\n", + "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m To update, run: \u001b[0m\u001b[32;49mpip install --upgrade pip\u001b[0m\n" + ] + } + ], + "source": [ + "!pip install rdflib\n", + "!pip install rdflib-hdt\n", + "#!biobricks install wikipathways\n", + "#!biobricks install eutoxrisk-temposeq" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "#import biobricks as bb\n", + "from rdflib import Graph, Namespace\n", + "from rdflib.plugins.stores import sparqlstore\n", + "from rdflib_hdt import HDTStore\n", + "from rdflib.namespace import RDF, XSD, DCTERMS\n", + "import rdflib\n", + "from tqdm import tqdm" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Index(['Study', 'Treatment compound', 'Treatment concentration',\n", + " 'Treatment timepoint', 'Control compound', 'Control concentration',\n", + " 'Control timepoint', 'Filename', 'Case study', 'Index in compound list',\n", + " 'Comments', 'Parent compound', 'Harris's Preferred Name (ChEMBL/ECHA)',\n", + " 'SMILES', 'InChI key', 'CAS number', 'Starting substance',\n", + " 'Barbara's prefered name', 'Alternative name',\n", + " 'Starting substance SMILES', 'Starting substance CAS number',\n", + " 'Supplier', 'Cat no', 'Lot no', 'Form', 'Storage pure compound',\n", + " 'Solvent', 'Stock concentration', 'Stock concentration unit',\n", + " 'Stock aliquot storage', 'Purity', 'Molar weight', 'Molecular formula',\n", + " 'MDLNUM', 'Code', 'Dataset id'],\n", + " dtype='object')" + ] + }, + "execution_count": 41, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Connect studies, compounds and temposeq dataset id\n", + "df_overview = pd.read_csv(\"../download/overview.csv\")\n", + "df_overview.columns" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "metadata": {}, + "outputs": [], + "source": [ + "inchi_to_compound_dict = df_overview[['Treatment compound', 'InChI key']].set_index(\"InChI key\")['Treatment compound'].to_dict()\n", + "inchi_to_compound_dict_without_underscores = df_overview[['Treatment compound', 'InChI key']].set_index(\"InChI key\")['Treatment compound'].str.replace('_', ' ').to_dict()" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "metadata": {}, + "outputs": [], + "source": [ + "# Connect genes and pathways\n", + "df_pathways = pd.read_csv(\"../download/pathways.csv\")" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "0it [00:00, ?it/s]" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2336it [00:25, 90.46it/s] \n" + ] + } + ], + "source": [ + "# compound to gene relationship\n", + "compound_to_gene_list = []\n", + "\n", + "\n", + "for _, row in tqdm(df_overview.iterrows()):\n", + " dataset_id = row['Dataset id']\n", + " d = row.to_dict()\n", + "\n", + " try:\n", + " data_frame = pd.read_csv(\"../download/temposeq/{0}.csv\".format(dataset_id))\n", + " \n", + " LOG_FOLD_CHANGE_THRESHOLD = 2\n", + " ADJUSTED_P_VALUE_THRESHOLD = 0.05\n", + "\n", + " is_positive_significant_fold_change = (data_frame['logFC'] > LOG_FOLD_CHANGE_THRESHOLD)\n", + " is_negative_significant_fold_change = (data_frame['logFC'] < -LOG_FOLD_CHANGE_THRESHOLD)\n", + " \n", + " is_significant_p_value = data_frame['padj'] < ADJUSTED_P_VALUE_THRESHOLD\n", + " \n", + " d['positive deregulated genes'] = data_frame[is_positive_significant_fold_change & is_significant_p_value]['SYMBOL'].tolist()\n", + " d['negative deregulated genes'] = data_frame[is_negative_significant_fold_change & is_significant_p_value]['SYMBOL'].tolist()\n", + "\n", + " compound_to_gene_list.append(d)\n", + " except:\n", + " pass" + ] + }, + { + "cell_type": "code", + "execution_count": 51, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Graph has 9641 nodes.\n", + "Graph has 46527 statements.\n" + ] + } + ], + "source": [ + "g = rdflib.Graph()\n", + "context = []\n", + "\n", + "# namespaces\n", + "nm = g.namespace_manager\n", + "\n", + "sio, prefix = rdflib.Namespace(\"http://semanticscience.org/resource/SIO/\"), \"sio\"\n", + "nm.bind(prefix, sio)\n", + "\n", + "cheminf, prefix = rdflib.Namespace(\"http://semanticscience.org/resource/CHEMINF/\"), \"cheminf\"\n", + "nm.bind(prefix, cheminf)\n", + "\n", + "wp, prefix = rdflib.Namespace(\"http://vocabularies.wikipathways.org/wpTypes#\"), \"wp\"\n", + "nm.bind(prefix, wp)\n", + "\n", + "bp, prefix = rdflib.Namespace(\"http://www.biopax.org/release/biopax-level3.owl#\"), \"bp\"\n", + "nm.bind(prefix, bp)\n", + "\n", + "bao, prefix = rdflib.Namespace(\"http://www.bioassayontology.org/bao#\"), \"bao\"\n", + "nm.bind(prefix, bao)\n", + "\n", + "metago, prefix = rdflib.Namespace(\"http://model.geneontology.org/\"), \"metago\"\n", + "nm.bind(prefix, metago)\n", + "\n", + "# Graph is built from triplets of (subject, predicate, object)\n", + "\n", + "# Compounds\n", + "for inchikey in df_overview['InChI key'].unique():\n", + " s = rdflib.URIRef(\"inchikey:{0}\".format(inchikey))\n", + " \n", + " # inchikey object has value of #inchikey\n", + " # (InChIKey, sio:SIO_000300 (has value), InChIKeyValue)\n", + " p = sio.SIO_000300\n", + " o = rdflib.Literal(inchikey, datatype=XSD.string)\n", + " g.add((s, p, o))\n", + " # inchikey object is type of inchikey\n", + " # InChIKey, rdf:type cheminf:CHEMINF_000399)\n", + " p = RDF.type\n", + " o = cheminf.CHEMINF_000399\n", + " g.add((s, p, o))\n", + "\n", + " # (InChIKey, sio:SIO_000011 (is attribute of), Compound)\n", + " p = sio.SIO_000011\n", + " o = rdflib.URIRef(\"compound:{0}\".format(inchi_to_compound_dict[inchikey]))\n", + " g.add((s, p, o))\n", + " #context.append(\"Compound {0} has InChIKey {1}.\".format(inchi_to_compound_dict_without_underscores[inchikey], inchikey))\n", + "\n", + "\n", + "# Genes\n", + "for gene_symbol in df_pathways.Genes.unique():\n", + " # gene is type of gene\n", + " s = rdflib.URIRef(\"gene:{0}\".format(gene_symbol))\n", + " p = RDF.type\n", + " o = wp.GeneProduct #sio.SIO_010035 <-- what should we use? Pubchem uses SIO. WP uses wp.\n", + " g.add((s, p, o))\n", + "\n", + " # gene has symbol\n", + " p = bao.BAO_0002870\n", + " o = rdflib.Literal(gene_symbol, datatype=XSD.string)\n", + " g.add((s, p, o))\n", + "\n", + "\n", + "# Pathways\n", + "for pathway_title in df_pathways.Term.unique():\n", + " pathway_name = pathway_title.replace(\" \", \"-\")\n", + "\n", + " # pathway is type of pathway\n", + " s = rdflib.URIRef(\"pathway:{0}\".format(pathway_name))\n", + " p = RDF.type\n", + " o = wp.Pathway #bp.Pathway\n", + " g.add((s, p, o))\n", + "\n", + " # pathway has title \n", + " p = DCTERMS.title\n", + " o = rdflib.Literal(pathway_title, datatype=XSD.string)\n", + " g.add((s, p, o))\n", + "\n", + "\n", + "# Compound-gene relationship\n", + "for row in compound_to_gene_list:\n", + " # one row is one compound in a particular study\n", + " pos_deregulated_genes = list(set(row['positive deregulated genes']))\n", + " neg_deregulated_genes = list(set(row['negative deregulated genes']))\n", + "\n", + " inchikey = row['InChI key']\n", + " s = rdflib.URIRef(\"compound:{0}\".format(inchi_to_compound_dict[inchikey]))\n", + " \n", + " for gene_symbol in pos_deregulated_genes:\n", + " p = metago.GO_0048521\n", + " o = rdflib.URIRef(\"gene:{0}\".format(gene_symbol))\n", + " g.add((s, p, o))\n", + " context.append(\"Compound {0} upregulates gene {1}.\".format(inchi_to_compound_dict_without_underscores[inchikey], gene_symbol))\n", + "\n", + " for gene_symbol in neg_deregulated_genes:\n", + " p = metago.GO_0048522\n", + " o = rdflib.URIRef(\"gene:{0}\".format(gene_symbol))\n", + " g.add((s, p, o))\n", + " context.append(\"Compound {0} downregulates gene {1}.\".format(inchi_to_compound_dict_without_underscores[inchikey], gene_symbol))\n", + "\n", + "# Gene-Pathway relationship\n", + "for _, row in df_pathways.iterrows():\n", + " gene_symbol = row['Genes']\n", + " pathway_title = row['Term']\n", + " pathway_name = pathway_title.replace(\" \", \"-\")\n", + "\n", + " # Gene is part of pathway\n", + " # (wp:GeneProduct, DCTERMS.isPartOf, wp:Pathway)\n", + " s = rdflib.URIRef(\"gene:{0}\".format(gene_symbol))\n", + " p = DCTERMS.isPartOf\n", + " o = rdflib.URIRef(\"pathway:{0}\".format(pathway_name))\n", + " g.add((s, p, o))\n", + " \n", + " #context.append(\"Gene {0} is part of {1} pathway.\".format(gene_symbol, pathway_title))\n", + " \n", + "\n", + "print(\"Graph has {0} nodes.\".format(len(g.all_nodes())))\n", + "print(\"Graph has {0} statements.\".format(len(g)))\n", + "context_str = \" \".join(context)" + ] + }, + { + "cell_type": "code", + "execution_count": 52, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "46527\n", + "1577500\n", + "29244\n", + "33.90504438283148\n" + ] + } + ], + "source": [ + "print(len(g))\n", + "print(len(context_str))\n", + "print(len(context))\n", + "print(len(context_str) / len(g))" + ] + }, + { + "cell_type": "code", + "execution_count": 59, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'Compound Butanone oxime upregulates gene ATAD2. Compound Butanone oxime upregulates gene LGALS1. Compound Butanone oxime upregulates gene S100A10. Compound Butanone oxime upregulates gene TP53. Compound Butanone oxime upregulates gene DDR1. Compound Butanone oxime upregulates gene PTPN1. Compound Butanone oxime upregulates gene CDCA8. Compound Butanone oxime upregulates gene S100P. Compound Butanone oxime upregulates gene CEACAM6. Compound Butanone oxime upregulates gene IFIT3. Compound Butanone oxime upregulates gene MCM10. Compound Butanone oxime upregulates gene EGR3. Compound Butanone oxime upregulates gene MSH2. Compound Butanone oxime upregulates gene SP110. Compound Butanone oxime upregulates gene CDC25A. Compound Butanone oxime upregulates gene CDCA7. Compound Butanone oxime upregulates gene CCNE2. Compound Butanone oxime upregulates gene HJURP. Compound Butanone oxime upregulates gene H2BC14. Compound Butanone oxime upregulates gene PROS1. Compound Butanone oxime upregulates gene FAM83D. Compound Butanone oxime upregulates gene GLI1. Compound Butanone oxime upregulates gene MCIDAS. Compound Butanone oxime upregulates gene IFIT1. Compound Butanone oxime upregulates gene MCM3. Compound Butanone oxime upregulates gene DNM1. Compound Butanone oxime upregulates gene VAV3. Compound Butanone oxime upregulates gene MCM4. Compound Butanone oxime upregulates gene CXCL14. Compound Butanone oxime upregulates gene PALMD. Compound Butanone oxime upregulates gene GINS1. Compound Butanone oxime upregulates gene TXNIP. Compound Butanone oxime upregulates gene SPC25. Compound Butanone oxime upregulates gene LMO3. Compound Butanone oxime downregulates gene MMP1. Compound Butanone oxime downregulates gene CXCL8. Compound Butanone oxime downregulates gene BMP6. Compound Butanone oxime downregulates gene DDIT3. Compound Butanone oxime downregulates gene LAMP3. Compound Butanone oxime downregulates gene IL13RA2. Compound Butanone oxime downregulates gene HDAC9. Compound Butanone oxime downregulates gene PPP1R15A. Compound Butanone oxime downregulates gene CCNA1. Compound Butanone oxime upregulates gene AQP3. Compound Butanone oxime upregulates gene TPRKB. Compound Butanone oxime upregulates gene HLA-C. Compound Butanone oxime upregulates gene H2BC15. Compound Butanone oxime upregulates gene HMG20B. Compound Butanone oxime upregulates gene CYP2C19. Compound Butanone oxime upregulates gene MT1X. Compound Butanone oxime upregulates gene WFS1. Compound Butanone oxime upregulates gene SERPINA3. Compound Butanone oxime upregulates gene CXCL5. Compound Butanone oxime upregulates gene RPSA. Compound Butanone oxime upregulates gene NIPSNAP1. Compound Butanone oxime upregulates gene EMX1. Compound Butanone oxime upregulates gene ODF3B. Compound Butanone oxime upregulates gene GIMAP8. Compound Butanone oxime upregulates gene MT1H. Compound Butanone oxime upregulates gene BAD. Compound Butanone oxime upregulates gene CRISP3. Compound Butanone oxime upregulates gene CHEK2. Compound Butanone oxime upregulates gene APOL3. Compound Butanone oxime upregulates gene PKIG. Compound Butanone oxime downregulates gene MOK. Compound Butanone oxime downregulates gene DLG4. Compound Butanone oxime downregulates gene ZNF586. Compound Butanone oxime downregulates gene FOXJ3. Compound Butanone oxime downregulates gene SPTLC2. Compound Butanone oxime downregulates gene KLRC2. Compound Butanone oxime upregulates gene HLA-C. Compound Butanone oxime upregulates gene ZP3. Compound Butanone oxime upregulates gene OTUD7B. Compound Butanone oxime upregulates gene CCDC92. Compound Butanone oxime upregulates gene RHOB. Compound Butanone oxime upregulates gene TPD52L2. Compound Butanone oxime upregulates gene RFC5. Compound Butanone oxime upregulates gene SERPINA3. Compound Butanone oxime upregulates gene LPCAT1. Compound Butanone oxime upregulates gene H1-0. Compound Butanone oxime upregulates gene RPSA. Compound Butanone oxime upregulates gene DRD2. Compound Butanone oxime upregulates gene DPH2. Compound Butanone oxime upregulates gene JUN. Compound Butanone oxime upregulates gene PDGFA. Compound Butanone oxime upregulates gene DDIT4. Compound Butanone oxime upregulates gene DNAJA3. Compound Butanone oxime upregulates gene MRPL53. Compound Butanone oxime upregulates gene NES. Compound Butanone oxime upregulates gene APOL3. Compound Butanone oxime upregulates gene TNFSF13. Compound Butanone oxime upregulates gene PKIG. Compound Butanone oxime upregulates gene VKORC1. Compound Butanone oxime downregulates gene AMY1A. Compound Butanone oxime upregulates gene HLA-C. Compound Butanone oxime upregulates gene OTUD7B. Compound Butanone oxime upregulates gene H2BC15. Compound Butanone oxime upregulates gene CYP2C19. Compound Butanone oxime upregulates gene CYP1B1. Compound Butanone oxime upregulates gene ICAM1. Compound Butanone oxime upregulates gene LGALS1. Compound Butanone oxime upregulates gene RFC5. Compound Butanone oxime upregulates gene SERPINA3. Compound Butanone oxime upregulates gene COL11A1. Compound Butanone oxime upregulates gene RPSA. Compound Butanone oxime upregulates gene NGFR. Compound Butanone oxime upregulates gene DRD2. Compound Butanone oxime upregulates gene CALM3. Compound Butanone oxime upregulates gene RPL27. Compound Butanone oxime upregulates gene PSRC1. Compound Butanone oxime upregulates gene GIMAP8. Compound Butanone oxime upregulates gene CCNF. Compound Butanone oxime upregulates gene CRISP3. Compound Butanone oxime upregulates gene MRPL53. Compound Butanone oxime upregulates gene CA1. Compound Butanone oxime upregulates gene APOL3. Compound Butanone oxime upregulates gene DDIAS. Compound Butanone oxime upregulates gene VKORC1. Compound Butanone oxime downregulates gene CLDN2. Compound Butanone oxime downregulates gene SLC2A1. Compound Butanone oxime downregulates gene GALNT3. Compound Butanone oxime downregulates gene PHLDA2. Compound Butanone oxime downregulates gene AGXT2. Compound Butanone oxime downregulates gene POLE2. Compound Butanone oxime downregulates gene GINS2. Compound Butanone oxime downregulates gene INA. Compound Butanone oxime downregulates gene ARHGAP8. Compound Butanone oxime upregulates gene TPRKB. Compound Butanone oxime upregulates gene HLA-C. Compound Butanone oxime upregulates gene NLRX1. Compound Butanone oxime upregulates gene H2BC15. Compound Butanone oxime upregulates gene CYP2C19. Compound Butanone oxime upregulates gene LGALS1. Compound Butanone oxime upregulates gene DHFR. Compound Butanone oxime upregulates gene SERPINA3. Compound Butanone oxime upregulates gene RPSA. Compound Butanone oxime upregulates gene NIPSNAP1. Compound Butanone oxime upregulates gene NGFR. Compound Butanone oxime upregulates gene B4GALT5. Compound Butanone oxime upregulates gene JUN. Compound Butanone oxime upregulates gene ISG15. Compound Butanone oxime upregulates gene MT1H. Compound Butanone oxime upregulates gene H2AC8. Compound Butanone oxime upregulates gene APOL3. Compound Butanone oxime upregulates gene VKORC1. Compound Butanone oxime upregulates gene PSME1. Compound Butanone oxime upregulates gene VKORC1. Compound Butanone oxime upregulates gene ZNF217. Compound Butanone oxime upregulates gene CYTH1. Compound Butanone oxime upregulates gene TPRKB. Compound Butanone oxime upregulates gene HLA-C. Compound Butanone oxime upregulates gene LGALS1. Compound Butanone oxime upregulates gene TPD52L2. Compound Butanone oxime upregulates gene WFS1. Compound Butanone oxime upregulates gene SERPINA3. Compound Butanone oxime upregulates gene H1-0. Compound Butanone oxime upregulates gene COL11A1. Compound Butanone oxime upregulates gene RPSA. Compound Butanone oxime upregulates gene NIPSNAP1. Compound Butanone oxime upregulates gene NGFR. Compound Butanone oxime upregulates gene DRD2. Compound Butanone oxime upregulates gene PDPN. Compound Butanone oxime upregulates gene ACTA1. Compound Butanone oxime upregulates gene CCDC80. Compound Butanone oxime upregulates gene TIMP2. Compound Butanone oxime upregulates gene CHEK2. Compound Butanone oxime upregulates gene MRPL53. Compound Butanone oxime upregulates gene VKORC1. Compound Butanone oxime downregulates gene ZNF586. Compound Butanone oxime downregulates gene VEGFD. Compound Butanone oxime downregulates gene EVI2B. Compound Butanone oxime downregulates gene COL5A2. Compound Butanone oxime upregulates gene HLA-C. Compound Butanone oxime upregulates gene H2BC15. Compound Butanone oxime upregulates gene LGALS1. Compound Butanone oxime upregulates gene TPD52L2. Compound Butanone oxime upregulates gene WFS1. Compound Butanone oxime upregulates gene GPR171. Compound Butanone oxime upregulates gene SERPINA3. Compound Butanone oxime upregulates gene H1-0. Compound Butanone oxime upregulates gene RPSA. Compound Butanone oxime upregulates gene NIPSNAP1. Compound Butanone oxime upregulates gene P4HB. Compound Butanone oxime upregulates gene DRD2. Compound Butanone oxime upregulates gene RPL27. Compound Butanone oxime upregulates gene IFI6. Compound Butanone oxime upregulates gene TIMP2. Compound Butanone oxime upregulates gene ISG15. Compound Butanone oxime upregulates gene DDIT4. Compound Butanone oxime upregulates gene BAD. Compound Butanone oxime upregulates gene CHEK2. Compound Butanone oxime upregulates gene VKORC1. Compound Butanone oxime upregulates gene PSME1. Compound Butanone oxime downregulates gene AOC2. Compound Butanone oxime downregulates gene LATS2. Compound Butyl tin trichloride downregulates gene EPHB6. Compound Butyl tin trichloride upregulates gene NMRAL2P. Compound Butyl tin trichloride upregulates gene UGT1A10. Compound Butyl tin trichloride upregulates gene UGT1A8. Compound Butyl tin trichloride upregulates gene NQO1. Compound Butyl tin trichloride downregulates gene TXNIP. Compound Butyl tin trichloride downregulates gene CASR. Compound Butyl tin trichloride downregulates gene EMX2. Compound Butyl tin trichloride downregulates gene TXNIP. Compound Butyl tin trichloride downregulates gene ABL1. Compound Butyl tin trichloride upregulates gene TRIM16L. Compound Butyl tin trichloride upregulates gene UGT1A1. Compound Butyl tin trichloride upregulates gene NMRAL2P. Compound Butyl tin trichloride upregulates gene UGT1A3. Compound Butyl tin trichloride upregulates gene UGT1A10. Compound Butyl tin trichloride upregulates gene AKR1B10. Compound Butyl tin trichloride upregulates gene NQO1. Compound Butyl tin trichloride upregulates gene UGT1A6. Compound Butyl tin trichloride upregulates gene HMOX1. Compound Butyl tin trichloride downregulates gene TXNIP. Compound Butyl tin trichloride downregulates gene CASR. Compound Butyl tin trichloride upregulates gene SLCO2B1. Compound Butyl tin trichloride upregulates gene TRIM16L. Compound Butyl tin trichloride upregulates gene NMRAL2P. Compound Butyl tin trichloride upregulates gene OSGIN1. Compound Butyl tin trichloride upregulates gene FN1. Compound Butyl tin trichloride upregulates gene CDA. Compound Butyl tin trichloride upregulates gene UGT1A10. Compound Butyl tin trichloride upregulates gene AKR1B10. Compound Butyl tin trichloride upregulates gene SLC7A11. Compound Butyl tin trichloride upregulates gene TXNRD1. Compound Butyl tin trichloride upregulates gene NQO1. Compound Butyl tin trichloride upregulates gene AFP. Compound Butyl tin trichloride upregulates gene UGT1A6. Compound Butyl tin trichloride upregulates gene HMOX1. Compound Butyl tin trichloride downregulates gene CASR. Compound Butyl tin trichloride downregulates gene EMX2. Compound Butyl tin trichloride downregulates gene TXNIP. Compound Butyl tin trichloride downregulates gene AGR3. Compound Butyl tin trichloride downregulates gene BBOX1. Compound Butyl tin trichloride downregulates gene FIBIN. Compound Butyl tin trichloride downregulates gene EGR1. Compound Butyl tin trichloride downregulates gene FGFR2. Compound Butyl tin trichloride downregulates gene DEFB1. Compound Butyl tin trichloride downregulates gene SLC8A1. Compound Butyl tin trichloride upregulates gene TRIM16L. Compound Butyl tin trichloride upregulates gene AKR1C2. Compound Butyl tin trichloride upregulates gene NMRAL2P. Compound Butyl tin trichloride upregulates gene TXNRD1. Compound Butyl tin trichloride upregulates gene IL13RA2. Compound Butyl tin trichloride downregulates gene KRT4. Compound Butyl tin trichloride upregulates gene TRIM16L. Compound Butyl tin trichloride upregulates gene AKR1C2. Compound Butyl tin trichloride upregulates gene NMRAL2P. Compound Butyl tin trichloride upregulates gene GPX2. Compound Butyl tin trichloride upregulates gene MAP2. Compound Butyl tin trichloride upregulates gene OSGIN1. Compound Butyl tin trichloride upregulates gene HSPA6. Compound Butyl tin trichloride upregulates gene NRCAM. Compound Butyl tin trichloride upregulates gene GCLC. Compound Butyl tin trichloride upregulates gene TNFRSF9. Compound Butyl tin trichloride upregulates gene ZNF469. Compound Butyl tin trichloride upregulates gene IL13RA2. Compound Butyl tin trichloride upregulates gene SLC7A11. Compound Butyl tin trichloride upregulates gene TXNRD1. Compound Butyl tin trichloride upregulates gene ZNF114. Compound Butyl tin trichloride upregulates gene HMOX1. Compound Butyl tin trichloride downregulates gene CCL2. Compound Butyl tin trichloride downregulates gene SERPINB4. Compound Butyl tin trichloride upregulates gene FTL. Compound Butyl tin trichloride upregulates gene AKR1C2. Compound Butyl tin trichloride upregulates gene GCLC. Compound Butyl tin trichloride upregulates gene NCF2. Compound Butyl tin trichloride upregulates gene ZNF469. Compound Butyl tin trichloride upregulates gene FTH1. Compound Butyl tin trichloride upregulates gene HDAC9. Compound Butyl tin trichloride upregulates gene GPAT3. Compound Butyl tin trichloride upregulates gene ZNF114. Compound Butyl tin trichloride upregulates gene LCAL1. Compound Butyl tin trichloride upregulates gene TRIM16L. Compound Butyl tin trichloride upregulates gene GCLM. Compound Butyl tin trichloride upregulates gene NMRAL2P. Compound Butyl tin trichloride upregulates gene PLIN2. Compound Butyl tin trichloride upregulates gene SLC2A14. Compound Butyl tin trichloride upregulates gene SRXN1. Compound Butyl tin trichloride upregulates gene SQSTM1. Compound Butyl tin trichloride upregulates gene NRCAM. Compound Butyl tin trichloride upregulates gene GDF15. Compound Butyl tin trichloride upregulates gene IGFBP3. Compound Butyl tin trichloride upregulates gene NDRG1. Compound Butyl tin trichloride upregulates gene MAP1B. Compound Butyl tin trichloride upregulates gene SOCS1. Compound Butyl tin trichloride upregulates gene MMP1. Compound Butyl tin trichloride upregulates gene LY96. Compound Butyl tin trichloride upregulates gene GPX2. Compound Butyl tin trichloride upregulates gene MAP2. Compound Butyl tin trichloride upregulates gene HSPA6. Compound Butyl tin trichloride upregulates gene TNFRSF9. Compound Butyl tin trichloride upregulates gene LAMP3. Compound Butyl tin trichloride upregulates gene IL13RA2. Compound Butyl tin trichloride upregulates gene CSF2. Compound Butyl tin trichloride upregulates gene TXNRD1. Compound Butyl tin trichloride upregulates gene POPDC3. Compound Butyl tin trichloride upregulates gene OSGIN1. Compound Butyl tin trichloride upregulates gene TREM1. Compound Butyl tin trichloride upregulates gene SLC7A11. Compound Butyl tin trichloride upregulates gene AKR1C3. Compound Butyl tin trichloride upregulates gene HMOX1. Compound Butyl tin trichloride downregulates gene MUC1. Compound Butyl tin trichloride downregulates gene CAMK2B. Compound Butyl tin trichloride downregulates gene IFIT3. Compound Butyl tin trichloride downregulates gene TGFB2. Compound Butyl tin trichloride downregulates gene MCM10. Compound Butyl tin trichloride downregulates gene SERPINB4. Compound Butyl tin trichloride downregulates gene VGLL1. Compound Butyl tin trichloride downregulates gene ECSCR. Compound Butyl tin trichloride downregulates gene HERC5. Compound Butyl tin trichloride downregulates gene ID3. Compound Butyl tin trichloride downregulates gene CCNE2. Compound Butyl tin trichloride downregulates gene IL2RB. Compound Butyl tin trichloride downregulates gene KRT4. Compound Butyl tin trichloride downregulates gene IL20. Compound Butyl tin trichloride downregulates gene CCL2. Compound Butyl tin trichloride downregulates gene H2BC14. Compound Butyl tin trichloride downregulates gene INSC. Compound Butyl tin trichloride downregulates gene THBS1. Compound Butyl tin trichloride downregulates gene CYP24A1. Compound Butyl tin trichloride downregulates gene EXO1. Compound Butyl tin trichloride downregulates gene IFIT1. Compound Butyl tin trichloride downregulates gene MCM3. Compound Butyl tin trichloride downregulates gene ATAD5. Compound Butyl tin trichloride downregulates gene STEAP4. Compound Butyl tin trichloride downregulates gene PCLAF. Compound Butyl tin trichloride downregulates gene CXCL14. Compound Butyl tin trichloride downregulates gene EGFL6. Compound Butyl tin trichloride downregulates gene PALMD. Compound Butyl tin trichloride downregulates gene ZNF367. Compound Butyl tin trichloride downregulates gene H2BC3. Compound Butyl tin trichloride downregulates gene H2BC7. Compound Butyl tin trichloride downregulates gene FOSB. Compound Butyl tin trichloride downregulates gene LMO3. Compound Butyl tin trichloride upregulates gene TRIM16L. Compound Butyl tin trichloride upregulates gene FTL. Compound Butyl tin trichloride upregulates gene IFIT3. Compound Butyl tin trichloride upregulates gene AKR1C2. Compound Butyl tin trichloride upregulates gene RRAD. Compound Butyl tin trichloride upregulates gene HSPA6. Compound Butyl tin trichloride upregulates gene NRCAM. Compound Butyl tin trichloride upregulates gene HSPA1A. Compound Butyl tin trichloride upregulates gene HSPA1B. Compound Butyl tin trichloride upregulates gene ZNF469. Compound Butyl tin trichloride upregulates gene MINDY1. Compound Butyl tin trichloride upregulates gene TXNRD1. Compound Butyl tin trichloride upregulates gene CTTNBP2. Compound Butyl tin trichloride upregulates gene AKR1C3. Compound Butyl tin trichloride upregulates gene HMOX1. Compound Butyl tin trichloride downregulates gene CX3CL1. Compound Butyl tin trichloride downregulates gene MMP1. Compound Butyl tin trichloride downregulates gene CYP1B1. Compound Butyl tin trichloride downregulates gene THBD. Compound Butyl tin trichloride downregulates gene NSG1. Compound Butyl tin trichloride downregulates gene CXCL14. Compound Butyl tin trichloride downregulates gene KRT6A. Compound Butyl tin trichloride downregulates gene KRT14. Compound Butyl tin trichloride downregulates gene KRT5. Compound Butyl tin trichloride upregulates gene LPCAT1. Compound Butyl tin trichloride upregulates gene SEMA3C. Compound Butyl tin trichloride upregulates gene MGC70870. Compound Butyl tin trichloride upregulates gene MT1H. Compound Butyl tin trichloride downregulates gene IGHV3-23. Compound Butyl tin trichloride downregulates gene POU5F2. Compound Butyl tin trichloride upregulates gene NMRAL2P. Compound Butyl tin trichloride upregulates gene HMOX1. Compound Butyl tin trichloride upregulates gene F2RL2. Compound Butyl tin trichloride downregulates gene CYP1A2. Compound Butyl tin trichloride upregulates gene IGHV3-23. Compound Butyl tin trichloride upregulates gene LPCAT1. Compound Butyl tin trichloride upregulates gene APOL3. Compound Butyl tin trichloride upregulates gene CDH11. Compound Butyl tin trichloride upregulates gene PLK3. Compound Butyl tin trichloride upregulates gene ALDOC. Compound Butyl tin trichloride downregulates gene GALNT3. Compound Butyl tin trichloride downregulates gene SMAD4. Compound Butyl tin trichloride downregulates gene TFAP2A. Compound Butyl tin trichloride downregulates gene IL1A. Compound Butyl tin trichloride downregulates gene KRT14. Compound Butyl tin trichloride downregulates gene KRT17. Compound Butyl tin trichloride downregulates gene KRT5. Compound Butyl tin trichloride downregulates gene KRT6A. Compound Butyl tin trichloride downregulates gene AREG. Compound Butyl tin trichloride downregulates gene DNMT1. Compound Butyl tin trichloride upregulates gene HMOX1. Compound Butyl tin trichloride downregulates gene S100A2. Compound Butyl tin trichloride downregulates gene KRT14. Compound Butyl tin trichloride downregulates gene KRT17. Compound Butyl tin trichloride downregulates gene KRT5. Compound Butyl tin trichloride downregulates gene KRT6A. Compound Butyl tin trichloride upregulates gene AKR1B10. Compound Butyl tin trichloride upregulates gene CYP24A1. Compound Butyl tin trichloride upregulates gene AKR1C2. Compound Butyl tin trichloride upregulates gene NMRAL2P. Compound Butyl tin trichloride upregulates gene GCLM. Compound Butyl tin trichloride upregulates gene OSGIN1. Compound Butyl tin trichloride upregulates gene AKR1B10. Compound Butyl tin trichloride upregulates gene RFK. Compound Butyl tin trichloride upregulates gene RRP7A. Compound Butyl tin trichloride downregulates gene HSPA9. Compound Butyl tin trichloride downregulates gene PTBP2. Compound Butyl tin trichloride downregulates gene KDM3A. Compound Butyl tin trichloride downregulates gene DNAJB4. Compound Butyl tin trichloride downregulates gene RPL15. Compound Butyl tin trichloride downregulates gene MTRNR2L8. Compound Butyl tin trichloride downregulates gene HIST1H3F. Compound Dibutyl tin dichloride upregulates gene CASR. Compound Dibutyl tin dichloride upregulates gene RET. Compound Dibutyl tin dichloride upregulates gene EMX1. Compound Dibutyl tin dichloride downregulates gene EOMES. Compound Dibutyl tin dichloride downregulates gene MMP1. Compound Dibutyl tin dichloride downregulates gene CCL2. Compound Dibutyl tin dichloride downregulates gene IRAK2. Compound Dibutyl tin dichloride downregulates gene PLAT. Compound Dibutyl tin dichloride downregulates gene CSF1. Compound Dibutyl tin dichloride downregulates gene IL13RA2. Compound Dibutyl tin dichloride downregulates gene CSF2. Compound Dibutyl tin dichloride downregulates gene CCL20. Compound Dibutyl tin dichloride downregulates gene IL1B. Compound Dibutyl tin dichloride upregulates gene DDIT4. Compound Dibutyl tin dichloride upregulates gene MT1H. Compound Dibutyl tin dichloride upregulates gene CYP26A1. Compound Dibutyl tin dichloride upregulates gene FOS. Compound Dibutyl tin dichloride upregulates gene PRR15L. Compound Dibutyl tin dichloride upregulates gene ANGPTL4. Compound Dibutyl tin dichloride downregulates gene MMP1. Compound Dibutyl tin dichloride downregulates gene CD69. Compound Dibutyl tin dichloride downregulates gene IRAK2. Compound Dibutyl tin dichloride downregulates gene PLAT. Compound Dibutyl tin dichloride downregulates gene IL13RA2. Compound Dibutyl tin dichloride downregulates gene SERPINB3. Compound Dibutyl tin dichloride downregulates gene IL1B. Compound Dibutyl tin dichloride upregulates gene PRR15L. Compound Dibutyl tin dichloride upregulates gene CYP26A1. Compound Dibutyl tin dichloride upregulates gene BBOX1. Compound Dibutyl tin dichloride downregulates gene SLCO2B1. Compound Dibutyl tin dichloride downregulates gene MMP1. Compound Dibutyl tin dichloride downregulates gene PLAT. Compound Dibutyl tin dichloride downregulates gene IL1B. Compound Dibutyl tin dichloride upregulates gene HMOX1. Compound Dibutyl tin dichloride upregulates gene CYP26A1. Compound Dibutyl tin dichloride downregulates gene MMP1. Compound Dibutyl tin dichloride downregulates gene PLAT. Compound Dibutyl tin dichloride downregulates gene IL1B. Compound Dibutyl tin dichloride upregulates gene UGT1A10. Compound Dibutyl tin dichloride upregulates gene UGT1A8. Compound Dibutyl tin dichloride upregulates gene NQO1. Compound Dibutyl tin dichloride upregulates gene UGT1A6. Compound Dibutyl tin dichloride upregulates gene HMOX1. Compound Dibutyl tin dichloride downregulates gene MMP1. Compound Dibutyl tin dichloride downregulates gene PLAT. Compound Dibutyl tin dichloride downregulates gene CEACAM6. Compound Dibutyl tin dichloride upregulates gene LINC00520. Compound Dibutyl tin dichloride upregulates gene FTL. Compound Dibutyl tin dichloride upregulates gene AKR1C2. Compound Dibutyl tin dichloride upregulates gene IL7R. Compound Dibutyl tin dichloride upregulates gene UGT1A8. Compound Dibutyl tin dichloride upregulates gene AKR1B10. Compound Dibutyl tin dichloride upregulates gene ALDH3A2. Compound Dibutyl tin dichloride upregulates gene AFP. Compound Dibutyl tin dichloride upregulates gene GPAT3. Compound Dibutyl tin dichloride upregulates gene EDNRA. Compound Dibutyl tin dichloride upregulates gene INA. Compound Dibutyl tin dichloride upregulates gene UGT1A6. Compound Dibutyl tin dichloride upregulates gene ITGA11. Compound Dibutyl tin dichloride upregulates gene TRIM16L. Compound Dibutyl tin dichloride upregulates gene NCR3LG1. Compound Dibutyl tin dichloride upregulates gene PKIB. Compound Dibutyl tin dichloride upregulates gene GCLM. Compound Dibutyl tin dichloride upregulates gene NMRAL2P. Compound Dibutyl tin dichloride upregulates gene SNHG8. Compound Dibutyl tin dichloride upregulates gene SRXN1. Compound Dibutyl tin dichloride upregulates gene SQSTM1. Compound Dibutyl tin dichloride upregulates gene DDIT3. Compound Dibutyl tin dichloride upregulates gene ABCC2. Compound Dibutyl tin dichloride upregulates gene KLRC2. Compound Dibutyl tin dichloride upregulates gene RGCC. Compound Dibutyl tin dichloride upregulates gene PPM1E. Compound Dibutyl tin dichloride upregulates gene KCNQ3. Compound Dibutyl tin dichloride upregulates gene SRPX. Compound Dibutyl tin dichloride upregulates gene EEF1A2. Compound Dibutyl tin dichloride upregulates gene IL13RA2. Compound Dibutyl tin dichloride upregulates gene TXNRD1. Compound Dibutyl tin dichloride upregulates gene NQO1. Compound Dibutyl tin dichloride upregulates gene ATF5. Compound Dibutyl tin dichloride upregulates gene ANGPTL4. Compound Dibutyl tin dichloride upregulates gene CRYAB. Compound Dibutyl tin dichloride upregulates gene MLLT11. Compound Dibutyl tin dichloride upregulates gene ASB5. Compound Dibutyl tin dichloride upregulates gene IFRD1. Compound Dibutyl tin dichloride upregulates gene OSGIN1. Compound Dibutyl tin dichloride upregulates gene SLCO1B1. Compound Dibutyl tin dichloride upregulates gene PEG10. Compound Dibutyl tin dichloride upregulates gene UGT1A10. Compound Dibutyl tin dichloride upregulates gene SLC7A11. Compound Dibutyl tin dichloride upregulates gene GADD45G. Compound Dibutyl tin dichloride upregulates gene AKR1C3. Compound Dibutyl tin dichloride upregulates gene HMOX1. Compound Dibutyl tin dichloride upregulates gene STC2. Compound Dibutyl tin dichloride upregulates gene GRWD1. Compound Dibutyl tin dichloride downregulates gene ATAD2. Compound Dibutyl tin dichloride downregulates gene FAM72C. Compound Dibutyl tin dichloride downregulates gene CYP3A5. Compound Dibutyl tin dichloride downregulates gene CYP2D6. Compound Dibutyl tin dichloride downregulates gene LIG1. Compound Dibutyl tin dichloride downregulates gene LIX1. Compound Dibutyl tin dichloride downregulates gene HLA-DMB. Compound Dibutyl tin dichloride downregulates gene TRIM22. Compound Dibutyl tin dichloride downregulates gene STIL. Compound Dibutyl tin dichloride downregulates gene TERT. Compound Dibutyl tin dichloride downregulates gene LRP1. Compound Dibutyl tin dichloride downregulates gene TPX2. Compound Dibutyl tin dichloride downregulates gene CCNB2. Compound Dibutyl tin dichloride downregulates gene KRT17. Compound Dibutyl tin dichloride downregulates gene MYL12A. Compound Dibutyl tin dichloride downregulates gene TCEA2. Compound Dibutyl tin dichloride downregulates gene RNASE4. Compound Dibutyl tin dichloride downregulates gene SHCBP1. Compound Dibutyl tin dichloride downregulates gene SPAG5. Compound Dibutyl tin dichloride downregulates gene CCNE2. Compound Dibutyl tin dichloride downregulates gene TTK. Compound Dibutyl tin dichloride downregulates gene H3C10. Compound Dibutyl tin dichloride downregulates gene H2BC13. Compound Dibutyl tin dichloride downregulates gene CENPF. Compound Dibutyl tin dichloride downregulates gene ANLN. Compound Dibutyl tin dichloride downregulates gene CYP2E1. Compound Dibutyl tin dichloride downregulates gene NEK2. Compound Dibutyl tin dichloride downregulates gene CDCA8. Compound Dibutyl tin dichloride downregulates gene EGFL6. Compound Dibutyl tin dichloride downregulates gene KIF15. Compound Dibutyl tin dichloride downregulates gene H2BC3. Compound Dibutyl tin dichloride downregulates gene LMNB1. Compound Dibutyl tin dichloride downregulates gene FIBIN. Compound Dibutyl tin dichloride downregulates gene EGR1. Compound Dibutyl tin dichloride downregulates gene DDIAS. Compound Dibutyl tin dichloride downregulates gene TOP2A. Compound Dibutyl tin dichloride downregulates gene KCNJ8. Compound Dibutyl tin dichloride downregulates gene SERPINB3. Compound Dibutyl tin dichloride downregulates gene KIF18A. Compound Dibutyl tin dichloride downregulates gene HELLS. Compound Dibutyl tin dichloride downregulates gene FAM183A. Compound Dibutyl tin dichloride downregulates gene NFATC4. Compound Dibutyl tin dichloride downregulates gene C15orf48. Compound Dibutyl tin dichloride downregulates gene KIF14. Compound Dibutyl tin dichloride downregulates gene AURKA. Compound Dibutyl tin dichloride downregulates gene PBK. Compound Dibutyl tin dichloride downregulates gene PLK1. Compound Dibutyl tin dichloride downregulates gene IFI44. Compound Dibutyl tin dichloride downregulates gene ORC1. Compound Dibutyl tin dichloride downregulates gene IFI44L. Compound Dibutyl tin dichloride downregulates gene CIT. Compound Dibutyl tin dichloride downregulates gene NCAPH. Compound Dibutyl tin dichloride downregulates gene CDCA3. Compound Dibutyl tin dichloride downregulates gene FAM72A. Compound Dibutyl tin dichloride downregulates gene NFKBIA. Compound Dibutyl tin dichloride downregulates gene KIF23. Compound Dibutyl tin dichloride downregulates gene DLGAP5. Compound Dibutyl tin dichloride downregulates gene EDN1. Compound Dibutyl tin dichloride downregulates gene RRM2. Compound Dibutyl tin dichloride downregulates gene CCNA2. Compound Dibutyl tin dichloride downregulates gene CDH5. Compound Dibutyl tin dichloride downregulates gene CENPE. Compound Dibutyl tin dichloride downregulates gene ASF1B. Compound Dibutyl tin dichloride downregulates gene CDC45. Compound Dibutyl tin dichloride downregulates gene PTGFR. Compound Dibutyl tin dichloride downregulates gene TXNIP. Compound Dibutyl tin dichloride downregulates gene BTN3A3. Compound Dibutyl tin dichloride downregulates gene BRIP1. Compound Dibutyl tin dichloride downregulates gene MELK. Compound Dibutyl tin dichloride downregulates gene KIF20A. Compound Dibutyl tin dichloride downregulates gene STMN1. Compound Dibutyl tin dichloride downregulates gene PLAT. Compound Dibutyl tin dichloride downregulates gene RAD51AP1. Compound Dibutyl tin dichloride downregulates gene PAIP1. Compound Dibutyl tin dichloride downregulates gene TNFSF10. Compound Dibutyl tin dichloride downregulates gene TCF19. Compound Dibutyl tin dichloride downregulates gene ALDH7A1. Compound Dibutyl tin dichloride downregulates gene ANKRD36B. Compound Dibutyl tin dichloride downregulates gene CASP1. Compound Dibutyl tin dichloride downregulates gene CEACAM6. Compound Dibutyl tin dichloride downregulates gene CLDN2. Compound Dibutyl tin dichloride downregulates gene USP1. Compound Dibutyl tin dichloride downregulates gene NUF2. Compound Dibutyl tin dichloride downregulates gene IL19. Compound Dibutyl tin dichloride downregulates gene CCL2. Compound Dibutyl tin dichloride downregulates gene MKI67. Compound Dibutyl tin dichloride downregulates gene UBE2T. Compound Dibutyl tin dichloride downregulates gene PHGDH. Compound Dibutyl tin dichloride downregulates gene UBE2C. Compound Dibutyl tin dichloride downregulates gene AHRR. Compound Dibutyl tin dichloride downregulates gene MYBL1. Compound Dibutyl tin dichloride downregulates gene EXO1. Compound Dibutyl tin dichloride downregulates gene H3C3. Compound Dibutyl tin dichloride downregulates gene ANXA8L1. Compound Dibutyl tin dichloride downregulates gene COL16A1. Compound Dibutyl tin dichloride downregulates gene VAV3. Compound Dibutyl tin dichloride downregulates gene NCAPG. Compound Dibutyl tin dichloride downregulates gene H2BC7. Compound Dibutyl tin dichloride downregulates gene CXCL3. Compound Dibutyl tin dichloride downregulates gene SGO2. Compound Dibutyl tin dichloride downregulates gene E2F8. Compound Dibutyl tin dichloride downregulates gene KIF18B. Compound Dibutyl tin dichloride downregulates gene NUSAP1. Compound Dibutyl tin dichloride downregulates gene PCNA. Compound Dibutyl tin dichloride downregulates gene BMF. Compound Dibutyl tin dichloride downregulates gene KNL1. Compound Dibutyl tin dichloride downregulates gene MCM10. Compound Dibutyl tin dichloride downregulates gene CDC20. Compound Dibutyl tin dichloride downregulates gene CCNB1. Compound Dibutyl tin dichloride downregulates gene ESPL1. Compound Dibutyl tin dichloride downregulates gene CCL20. Compound Dibutyl tin dichloride downregulates gene CTTNBP2. Compound Dibutyl tin dichloride downregulates gene CYP1B1. Compound Dibutyl tin dichloride downregulates gene RACGAP1. Compound Dibutyl tin dichloride downregulates gene SKA1. Compound Dibutyl tin dichloride downregulates gene CEP55. Compound Dibutyl tin dichloride downregulates gene H3C2. Compound Dibutyl tin dichloride downregulates gene CDK1. Compound Dibutyl tin dichloride downregulates gene CXCL5. Compound Dibutyl tin dichloride downregulates gene TMC5. Compound Dibutyl tin dichloride downregulates gene DTL. Compound Dibutyl tin dichloride downregulates gene KIF11. Compound Dibutyl tin dichloride downregulates gene TNFAIP2. Compound Dibutyl tin dichloride downregulates gene BUB1B. Compound Dibutyl tin dichloride downregulates gene PRC1. Compound Dibutyl tin dichloride downregulates gene IFIT1. Compound Dibutyl tin dichloride downregulates gene ARHGAP45. Compound Dibutyl tin dichloride downregulates gene ZNF185. Compound Dibutyl tin dichloride downregulates gene HMMR. Compound Dibutyl tin dichloride downregulates gene KIF2C. Compound Dibutyl tin dichloride downregulates gene LTB. Compound Dibutyl tin dichloride downregulates gene CCNF. Compound Dibutyl tin dichloride downregulates gene DEFB1. Compound Dibutyl tin dichloride downregulates gene DEPDC1. Compound Dibutyl tin dichloride downregulates gene SPC25. Compound Dibutyl tin dichloride downregulates gene LAPTM5. Compound Dibutyl tin dichloride upregulates gene ANKRD36B. Compound Dibutyl tin dichloride downregulates gene KRT4. Compound Dibutyl tin dichloride upregulates gene CA9. Compound Dibutyl tin dichloride upregulates gene PHLDA2. Compound Dibutyl tin dichloride upregulates gene TPI1. Compound Dibutyl tin dichloride upregulates gene ZNF469. Compound Dibutyl tin dichloride upregulates gene ABCA1. Compound Dibutyl tin dichloride upregulates gene HDAC9. Compound Dibutyl tin dichloride upregulates gene SLC22A1. Compound Dibutyl tin dichloride upregulates gene GPAT3. Compound Dibutyl tin dichloride upregulates gene ZNF114. Compound Dibutyl tin dichloride upregulates gene ANKRD36B. Compound Dibutyl tin dichloride upregulates gene EGF. Compound Dibutyl tin dichloride upregulates gene TRIM16L. Compound Dibutyl tin dichloride upregulates gene NMRAL2P. Compound Dibutyl tin dichloride upregulates gene PLIN2. Compound Dibutyl tin dichloride upregulates gene UGT1A3. Compound Dibutyl tin dichloride upregulates gene ASTN2. Compound Dibutyl tin dichloride upregulates gene STC1. Compound Dibutyl tin dichloride upregulates gene GDF15. Compound Dibutyl tin dichloride upregulates gene PDGFB. Compound Dibutyl tin dichloride upregulates gene IGFBP3. Compound Dibutyl tin dichloride upregulates gene SULF1. Compound Dibutyl tin dichloride upregulates gene GLI1. Compound Dibutyl tin dichloride upregulates gene UCHL1. Compound Dibutyl tin dichloride upregulates gene SOCS1. Compound Dibutyl tin dichloride upregulates gene MMP1. Compound Dibutyl tin dichloride upregulates gene KCNQ3. Compound Dibutyl tin dichloride upregulates gene ANKRD20A17P. Compound Dibutyl tin dichloride upregulates gene LINC02806. Compound Dibutyl tin dichloride upregulates gene LY96. Compound Dibutyl tin dichloride upregulates gene GPX2. Compound Dibutyl tin dichloride upregulates gene CHN1. Compound Dibutyl tin dichloride upregulates gene TNFRSF9. Compound Dibutyl tin dichloride upregulates gene LAMP3. Compound Dibutyl tin dichloride upregulates gene IL13RA2. Compound Dibutyl tin dichloride upregulates gene CSF2. Compound Dibutyl tin dichloride upregulates gene TXNRD1. Compound Dibutyl tin dichloride upregulates gene SGK2. Compound Dibutyl tin dichloride upregulates gene TRAF1. Compound Dibutyl tin dichloride upregulates gene F2RL2. Compound Dibutyl tin dichloride upregulates gene POPDC3. Compound Dibutyl tin dichloride upregulates gene POU5F2. Compound Dibutyl tin dichloride upregulates gene TREM1. Compound Dibutyl tin dichloride upregulates gene SLC7A11. Compound Dibutyl tin dichloride upregulates gene HMOX1. Compound Dibutyl tin dichloride downregulates gene CCNE2. Compound Dibutyl tin dichloride downregulates gene KRT4. Compound Dibutyl tin dichloride downregulates gene ZNF367. Compound Dibutyl tin dichloride downregulates gene CCL2. Compound Dibutyl tin dichloride downregulates gene MCM10. Compound Dibutyl tin dichloride downregulates gene IFIT1. Compound Dibutyl tin dichloride downregulates gene SERPINB4. Compound Dibutyl tin dichloride downregulates gene BDH1. Compound Dibutyl tin dichloride downregulates gene FEN1. Compound Dibutyl tin dichloride downregulates gene STEAP4. Compound Dibutyl tin dichloride downregulates gene CXCL14. Compound Dibutyl tin dichloride downregulates gene CDCA7. Compound Dibutyl tin dichloride downregulates gene CAVIN2. Compound Dibutyl tin dichloride upregulates gene ADAM12. Compound Dibutyl tin dichloride upregulates gene SLC44A4. Compound Dibutyl tin dichloride upregulates gene HDAC9. Compound Dibutyl tin dichloride upregulates gene INA. Compound Dibutyl tin dichloride upregulates gene LCAL1. Compound Dibutyl tin dichloride upregulates gene EGLN3. Compound Dibutyl tin dichloride upregulates gene SEMA6A. Compound Dibutyl tin dichloride upregulates gene NMRAL2P. Compound Dibutyl tin dichloride upregulates gene IGFBP3. Compound Dibutyl tin dichloride upregulates gene SOCS1. Compound Dibutyl tin dichloride upregulates gene ITGB3. Compound Dibutyl tin dichloride upregulates gene TNFRSF9. Compound Dibutyl tin dichloride upregulates gene ADM. Compound Dibutyl tin dichloride upregulates gene CSF2. Compound Dibutyl tin dichloride upregulates gene SGK2. Compound Dibutyl tin dichloride upregulates gene POPDC3. Compound Dibutyl tin dichloride upregulates gene POU5F2. Compound Dibutyl tin dichloride upregulates gene WFDC2. Compound Dibutyl tin dichloride upregulates gene TNFSF13B. Compound Dibutyl tin dichloride upregulates gene HMOX1. Compound Dibutyl tin dichloride upregulates gene CA9. Compound Dibutyl tin dichloride upregulates gene IL6. Compound Dibutyl tin dichloride upregulates gene ADAM8. Compound Dibutyl tin dichloride upregulates gene FTL. Compound Dibutyl tin dichloride upregulates gene LCP1. Compound Dibutyl tin dichloride upregulates gene C15orf48. Compound Dibutyl tin dichloride upregulates gene ALDH8A1. Compound Dibutyl tin dichloride upregulates gene IL23A. Compound Dibutyl tin dichloride upregulates gene PDGFB. Compound Dibutyl tin dichloride upregulates gene HCAR3. Compound Dibutyl tin dichloride upregulates gene ANKRD20A17P. Compound Dibutyl tin dichloride upregulates gene GPX2. Compound Dibutyl tin dichloride upregulates gene MAP2. Compound Dibutyl tin dichloride upregulates gene ABCC3. Compound Dibutyl tin dichloride upregulates gene IL13RA2. Compound Dibutyl tin dichloride upregulates gene PMAIP1. Compound Dibutyl tin dichloride upregulates gene TRAF1. Compound Dibutyl tin dichloride upregulates gene CRYAB. Compound Dibutyl tin dichloride upregulates gene DDIT4. Compound Dibutyl tin dichloride upregulates gene ACADVL. Compound Dibutyl tin dichloride upregulates gene LPIN3. Compound Dibutyl tin dichloride upregulates gene IL7R. Compound Dibutyl tin dichloride upregulates gene MINDY1. Compound Dibutyl tin dichloride upregulates gene EGF. Compound Dibutyl tin dichloride upregulates gene TRIM16L. Compound Dibutyl tin dichloride upregulates gene SQSTM1. Compound Dibutyl tin dichloride upregulates gene ISG20. Compound Dibutyl tin dichloride upregulates gene NRCAM. Compound Dibutyl tin dichloride upregulates gene STC1. Compound Dibutyl tin dichloride upregulates gene KCNQ3. Compound Dibutyl tin dichloride upregulates gene DMTN. Compound Dibutyl tin dichloride upregulates gene POU5F1. Compound Dibutyl tin dichloride upregulates gene LY96. Compound Dibutyl tin dichloride upregulates gene INPP4B. Compound Dibutyl tin dichloride upregulates gene GBP5. Compound Dibutyl tin dichloride upregulates gene RGPD3. Compound Dibutyl tin dichloride upregulates gene TXNRD1. Compound Dibutyl tin dichloride upregulates gene PPP1R15A. Compound Dibutyl tin dichloride upregulates gene SMIM22. Compound Dibutyl tin dichloride upregulates gene CLU. Compound Dibutyl tin dichloride upregulates gene TREM1. Compound Dibutyl tin dichloride upregulates gene KCNK1. Compound Dibutyl tin dichloride upregulates gene LINC00520. Compound Dibutyl tin dichloride upregulates gene AGR2. Compound Dibutyl tin dichloride upregulates gene NANOG. Compound Dibutyl tin dichloride upregulates gene PHLDA2. Compound Dibutyl tin dichloride upregulates gene NCF2. Compound Dibutyl tin dichloride upregulates gene TPI1. Compound Dibutyl tin dichloride upregulates gene ZNF469. Compound Dibutyl tin dichloride upregulates gene FTH1. Compound Dibutyl tin dichloride upregulates gene SLC22A1. Compound Dibutyl tin dichloride upregulates gene GPAT3. Compound Dibutyl tin dichloride upregulates gene CXCL8. Compound Dibutyl tin dichloride upregulates gene PLIN2. Compound Dibutyl tin dichloride upregulates gene TNFAIP2. Compound Dibutyl tin dichloride upregulates gene PPP1R13B. Compound Dibutyl tin dichloride upregulates gene ABCC2. Compound Dibutyl tin dichloride upregulates gene UCHL1. Compound Dibutyl tin dichloride upregulates gene SLIT2. Compound Dibutyl tin dichloride upregulates gene MMP1. Compound Dibutyl tin dichloride upregulates gene ST3GAL1. Compound Dibutyl tin dichloride upregulates gene CDH2. Compound Dibutyl tin dichloride upregulates gene F2RL2. Compound Dibutyl tin dichloride upregulates gene ENO2. Compound Dibutyl tin dichloride upregulates gene DENND3. Compound Dibutyl tin dichloride downregulates gene APLN. Compound Dibutyl tin dichloride downregulates gene NEFL. Compound Dibutyl tin dichloride downregulates gene SERPINB4. Compound Dibutyl tin dichloride downregulates gene TMEM97. Compound Dibutyl tin dichloride downregulates gene CYP1B1. Compound Dibutyl tin dichloride downregulates gene ATP12A. Compound Dibutyl tin dichloride downregulates gene KRT4. Compound Dibutyl tin dichloride downregulates gene CCL2. Compound Dibutyl tin dichloride downregulates gene H2AC11. Compound Dibutyl tin dichloride downregulates gene CYP24A1. Compound Dibutyl tin dichloride downregulates gene IFIT1. Compound Dibutyl tin dichloride downregulates gene MSMO1. Compound Dibutyl tin dichloride downregulates gene CXCL14. Compound Dibutyl tin dichloride downregulates gene ASNS. Compound Dibutyl tin dichloride downregulates gene S100A8. Compound Dibutyl tin dichloride downregulates gene SMIM19. Compound Dibutyl tin dichloride downregulates gene ZNF367. Compound Dibutyl tin dichloride downregulates gene HMGCS1. Compound Dibutyl tin dichloride downregulates gene CXCL11. Compound Dibutyl tin dichloride downregulates gene SERPINB3. Compound Dibutyl tin dichloride upregulates gene IGHV3-23. Compound Dibutyl tin dichloride downregulates gene KRT6A. Compound Dibutyl tin dichloride downregulates gene KRT14. Compound Dibutyl tin dichloride downregulates gene KRT17. Compound Dibutyl tin dichloride downregulates gene KRT5. Compound Dibutyl tin dichloride upregulates gene ABL1. Compound Dibutyl tin dichloride upregulates gene TPRKB. Compound Dibutyl tin dichloride upregulates gene IFIT1. Compound Dibutyl tin dichloride upregulates gene S100A4. Compound Dibutyl tin dichloride upregulates gene IFI44. Compound Dibutyl tin dichloride upregulates gene IL36B. Compound Dibutyl tin dichloride upregulates gene PLK3. Compound Dibutyl tin dichloride upregulates gene H2BC21. Compound Dibutyl tin dichloride downregulates gene IGHV3-23. Compound Dibutyl tin dichloride downregulates gene S100A2. Compound Dibutyl tin dichloride downregulates gene KRT14. Compound Dibutyl tin dichloride downregulates gene KRT5. Compound Dibutyl tin dichloride downregulates gene TLCD3A. Compound Dibutyl tin dichloride downregulates gene KRT6A. Compound Dibutyl tin dichloride downregulates gene GJB1. Compound Dibutyl tin dichloride upregulates gene IGF1R. Compound Dibutyl tin dichloride upregulates gene MGC70870. Compound Dibutyl tin dichloride upregulates gene PAX8. Compound Dibutyl tin dichloride upregulates gene HDAC9. Compound Dibutyl tin dichloride upregulates gene RELN. Compound Dibutyl tin dichloride upregulates gene CYP19A1. Compound Dibutyl tin dichloride '" + ] + }, + "execution_count": 59, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "context_str[:45500]" + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "71\n", + "(rdflib.term.Literal('WHIVNJATOVLWBW-SNAWJCMRSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Butanone_oxime'))\n", + "(rdflib.term.Literal('YMLFYGFCXGNERH-UHFFFAOYSA-K', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Butyl_tin_trichloride'))\n", + "(rdflib.term.Literal('RJGHQTVXGKYATR-UHFFFAOYSA-L', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Dibutyl_tin_dichloride'))\n", + "(rdflib.term.Literal('PDQAZBWRQCGBEV-UHFFFAOYSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Imidazolidinethione'))\n", + "(rdflib.term.Literal('YHMYGUUIMTVXNW-UHFFFAOYSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Mercapto_benzimidazole'))\n", + "(rdflib.term.Literal('XLSZMDLNRCVEIJ-UHFFFAOYSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Methylimidazole_two'))\n", + "(rdflib.term.Literal('GCTFWCDSFPMHHS-UHFFFAOYSA-M', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Tributyl_tin_chloride'))\n", + "(rdflib.term.Literal('ZAJAQTYSTDTMCU-UHFFFAOYSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Aminobenzenesulfonic_acid'))\n", + "(rdflib.term.Literal('UCMIRNVEIXFBKS-UHFFFAOYSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Aminopropanoic_acid'))\n", + "(rdflib.term.Literal('GZGZVOLBULPDFD-UHFFFAOYSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Amino_nitroanilino_ethanol'))\n", + "(rdflib.term.Literal('RNLHGQLZWXBQNY-UHFFFAOYSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Amino_trimethyl_cyclohexylmethyl_amine'))\n", + "(rdflib.term.Literal('QIGBRXMKCJKVMJ-UHFFFAOYSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Benzenediol'))\n", + "(rdflib.term.Literal('JQVAPEJNIZULEK-UHFFFAOYSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Benzenediol_chloro'))\n", + "(rdflib.term.Literal('SRPWOOOHEPICQU-UHFFFAOYSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Benzenetricarboxylic_anhydride'))\n", + "(rdflib.term.Literal('DMSMPAJRVJJAGA-UHFFFAOYSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Benzisothiazol'))\n", + "(rdflib.term.Literal('YOUGRGFIHBUKRS-UHFFFAOYSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Benzyltrimethylammonium_chloride'))\n", + "(rdflib.term.Literal('WHGYBXFWUBPSRW-VOXAOYDDSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Beta_cyclodextrin'))\n", + "(rdflib.term.Literal('OAYXUHPQHDHDDZ-UHFFFAOYSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Butoxyethoxy_ethanol'))\n", + "(rdflib.term.Literal('JBKVHLHDHHXQEQ-UHFFFAOYSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:caprolactam'))\n", + "(rdflib.term.Literal('PVNIIMVLHYAWGP-UHFFFAOYSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Carboxylpyridine'))\n", + "(rdflib.term.Literal('VXIVSQZSERGHQP-UHFFFAOYSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Chloroacetamide'))\n", + "(rdflib.term.Literal('FOCAUTSVDIKZOP-UHFFFAOYSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Monochloroacetic_acid'))\n", + "(rdflib.term.Literal('PNPCRKVUWYDDST-UHFFFAOYSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Chloro_aniline'))\n", + "(rdflib.term.Literal('CFKMVGJGLGKFKI-UHFFFAOYSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Chloro_methylphenol'))\n", + "(rdflib.term.Literal('ZFXYFBGIUFBOJW-UHFFFAOYSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Dimethyl_tetrahydro_purine_dione'))\n", + "(rdflib.term.Literal('LNTHITQWFMADLM-UHFFFAOYSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Gallic_acid'))\n", + "(rdflib.term.Literal('XXMIOPMDWAUFGU-UHFFFAOYSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Hexanediol'))\n", + "(rdflib.term.Literal('PLIKAWJENQZMHA-UHFFFAOYSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Hydroxy_aminobenzene'))\n", + "(rdflib.term.Literal('LVTYICIALWPMFW-UHFFFAOYSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Propanediamine'))\n", + "(rdflib.term.Literal('OUYCCCASQSFEME-UHFFFAOYSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:L_Tyrosine'))\n", + "(rdflib.term.Literal('XZWYZXLIPXDOLR-UHFFFAOYSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Metformin_hydrochloride'))\n", + "(rdflib.term.Literal('SBGKURINHGJRFN-UHFFFAOYSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Methanesulfinic_acid'))\n", + "(rdflib.term.Literal('YFNKIDBQEZZDLK-UHFFFAOYSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Methoxyethoxy_ethane'))\n", + "(rdflib.term.Literal('JLGLQAWTXXGVEM-UHFFFAOYSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Methoxyethoxy_ethoxy_ethanol'))\n", + "(rdflib.term.Literal('LMYRWZFENFIFIT-UHFFFAOYSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Methylbenzene_sulfonamide'))\n", + "(rdflib.term.Literal('GPNYZBKIGXGYNU-UHFFFAOYSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Methylenebis_ethyl_tert_butylphenol'))\n", + "(rdflib.term.Literal('BEGLCMHJXHIJLR-UHFFFAOYSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Methyl_isothiazolin_one'))\n", + "(rdflib.term.Literal('YDONNITUKPKTIG-UHFFFAOYSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Nitrilotrimethanediyl_tris_phosphonic_acid'))\n", + "(rdflib.term.Literal('FGVVTMRZYROCTH-UHFFFAOYSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Oxide_pyridinethiol'))\n", + "(rdflib.term.Literal('RUOJZAUFBMNUDX-UHFFFAOYSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Propanediol_carbonate'))\n", + "(rdflib.term.Literal('MAGFQRLKWCCTQJ-UHFFFAOYSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Sodium_vinylbenzenesulphonate'))\n", + "(rdflib.term.Literal('HXJUTPCZVOIRIF-UHFFFAOYSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Sulfolane'))\n", + "(rdflib.term.Literal('MQJKPEGWNLWLTK-UHFFFAOYSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Sulfonylbisbenzenamine'))\n", + "(rdflib.term.Literal('RFKITWRHKUYMRJ-UHFFFAOYSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Tartrazine'))\n", + "(rdflib.term.Literal('HUHGPYXAVBJSJV-UHFFFAOYSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Triazine_triethanol'))\n", + "(rdflib.term.Literal('KLSJWNVTNUYHDU-UHFFFAOYSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Triazol_ylamine'))\n", + "(rdflib.term.Literal('ZIBGPFATKBEMQZ-UHFFFAOYSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Triethylene_glycol'))\n", + "(rdflib.term.Literal('QIVBCDIJIAJPQS-VIFPVBQESA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Tryptophan'))\n", + "(rdflib.term.Literal('AVKUERGKIZMTKX-YKLVJOERSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Ampicillin_Trihydrate'))\n", + "(rdflib.term.Literal('IAOZJIPTCAWIRG-QWRGUYRKSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Aspartame'))\n", + "(rdflib.term.Literal('XNEFYCZVKIDDMS-UHFFFAOYSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Avobenzone'))\n", + "(rdflib.term.Literal('RYYVLZVUVIJVGH-UHFFFAOYSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Caffeine'))\n", + "(rdflib.term.Literal('MMOXZBCLCQITDF-UHFFFAOYSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:DEET'))\n", + "(rdflib.term.Literal('FBPFZTCFMRRESA-IANNHFEVSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:D_Sorbitol'))\n", + "(rdflib.term.Literal('KCXVZYZYPLLWCC-UHFFFAOYSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:EDTA_EGTA'))\n", + "(rdflib.term.Literal('TZBJGXHYKVUXJN-UHFFFAOYSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Genistein'))\n", + "(rdflib.term.Literal('FMJSMJQBSVNSBF-UHFFFAOYSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Octocrylene'))\n", + "(rdflib.term.Literal('BPLBGHOLXOTWMN-MBNYWOFBSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Penicillin_VK'))\n", + "(rdflib.term.Literal('WPYMKLBDIGXBTP-UHFFFAOYSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Sodium_Benzoate'))\n", + "(rdflib.term.Literal('BAQAVOSOZGMPRM-RMEMJPMPSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Sucralose'))\n", + "(rdflib.term.Literal('YAPQBXQYLJRXSA-UHFFFAOYSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Theobromine'))\n", + "(rdflib.term.Literal('IGXZMQCLUNTWCC-UHFFFAOYSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Direct_Red_81'))\n", + "(rdflib.term.Literal('BACYUWVYYTXETD-UHFFFAOYSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Dodecanoyl_methylglycine'))\n", + "(rdflib.term.Literal('IAJNXBNRYMEYAZ-UHFFFAOYSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Ethyl_cyano_diphenylacrylate'))\n", + "(rdflib.term.Literal('DUKPKQFHJQGTGU-UHFFFAOYSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Hexyl_salicylate'))\n", + "(rdflib.term.Literal('WDQFELCEOPFLCZ-UHFFFAOYSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Hydroxyethyl_pyrrolidinone'))\n", + "(rdflib.term.Literal('ZMSQJSMSLXVTKN-UHFFFAOYSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Oxydiethylene_bis_morpholine'))\n", + "(rdflib.term.Literal('XQVWYOYUZDUNRW-UHFFFAOYSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Phenyl_naphthylamine'))\n", + "(rdflib.term.Literal('CVHZOJJKTDOEJC-UHFFFAOYSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Saccharin'))\n", + "(rdflib.term.Literal('UZFMOKQJFYMBGY-UHFFFAOYSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:TEMPO'))\n", + "(rdflib.term.Literal('DZLFLBLQUQXARW-UHFFFAOYSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Tetrabutylammonium_bromide'))\n" + ] + } + ], + "source": [ + "q = \"\"\"\n", + "PREFIX sio: \n", + "PREFIX cheminf: \n", + "\n", + "SELECT ?inchikey ?compound\n", + "WHERE {\n", + " ?p rdf:type cheminf:CHEMINF_000399 .\n", + " ?p sio:SIO_000300 ?inchikey .\n", + " ?p sio:SIO_000011 ?compound .\n", + " \n", + "}\n", + "\"\"\"\n", + "\n", + "\n", + "results = g.query(q)\n", + "print(len(results))\n", + "\n", + "for r in results:\n", + " print(str(r))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "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.9.19" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/stages/playground.ipynb b/stages/playground.ipynb new file mode 100644 index 0000000..6009d3a --- /dev/null +++ b/stages/playground.ipynb @@ -0,0 +1,372 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Defaulting to user installation because normal site-packages is not writeable\n", + "Requirement already satisfied: rdflib in /home/vscode/.local/lib/python3.9/site-packages (7.0.0)\n", + "Requirement already satisfied: isodate<0.7.0,>=0.6.0 in /home/vscode/.local/lib/python3.9/site-packages (from rdflib) (0.6.1)\n", + "Requirement already satisfied: pyparsing<4,>=2.1.0 in /home/vscode/.local/lib/python3.9/site-packages (from rdflib) (3.1.4)\n", + "Requirement already satisfied: six in /home/vscode/.local/lib/python3.9/site-packages (from isodate<0.7.0,>=0.6.0->rdflib) (1.16.0)\n", + "\n", + "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m A new release of pip is available: \u001b[0m\u001b[31;49m23.0.1\u001b[0m\u001b[39;49m -> \u001b[0m\u001b[32;49m24.2\u001b[0m\n", + "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m To update, run: \u001b[0m\u001b[32;49mpip install --upgrade pip\u001b[0m\n", + "Defaulting to user installation because normal site-packages is not writeable\n", + "Requirement already satisfied: rdflib-hdt in /home/vscode/.local/lib/python3.9/site-packages (3.1)\n", + "Requirement already satisfied: rdflib>=4.2 in /home/vscode/.local/lib/python3.9/site-packages (from rdflib-hdt) (7.0.0)\n", + "Requirement already satisfied: pybind11>=2.2.4 in /home/vscode/.local/lib/python3.9/site-packages (from rdflib-hdt) (2.13.6)\n", + "Requirement already satisfied: pyparsing<4,>=2.1.0 in /home/vscode/.local/lib/python3.9/site-packages (from rdflib>=4.2->rdflib-hdt) (3.1.4)\n", + "Requirement already satisfied: isodate<0.7.0,>=0.6.0 in /home/vscode/.local/lib/python3.9/site-packages (from rdflib>=4.2->rdflib-hdt) (0.6.1)\n", + "Requirement already satisfied: six in /home/vscode/.local/lib/python3.9/site-packages (from isodate<0.7.0,>=0.6.0->rdflib>=4.2->rdflib-hdt) (1.16.0)\n", + "\n", + "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m A new release of pip is available: \u001b[0m\u001b[31;49m23.0.1\u001b[0m\u001b[39;49m -> \u001b[0m\u001b[32;49m24.2\u001b[0m\n", + "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m To update, run: \u001b[0m\u001b[32;49mpip install --upgrade pip\u001b[0m\n" + ] + } + ], + "source": [ + "!pip install rdflib\n", + "!pip install rdflib-hdt" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import biobricks as bb\n", + "from rdflib import Graph, Namespace\n", + "from rdflib.plugins.stores import sparqlstore\n", + "from rdflib_hdt import HDTStore\n", + "import rdflib" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "# Recipe: anytime crepes\n", + "# Ingredients: egg, milk, whole wheat flour" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "rdflib.term.URIRef('https://www.food.com/recipe/327539')" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# vocabularies:\n", + "# http://purl.org/heals/food/ --> Recipe\n", + "# http://purl.org/heals/ingredient -> ChickenEgg, CowMilk, WholeWheatFlour\n", + "\n", + "# First node in the graph represents recipe\n", + "# URI za recept\n", + "g = rdflib.Graph()\n", + "uri = \"https://www.food.com/recipe/327539\"\n", + "s = rdflib.URIRef(uri)\n", + "s" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "rdflib.term.URIRef('http://www.w3.org/1999/02/22-rdf-syntax-ns#type')" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from rdflib.namespace import RDF\n", + "\n", + "# Second node in the graph represents type\n", + "p = RDF.type\n", + "p" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "nm = g.namespace_manager\n", + "\n", + "uri = \"http://purl.org/heals/food/\"\n", + "ns_wtm = rdflib.Namespace(uri)\n", + "prefix = \"wtm\"\n", + "nm.bind(prefix, ns_wtm)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "g.namespaces()" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "rdflib.term.URIRef('http://purl.org/heals/food/Recipe')" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "o = ns_wtm.Recipe\n", + "o" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "rdflib.term.URIRef('https://www.food.com/recipe/327539')" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "s" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "rdflib.term.URIRef('http://www.w3.org/1999/02/22-rdf-syntax-ns#type')" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "p" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + ")>" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "g.add((s,p,o))" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "p = ns_wtm.hasCookTime" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "from rdflib.namespace import XSD" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [], + "source": [ + "o = rdflib.Literal(\"8\", datatype=XSD.integer)" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + ")>" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "g.add((s, p, o))" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [], + "source": [ + "# Graf je v obliki tripletov (subject, predicate, object)\n", + "# Vsak node je potrebno definirati z utreznim vocabularyjem\n", + "\n", + "# subject | predicate | object\n", + "# recept id 472398 | tip (namespace RDF) | recept (namespace wtm = http://purl.org/heals/food/)\n", + "# recept id 472398 | hasCookTime (namespace wtm) | 8 (namespace XSD)\n", + "# recept id 472398 | hasIngredient (namespace wtm) | egg (namespace ind = http://purl.org/heals/ingredient/)\n", + "# recept id 472398 | hasIngredient (namespace wtm) | milk (namespace ind = http://purl.org/heals/ingredient/)\n", + "# recept id 472398 | hasIngredient (namespace wtm) | flour (namespace ind = http://purl.org/heals/ingredient/)" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "https://www.food.com/recipe/327539 http://www.w3.org/1999/02/22-rdf-syntax-ns#type http://purl.org/heals/food/Recipex\n", + "https://www.food.com/recipe/327539 http://purl.org/heals/food/hasCookTime 8\n" + ] + } + ], + "source": [ + "for s, p, o in g:\n", + " print(s, p, o)" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "@prefix wtm: .\n", + "@prefix xsd: .\n", + "\n", + " a wtm:Recipex ;\n", + " wtm:hasCookTime 8 .\n", + "\n", + "\n" + ] + } + ], + "source": [ + "ttl = g.serialize(format=\"ttl\")\n", + "print(ttl)" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [], + "source": [ + "# Compound name \"ABC\"\n", + "# Compound deregulates gene\n", + "# Gene name \"XYZ\"\n", + "# Gene isPartOf pathway\n", + "# Pathway" + ] + } + ], + "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.9.19" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} From a768bea629f8c428948d2d9b7e100484b1c887ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Toma=C5=BE=20Mohori=C4=8D?= Date: Mon, 16 Dec 2024 23:40:08 +0000 Subject: [PATCH 3/3] Pubchem RDF structure --- stages/eutr-rdf-first-try.ipynb | 452 +++++++++++++++++++------------- 1 file changed, 266 insertions(+), 186 deletions(-) diff --git a/stages/eutr-rdf-first-try.ipynb b/stages/eutr-rdf-first-try.ipynb index fb146a3..fd52a48 100644 --- a/stages/eutr-rdf-first-try.ipynb +++ b/stages/eutr-rdf-first-try.ipynb @@ -2,28 +2,37 @@ "cells": [ { "cell_type": "code", - "execution_count": 38, + "execution_count": 2, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'1.1.3'" - ] - }, - "execution_count": 38, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ - "import gseapy\n", - "gseapy.__version__" + "# Knowledge-graph of EU-ToxRisk TempOSeq data\n", + "\n", + "# KG for summary data (i.e. concentration independent data)\n", + "# Since we have uploaded processed temposeq data and not the summary data,\n", + "# we first have to convert it to sort of summary data. This means that we will\n", + "# consider only genes with a significant fold change (quick filter based on logFC and p-adj).\n", + "# In any case summary data would be reported only significantly expressed probes.\n", + "\n", + "# We aim to use the KG structure of biobricks-OKG (https://github.com/biobricks-ai/biobricks-okg?tab=readme-ov-file)\n", + "# Additionally, we add connections between the genes and pathways in the same fashion as Pubchem RDF (https://pubchem.ncbi.nlm.nih.gov/docs/rdf-intro#section=PubChemRDF-Graphs)\n", + "\n", + "# Summary of EUTR-OKG\n", + "# (study):\n", + "# - has_measure_group \n", + "# :\n", + "# - has_participant \n", + "# - has_specified_output \n", + "# < endpoint>:\n", + "# - \n", + "# - has unit \n", + "# compound participates_in measure_group\n", + "# compound has_identifier CAS/InChI" ] }, { "cell_type": "code", - "execution_count": 39, + "execution_count": 3, "metadata": {}, "outputs": [ { @@ -32,21 +41,21 @@ "text": [ "Defaulting to user installation because normal site-packages is not writeable\n", "Requirement already satisfied: rdflib in /home/vscode/.local/lib/python3.9/site-packages (7.0.0)\n", - "Requirement already satisfied: pyparsing<4,>=2.1.0 in /home/vscode/.local/lib/python3.9/site-packages (from rdflib) (3.1.4)\n", "Requirement already satisfied: isodate<0.7.0,>=0.6.0 in /home/vscode/.local/lib/python3.9/site-packages (from rdflib) (0.6.1)\n", + "Requirement already satisfied: pyparsing<4,>=2.1.0 in /home/vscode/.local/lib/python3.9/site-packages (from rdflib) (3.1.4)\n", "Requirement already satisfied: six in /home/vscode/.local/lib/python3.9/site-packages (from isodate<0.7.0,>=0.6.0->rdflib) (1.16.0)\n", "\n", - "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m A new release of pip is available: \u001b[0m\u001b[31;49m23.0.1\u001b[0m\u001b[39;49m -> \u001b[0m\u001b[32;49m24.2\u001b[0m\n", + "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m A new release of pip is available: \u001b[0m\u001b[31;49m23.0.1\u001b[0m\u001b[39;49m -> \u001b[0m\u001b[32;49m24.3.1\u001b[0m\n", "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m To update, run: \u001b[0m\u001b[32;49mpip install --upgrade pip\u001b[0m\n", "Defaulting to user installation because normal site-packages is not writeable\n", "Requirement already satisfied: rdflib-hdt in /home/vscode/.local/lib/python3.9/site-packages (3.1)\n", - "Requirement already satisfied: rdflib>=4.2 in /home/vscode/.local/lib/python3.9/site-packages (from rdflib-hdt) (7.0.0)\n", "Requirement already satisfied: pybind11>=2.2.4 in /home/vscode/.local/lib/python3.9/site-packages (from rdflib-hdt) (2.13.6)\n", + "Requirement already satisfied: rdflib>=4.2 in /home/vscode/.local/lib/python3.9/site-packages (from rdflib-hdt) (7.0.0)\n", "Requirement already satisfied: isodate<0.7.0,>=0.6.0 in /home/vscode/.local/lib/python3.9/site-packages (from rdflib>=4.2->rdflib-hdt) (0.6.1)\n", "Requirement already satisfied: pyparsing<4,>=2.1.0 in /home/vscode/.local/lib/python3.9/site-packages (from rdflib>=4.2->rdflib-hdt) (3.1.4)\n", "Requirement already satisfied: six in /home/vscode/.local/lib/python3.9/site-packages (from isodate<0.7.0,>=0.6.0->rdflib>=4.2->rdflib-hdt) (1.16.0)\n", "\n", - "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m A new release of pip is available: \u001b[0m\u001b[31;49m23.0.1\u001b[0m\u001b[39;49m -> \u001b[0m\u001b[32;49m24.2\u001b[0m\n", + "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m A new release of pip is available: \u001b[0m\u001b[31;49m23.0.1\u001b[0m\u001b[39;49m -> \u001b[0m\u001b[32;49m24.3.1\u001b[0m\n", "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m To update, run: \u001b[0m\u001b[32;49mpip install --upgrade pip\u001b[0m\n" ] } @@ -60,7 +69,7 @@ }, { "cell_type": "code", - "execution_count": 40, + "execution_count": 4, "metadata": {}, "outputs": [], "source": [ @@ -76,7 +85,7 @@ }, { "cell_type": "code", - "execution_count": 41, + "execution_count": 5, "metadata": {}, "outputs": [ { @@ -96,7 +105,7 @@ " dtype='object')" ] }, - "execution_count": 41, + "execution_count": 5, "metadata": {}, "output_type": "execute_result" } @@ -104,12 +113,16 @@ "source": [ "# Connect studies, compounds and temposeq dataset id\n", "df_overview = pd.read_csv(\"../download/overview.csv\")\n", - "df_overview.columns" + "df_overview.columns\n", + "\n", + "# Connect assays and compounds: keep only compounds at the highest concentration with that study\n", + "#compound_to_assay = df_overview[['Treatment compound', 'Study']].drop_duplicates().set_index(\"Treatment compound\")['Study'].to_dict()\n", + "#compound_to_assay" ] }, { "cell_type": "code", - "execution_count": 42, + "execution_count": 6, "metadata": {}, "outputs": [], "source": [ @@ -119,7 +132,7 @@ }, { "cell_type": "code", - "execution_count": 43, + "execution_count": 7, "metadata": {}, "outputs": [], "source": [ @@ -129,7 +142,7 @@ }, { "cell_type": "code", - "execution_count": 44, + "execution_count": 25, "metadata": {}, "outputs": [ { @@ -143,16 +156,18 @@ "name": "stderr", "output_type": "stream", "text": [ - "2336it [00:25, 90.46it/s] \n" + "373it [00:04, 87.27it/s] \n" ] } ], "source": [ "# compound to gene relationship\n", - "compound_to_gene_list = []\n", + "measure_groups = []\n", "\n", + "# Consider only the highest concentration of compound\n", + "df_overview_highest_conc = df_overview.sort_values(by=['Study', 'Treatment compound', 'Treatment concentration']).drop_duplicates(subset=['Study', 'Treatment compound'], keep='last')\n", "\n", - "for _, row in tqdm(df_overview.iterrows()):\n", + "for _, row in tqdm(df_overview_highest_conc.iterrows()):\n", " dataset_id = row['Dataset id']\n", " d = row.to_dict()\n", "\n", @@ -167,25 +182,69 @@ " \n", " is_significant_p_value = data_frame['padj'] < ADJUSTED_P_VALUE_THRESHOLD\n", " \n", - " d['positive deregulated genes'] = data_frame[is_positive_significant_fold_change & is_significant_p_value]['SYMBOL'].tolist()\n", - " d['negative deregulated genes'] = data_frame[is_negative_significant_fold_change & is_significant_p_value]['SYMBOL'].tolist()\n", - "\n", - " compound_to_gene_list.append(d)\n", + " # positive deregulated genes\n", + " for gene in data_frame[is_positive_significant_fold_change & is_significant_p_value]['SYMBOL'].tolist():\n", + " d['Compound'] = \"inchikey:{0}\".format(row['InChI key'])\n", + " d['Assay'] = \"study:{0}\".format(row['Study'])\n", + " d['Gene'] = \"gene:{0}\".format(gene)\n", + " d['Endpoint'] = \"endpoint:{0}\".format(len(measure_groups))\n", + " d['Endpoint_value'] = \"positive\"\n", + " measure_groups.append(d)\n", + "\n", + " # negtive deregulated genes\n", + " for gene in data_frame[is_negative_significant_fold_change & is_significant_p_value]['SYMBOL'].tolist():\n", + " d['Compound'] = \"inchikey:{0}\".format(row['InChI key'])\n", + " d['Assay'] = \"study:{0}\".format(row['Study'])\n", + " d['Gene'] = \"gene:{0}\".format(gene)\n", + " d['Endpoint'] = \"endpoint:{0}\".format(len(measure_groups))\n", + " d['Endpoint_value'] = \"negative\"\n", + " measure_groups.append(d)\n", " except:\n", " pass" ] }, { "cell_type": "code", - "execution_count": 51, + "execution_count": 26, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Index(['Study', 'Treatment compound', 'Treatment concentration',\n", + " 'Treatment timepoint', 'Control compound', 'Control concentration',\n", + " 'Control timepoint', 'Filename', 'Case study', 'Index in compound list',\n", + " 'Comments', 'Parent compound', 'Harris's Preferred Name (ChEMBL/ECHA)',\n", + " 'SMILES', 'InChI key', 'CAS number', 'Starting substance',\n", + " 'Barbara's prefered name', 'Alternative name',\n", + " 'Starting substance SMILES', 'Starting substance CAS number',\n", + " 'Supplier', 'Cat no', 'Lot no', 'Form', 'Storage pure compound',\n", + " 'Solvent', 'Stock concentration', 'Stock concentration unit',\n", + " 'Stock aliquot storage', 'Purity', 'Molar weight', 'Molecular formula',\n", + " 'MDLNUM', 'Code', 'Dataset id'],\n", + " dtype='object')" + ] + }, + "execution_count": 26, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_overview_highest_conc.columns" + ] + }, + { + "cell_type": "code", + "execution_count": 27, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Graph has 9641 nodes.\n", - "Graph has 46527 statements.\n" + "Graph has 28811 nodes.\n", + "Graph has 152208 statements.\n" ] } ], @@ -196,6 +255,9 @@ "# namespaces\n", "nm = g.namespace_manager\n", "\n", + "dce, prefix = rdflib.Namespace(\"http://purl.org/dc/elements/1.1/\"), \"dce\"\n", + "nm.bind(prefix, dce)\n", + "\n", "sio, prefix = rdflib.Namespace(\"http://semanticscience.org/resource/SIO/\"), \"sio\"\n", "nm.bind(prefix, sio)\n", "\n", @@ -214,41 +276,90 @@ "metago, prefix = rdflib.Namespace(\"http://model.geneontology.org/\"), \"metago\"\n", "nm.bind(prefix, metago)\n", "\n", + "rdfs, prefix = rdflib.Namespace(\"http://www.w3.org/2000/01/rdf-schema#\"), \"rdfs\"\n", + "nm.bind(prefix, rdfs)\n", + "\n", + "edam, prefix = rdflib.Namespace(\"http://edamontology.org/\"), \"edam\"\n", + "nm.bind(prefix, edam)\n", + "\n", + "obo, prefix = rdflib.Namespace(\"http://purl.obolibrary.org/obo/\"), \"obo\"\n", + "nm.bind(prefix, obo)\n", + "\n", "# Graph is built from triplets of (subject, predicate, object)\n", "\n", - "# Compounds\n", - "for inchikey in df_overview['InChI key'].unique():\n", - " s = rdflib.URIRef(\"inchikey:{0}\".format(inchikey))\n", + "# Assays (studies)\n", + "for study in df_overview['Study'].unique():\n", " \n", - " # inchikey object has value of #inchikey\n", - " # (InChIKey, sio:SIO_000300 (has value), InChIKeyValue)\n", - " p = sio.SIO_000300\n", - " o = rdflib.Literal(inchikey, datatype=XSD.string)\n", + " # Assay is of type bioassay\n", + " s = rdflib.URIRef(\"study:{0}\".format(study))\n", + " p = RDF.type\n", + " o = bao.BAO_0000015\n", " g.add((s, p, o))\n", - " # inchikey object is type of inchikey\n", - " # InChIKey, rdf:type cheminf:CHEMINF_000399)\n", + "\n", + "\n", + "# Compounds (and their identifiers)\n", + "compounds = df_overview.set_index(\"Treatment compound\")[['CAS number', 'InChI key']]\n", + "for compound_name, row in compounds.iterrows():\n", + "\n", + " # Compound is of type chemical entity\n", + " s = rdflib.URIRef(\"inchikey:{0}\".format(row['InChI key']))\n", " p = RDF.type\n", - " o = cheminf.CHEMINF_000399\n", + " o = cheminf.CHEMINF_000000\n", " g.add((s, p, o))\n", "\n", - " # (InChIKey, sio:SIO_000011 (is attribute of), Compound)\n", - " p = sio.SIO_000011\n", - " o = rdflib.URIRef(\"compound:{0}\".format(inchi_to_compound_dict[inchikey]))\n", + " # Compound has label compound name\n", + " p = rdfs.label\n", + " o = rdflib.Literal(compound_name, datatype=XSD.string)\n", " g.add((s, p, o))\n", - " #context.append(\"Compound {0} has InChIKey {1}.\".format(inchi_to_compound_dict_without_underscores[inchikey], inchikey))\n", + "\n", + " # Compound has identifier CAS number\n", + " p = edam.has_identifier\n", + " o = rdflib.URIRef(\"cas:{0}\".format(row['CAS number']))\n", + " g.add((s, p, o))\n", + "\n", + " # CAS number if of type CAS number\n", + " p = RDF.type\n", + " o2 = cheminf.CHEMINF_000446\n", + " g.add((o, p, o2))\n", + "\n", + " # CAS number has label compound name\n", + " p = rdfs.label\n", + " o2 = rdflib.Literal(compound_name, datatype=XSD.string)\n", + " g.add((o, p, o2))\n", + "\n", + " # CAS number source is \"CAS\"\n", + " p = dce.source\n", + " o2 = rdflib.Literal(\"CAS\", datatype=XSD.string)\n", + " g.add((o, p, o2))\n", + "\n", + " # Compound has identifier InChI key\n", + " p = edam.has_identifier\n", + " o = rdflib.URIRef(\"inchikey:{0}\".format(row['InChI key']))\n", + " g.add((s, p, o))\n", + " \n", + " # InChI key if of type InChI key\n", + " p = RDF.type\n", + " o2 = cheminf.CHEMINF_000059\n", + " g.add((o, p, o2))\n", + "\n", + " # InChI key has label compound name\n", + " p = rdfs.label\n", + " o2 = rdflib.Literal(compound_name, datatype=XSD.string)\n", + " g.add((o, p, o2))\n", + "\n", "\n", "\n", "# Genes\n", "for gene_symbol in df_pathways.Genes.unique():\n", - " # gene is type of gene\n", + " # Gene is of type gene\n", " s = rdflib.URIRef(\"gene:{0}\".format(gene_symbol))\n", " p = RDF.type\n", - " o = wp.GeneProduct #sio.SIO_010035 <-- what should we use? Pubchem uses SIO. WP uses wp.\n", + " o = sio.SIO_010035\n", " g.add((s, p, o))\n", "\n", - " # gene has symbol\n", + " # Gene has gene symbol gene_symbol\n", " p = bao.BAO_0002870\n", - " o = rdflib.Literal(gene_symbol, datatype=XSD.string)\n", + " o = rdflib.Literal(gene_symbol, datatype=XSD.string) # Pubchem has this somehwat diferent - not understood how/why\n", " g.add((s, p, o))\n", "\n", "\n", @@ -256,184 +367,153 @@ "for pathway_title in df_pathways.Term.unique():\n", " pathway_name = pathway_title.replace(\" \", \"-\")\n", "\n", - " # pathway is type of pathway\n", + " # Pathway is of type pathway\n", " s = rdflib.URIRef(\"pathway:{0}\".format(pathway_name))\n", " p = RDF.type\n", - " o = wp.Pathway #bp.Pathway\n", + " o = bp.Pathway\n", " g.add((s, p, o))\n", "\n", - " # pathway has title \n", + " # Pathway has title \n", " p = DCTERMS.title\n", " o = rdflib.Literal(pathway_title, datatype=XSD.string)\n", " g.add((s, p, o))\n", "\n", - "\n", - "# Compound-gene relationship\n", - "for row in compound_to_gene_list:\n", - " # one row is one compound in a particular study\n", - " pos_deregulated_genes = list(set(row['positive deregulated genes']))\n", - " neg_deregulated_genes = list(set(row['negative deregulated genes']))\n", - "\n", - " inchikey = row['InChI key']\n", - " s = rdflib.URIRef(\"compound:{0}\".format(inchi_to_compound_dict[inchikey]))\n", - " \n", - " for gene_symbol in pos_deregulated_genes:\n", - " p = metago.GO_0048521\n", - " o = rdflib.URIRef(\"gene:{0}\".format(gene_symbol))\n", - " g.add((s, p, o))\n", - " context.append(\"Compound {0} upregulates gene {1}.\".format(inchi_to_compound_dict_without_underscores[inchikey], gene_symbol))\n", - "\n", - " for gene_symbol in neg_deregulated_genes:\n", - " p = metago.GO_0048522\n", - " o = rdflib.URIRef(\"gene:{0}\".format(gene_symbol))\n", - " g.add((s, p, o))\n", - " context.append(\"Compound {0} downregulates gene {1}.\".format(inchi_to_compound_dict_without_underscores[inchikey], gene_symbol))\n", - "\n", "# Gene-Pathway relationship\n", "for _, row in df_pathways.iterrows():\n", " gene_symbol = row['Genes']\n", " pathway_title = row['Term']\n", " pathway_name = pathway_title.replace(\" \", \"-\")\n", "\n", - " # Gene is part of pathway\n", - " # (wp:GeneProduct, DCTERMS.isPartOf, wp:Pathway)\n", + " # Gene participates in pathway\n", " s = rdflib.URIRef(\"gene:{0}\".format(gene_symbol))\n", - " p = DCTERMS.isPartOf\n", + " p = obo.RO_0000056\n", " o = rdflib.URIRef(\"pathway:{0}\".format(pathway_name))\n", " g.add((s, p, o))\n", + "\n", + "# Measure groups\n", + "for i in range(len(measure_groups)):\n", " \n", - " #context.append(\"Gene {0} is part of {1} pathway.\".format(gene_symbol, pathway_title))\n", + " # Study/Assay has measure group\n", + " study = rdflib.URIRef(measure_groups[i]['Assay'])\n", + " p = bao.BAO_0000209\n", + " measure_group = rdflib.URIRef(\"measure_group:{0}\".format(i))\n", + " g.add((study, p, measure_group))\n", + "\n", + " # Meaure group is of type measure group\n", + " p = RDF.type\n", + " o = bao.BAO_0000040\n", + " g.add((measure_group, p, o))\n", + "\n", + " # Measure group has participant compound\n", + " p = obo.RO_0000057\n", + " compound = rdflib.URIRef(measure_groups[i]['Compound'])\n", + " g.add((measure_group, p, compound))\n", + "\n", + " # Compound participates in measure group\n", + " p = obo.RO_0000056\n", + " g.add((compound, p, measure_group))\n", + "\n", + " # Measure group has participant gene\n", + " p = obo.RO_0000057\n", + " gene = rdflib.URIRef(measure_groups[i]['Gene'])\n", + " g.add((measure_group, p, gene))\n", + "\n", + " # Measure group has specified output endpoint\n", + " p = obo.OBI_0000299\n", + " endpoint = rdflib.URIRef(measure_groups[i][\"Endpoint\"])\n", + " g.add((measure_group, p, endpoint))\n", + "\n", + " # Endpoint is of type fold change \n", + " p = RDF.type\n", + " o = bao.BAO_0000193\n", + " g.add((endpoint, p, o))\n", + "\n", + " # Endpoint has value \n", + " p = sio.SIO_000300\n", + " endpoint_value = rdflib.Literal(measure_groups[i][\"Endpoint_value\"], datatype=XSD.string)\n", + " g.add((endpoint, p, endpoint_value))\n", + "\n", + " # Endpoint is about compound\n", + " p = obo.IAO_0000136\n", + " g.add((endpoint, p, compound))\n", " \n", + " # Endpoint is about gene\n", + " g.add((endpoint, p, gene))\n", "\n", "print(\"Graph has {0} nodes.\".format(len(g.all_nodes())))\n", - "print(\"Graph has {0} statements.\".format(len(g)))\n", - "context_str = \" \".join(context)" - ] - }, - { - "cell_type": "code", - "execution_count": 52, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "46527\n", - "1577500\n", - "29244\n", - "33.90504438283148\n" - ] - } - ], - "source": [ - "print(len(g))\n", - "print(len(context_str))\n", - "print(len(context))\n", - "print(len(context_str) / len(g))" + "print(\"Graph has {0} statements.\".format(len(g)))" ] }, { "cell_type": "code", - "execution_count": 59, + "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "'Compound Butanone oxime upregulates gene ATAD2. Compound Butanone oxime upregulates gene LGALS1. Compound Butanone oxime upregulates gene S100A10. Compound Butanone oxime upregulates gene TP53. Compound Butanone oxime upregulates gene DDR1. Compound Butanone oxime upregulates gene PTPN1. Compound Butanone oxime upregulates gene CDCA8. Compound Butanone oxime upregulates gene S100P. Compound Butanone oxime upregulates gene CEACAM6. Compound Butanone oxime upregulates gene IFIT3. Compound Butanone oxime upregulates gene MCM10. Compound Butanone oxime upregulates gene EGR3. Compound Butanone oxime upregulates gene MSH2. Compound Butanone oxime upregulates gene SP110. Compound Butanone oxime upregulates gene CDC25A. Compound Butanone oxime upregulates gene CDCA7. Compound Butanone oxime upregulates gene CCNE2. Compound Butanone oxime upregulates gene HJURP. Compound Butanone oxime upregulates gene H2BC14. Compound Butanone oxime upregulates gene PROS1. Compound Butanone oxime upregulates gene FAM83D. Compound Butanone oxime upregulates gene GLI1. Compound Butanone oxime upregulates gene MCIDAS. Compound Butanone oxime upregulates gene IFIT1. Compound Butanone oxime upregulates gene MCM3. Compound Butanone oxime upregulates gene DNM1. Compound Butanone oxime upregulates gene VAV3. Compound Butanone oxime upregulates gene MCM4. Compound Butanone oxime upregulates gene CXCL14. Compound Butanone oxime upregulates gene PALMD. Compound Butanone oxime upregulates gene GINS1. Compound Butanone oxime upregulates gene TXNIP. Compound Butanone oxime upregulates gene SPC25. Compound Butanone oxime upregulates gene LMO3. Compound Butanone oxime downregulates gene MMP1. Compound Butanone oxime downregulates gene CXCL8. Compound Butanone oxime downregulates gene BMP6. Compound Butanone oxime downregulates gene DDIT3. Compound Butanone oxime downregulates gene LAMP3. Compound Butanone oxime downregulates gene IL13RA2. Compound Butanone oxime downregulates gene HDAC9. Compound Butanone oxime downregulates gene PPP1R15A. Compound Butanone oxime downregulates gene CCNA1. Compound Butanone oxime upregulates gene AQP3. Compound Butanone oxime upregulates gene TPRKB. Compound Butanone oxime upregulates gene HLA-C. Compound Butanone oxime upregulates gene H2BC15. Compound Butanone oxime upregulates gene HMG20B. Compound Butanone oxime upregulates gene CYP2C19. Compound Butanone oxime upregulates gene MT1X. Compound Butanone oxime upregulates gene WFS1. Compound Butanone oxime upregulates gene SERPINA3. Compound Butanone oxime upregulates gene CXCL5. Compound Butanone oxime upregulates gene RPSA. Compound Butanone oxime upregulates gene NIPSNAP1. Compound Butanone oxime upregulates gene EMX1. Compound Butanone oxime upregulates gene ODF3B. Compound Butanone oxime upregulates gene GIMAP8. Compound Butanone oxime upregulates gene MT1H. Compound Butanone oxime upregulates gene BAD. Compound Butanone oxime upregulates gene CRISP3. Compound Butanone oxime upregulates gene CHEK2. Compound Butanone oxime upregulates gene APOL3. Compound Butanone oxime upregulates gene PKIG. Compound Butanone oxime downregulates gene MOK. Compound Butanone oxime downregulates gene DLG4. Compound Butanone oxime downregulates gene ZNF586. Compound Butanone oxime downregulates gene FOXJ3. Compound Butanone oxime downregulates gene SPTLC2. Compound Butanone oxime downregulates gene KLRC2. Compound Butanone oxime upregulates gene HLA-C. Compound Butanone oxime upregulates gene ZP3. Compound Butanone oxime upregulates gene OTUD7B. Compound Butanone oxime upregulates gene CCDC92. Compound Butanone oxime upregulates gene RHOB. Compound Butanone oxime upregulates gene TPD52L2. Compound Butanone oxime upregulates gene RFC5. Compound Butanone oxime upregulates gene SERPINA3. Compound Butanone oxime upregulates gene LPCAT1. Compound Butanone oxime upregulates gene H1-0. Compound Butanone oxime upregulates gene RPSA. Compound Butanone oxime upregulates gene DRD2. Compound Butanone oxime upregulates gene DPH2. Compound Butanone oxime upregulates gene JUN. Compound Butanone oxime upregulates gene PDGFA. Compound Butanone oxime upregulates gene DDIT4. Compound Butanone oxime upregulates gene DNAJA3. Compound Butanone oxime upregulates gene MRPL53. Compound Butanone oxime upregulates gene NES. Compound Butanone oxime upregulates gene APOL3. Compound Butanone oxime upregulates gene TNFSF13. Compound Butanone oxime upregulates gene PKIG. Compound Butanone oxime upregulates gene VKORC1. Compound Butanone oxime downregulates gene AMY1A. Compound Butanone oxime upregulates gene HLA-C. Compound Butanone oxime upregulates gene OTUD7B. Compound Butanone oxime upregulates gene H2BC15. Compound Butanone oxime upregulates gene CYP2C19. Compound Butanone oxime upregulates gene CYP1B1. Compound Butanone oxime upregulates gene ICAM1. Compound Butanone oxime upregulates gene LGALS1. Compound Butanone oxime upregulates gene RFC5. Compound Butanone oxime upregulates gene SERPINA3. Compound Butanone oxime upregulates gene COL11A1. Compound Butanone oxime upregulates gene RPSA. Compound Butanone oxime upregulates gene NGFR. Compound Butanone oxime upregulates gene DRD2. Compound Butanone oxime upregulates gene CALM3. Compound Butanone oxime upregulates gene RPL27. Compound Butanone oxime upregulates gene PSRC1. Compound Butanone oxime upregulates gene GIMAP8. Compound Butanone oxime upregulates gene CCNF. Compound Butanone oxime upregulates gene CRISP3. Compound Butanone oxime upregulates gene MRPL53. Compound Butanone oxime upregulates gene CA1. Compound Butanone oxime upregulates gene APOL3. Compound Butanone oxime upregulates gene DDIAS. Compound Butanone oxime upregulates gene VKORC1. Compound Butanone oxime downregulates gene CLDN2. Compound Butanone oxime downregulates gene SLC2A1. Compound Butanone oxime downregulates gene GALNT3. Compound Butanone oxime downregulates gene PHLDA2. Compound Butanone oxime downregulates gene AGXT2. Compound Butanone oxime downregulates gene POLE2. Compound Butanone oxime downregulates gene GINS2. Compound Butanone oxime downregulates gene INA. Compound Butanone oxime downregulates gene ARHGAP8. Compound Butanone oxime upregulates gene TPRKB. Compound Butanone oxime upregulates gene HLA-C. Compound Butanone oxime upregulates gene NLRX1. Compound Butanone oxime upregulates gene H2BC15. Compound Butanone oxime upregulates gene CYP2C19. Compound Butanone oxime upregulates gene LGALS1. Compound Butanone oxime upregulates gene DHFR. Compound Butanone oxime upregulates gene SERPINA3. Compound Butanone oxime upregulates gene RPSA. Compound Butanone oxime upregulates gene NIPSNAP1. Compound Butanone oxime upregulates gene NGFR. Compound Butanone oxime upregulates gene B4GALT5. Compound Butanone oxime upregulates gene JUN. Compound Butanone oxime upregulates gene ISG15. Compound Butanone oxime upregulates gene MT1H. Compound Butanone oxime upregulates gene H2AC8. Compound Butanone oxime upregulates gene APOL3. Compound Butanone oxime upregulates gene VKORC1. Compound Butanone oxime upregulates gene PSME1. Compound Butanone oxime upregulates gene VKORC1. Compound Butanone oxime upregulates gene ZNF217. Compound Butanone oxime upregulates gene CYTH1. Compound Butanone oxime upregulates gene TPRKB. Compound Butanone oxime upregulates gene HLA-C. Compound Butanone oxime upregulates gene LGALS1. Compound Butanone oxime upregulates gene TPD52L2. Compound Butanone oxime upregulates gene WFS1. Compound Butanone oxime upregulates gene SERPINA3. Compound Butanone oxime upregulates gene H1-0. Compound Butanone oxime upregulates gene COL11A1. Compound Butanone oxime upregulates gene RPSA. Compound Butanone oxime upregulates gene NIPSNAP1. Compound Butanone oxime upregulates gene NGFR. Compound Butanone oxime upregulates gene DRD2. Compound Butanone oxime upregulates gene PDPN. Compound Butanone oxime upregulates gene ACTA1. Compound Butanone oxime upregulates gene CCDC80. Compound Butanone oxime upregulates gene TIMP2. Compound Butanone oxime upregulates gene CHEK2. Compound Butanone oxime upregulates gene MRPL53. Compound Butanone oxime upregulates gene VKORC1. Compound Butanone oxime downregulates gene ZNF586. Compound Butanone oxime downregulates gene VEGFD. Compound Butanone oxime downregulates gene EVI2B. Compound Butanone oxime downregulates gene COL5A2. Compound Butanone oxime upregulates gene HLA-C. Compound Butanone oxime upregulates gene H2BC15. Compound Butanone oxime upregulates gene LGALS1. Compound Butanone oxime upregulates gene TPD52L2. Compound Butanone oxime upregulates gene WFS1. Compound Butanone oxime upregulates gene GPR171. Compound Butanone oxime upregulates gene SERPINA3. Compound Butanone oxime upregulates gene H1-0. Compound Butanone oxime upregulates gene RPSA. Compound Butanone oxime upregulates gene NIPSNAP1. Compound Butanone oxime upregulates gene P4HB. Compound Butanone oxime upregulates gene DRD2. Compound Butanone oxime upregulates gene RPL27. Compound Butanone oxime upregulates gene IFI6. Compound Butanone oxime upregulates gene TIMP2. Compound Butanone oxime upregulates gene ISG15. Compound Butanone oxime upregulates gene DDIT4. Compound Butanone oxime upregulates gene BAD. Compound Butanone oxime upregulates gene CHEK2. Compound Butanone oxime upregulates gene VKORC1. Compound Butanone oxime upregulates gene PSME1. Compound Butanone oxime downregulates gene AOC2. Compound Butanone oxime downregulates gene LATS2. Compound Butyl tin trichloride downregulates gene EPHB6. Compound Butyl tin trichloride upregulates gene NMRAL2P. Compound Butyl tin trichloride upregulates gene UGT1A10. Compound Butyl tin trichloride upregulates gene UGT1A8. Compound Butyl tin trichloride upregulates gene NQO1. Compound Butyl tin trichloride downregulates gene TXNIP. Compound Butyl tin trichloride downregulates gene CASR. Compound Butyl tin trichloride downregulates gene EMX2. Compound Butyl tin trichloride downregulates gene TXNIP. Compound Butyl tin trichloride downregulates gene ABL1. Compound Butyl tin trichloride upregulates gene TRIM16L. Compound Butyl tin trichloride upregulates gene UGT1A1. Compound Butyl tin trichloride upregulates gene NMRAL2P. Compound Butyl tin trichloride upregulates gene UGT1A3. Compound Butyl tin trichloride upregulates gene UGT1A10. Compound Butyl tin trichloride upregulates gene AKR1B10. Compound Butyl tin trichloride upregulates gene NQO1. Compound Butyl tin trichloride upregulates gene UGT1A6. Compound Butyl tin trichloride upregulates gene HMOX1. Compound Butyl tin trichloride downregulates gene TXNIP. Compound Butyl tin trichloride downregulates gene CASR. Compound Butyl tin trichloride upregulates gene SLCO2B1. Compound Butyl tin trichloride upregulates gene TRIM16L. Compound Butyl tin trichloride upregulates gene NMRAL2P. Compound Butyl tin trichloride upregulates gene OSGIN1. Compound Butyl tin trichloride upregulates gene FN1. Compound Butyl tin trichloride upregulates gene CDA. Compound Butyl tin trichloride upregulates gene UGT1A10. Compound Butyl tin trichloride upregulates gene AKR1B10. Compound Butyl tin trichloride upregulates gene SLC7A11. Compound Butyl tin trichloride upregulates gene TXNRD1. Compound Butyl tin trichloride upregulates gene NQO1. Compound Butyl tin trichloride upregulates gene AFP. Compound Butyl tin trichloride upregulates gene UGT1A6. Compound Butyl tin trichloride upregulates gene HMOX1. Compound Butyl tin trichloride downregulates gene CASR. Compound Butyl tin trichloride downregulates gene EMX2. Compound Butyl tin trichloride downregulates gene TXNIP. Compound Butyl tin trichloride downregulates gene AGR3. Compound Butyl tin trichloride downregulates gene BBOX1. Compound Butyl tin trichloride downregulates gene FIBIN. Compound Butyl tin trichloride downregulates gene EGR1. Compound Butyl tin trichloride downregulates gene FGFR2. Compound Butyl tin trichloride downregulates gene DEFB1. Compound Butyl tin trichloride downregulates gene SLC8A1. Compound Butyl tin trichloride upregulates gene TRIM16L. Compound Butyl tin trichloride upregulates gene AKR1C2. Compound Butyl tin trichloride upregulates gene NMRAL2P. Compound Butyl tin trichloride upregulates gene TXNRD1. Compound Butyl tin trichloride upregulates gene IL13RA2. Compound Butyl tin trichloride downregulates gene KRT4. Compound Butyl tin trichloride upregulates gene TRIM16L. Compound Butyl tin trichloride upregulates gene AKR1C2. Compound Butyl tin trichloride upregulates gene NMRAL2P. Compound Butyl tin trichloride upregulates gene GPX2. Compound Butyl tin trichloride upregulates gene MAP2. Compound Butyl tin trichloride upregulates gene OSGIN1. Compound Butyl tin trichloride upregulates gene HSPA6. Compound Butyl tin trichloride upregulates gene NRCAM. Compound Butyl tin trichloride upregulates gene GCLC. Compound Butyl tin trichloride upregulates gene TNFRSF9. Compound Butyl tin trichloride upregulates gene ZNF469. Compound Butyl tin trichloride upregulates gene IL13RA2. Compound Butyl tin trichloride upregulates gene SLC7A11. Compound Butyl tin trichloride upregulates gene TXNRD1. Compound Butyl tin trichloride upregulates gene ZNF114. Compound Butyl tin trichloride upregulates gene HMOX1. Compound Butyl tin trichloride downregulates gene CCL2. Compound Butyl tin trichloride downregulates gene SERPINB4. Compound Butyl tin trichloride upregulates gene FTL. Compound Butyl tin trichloride upregulates gene AKR1C2. Compound Butyl tin trichloride upregulates gene GCLC. Compound Butyl tin trichloride upregulates gene NCF2. Compound Butyl tin trichloride upregulates gene ZNF469. Compound Butyl tin trichloride upregulates gene FTH1. Compound Butyl tin trichloride upregulates gene HDAC9. Compound Butyl tin trichloride upregulates gene GPAT3. Compound Butyl tin trichloride upregulates gene ZNF114. Compound Butyl tin trichloride upregulates gene LCAL1. Compound Butyl tin trichloride upregulates gene TRIM16L. Compound Butyl tin trichloride upregulates gene GCLM. Compound Butyl tin trichloride upregulates gene NMRAL2P. Compound Butyl tin trichloride upregulates gene PLIN2. Compound Butyl tin trichloride upregulates gene SLC2A14. Compound Butyl tin trichloride upregulates gene SRXN1. Compound Butyl tin trichloride upregulates gene SQSTM1. Compound Butyl tin trichloride upregulates gene NRCAM. Compound Butyl tin trichloride upregulates gene GDF15. Compound Butyl tin trichloride upregulates gene IGFBP3. Compound Butyl tin trichloride upregulates gene NDRG1. Compound Butyl tin trichloride upregulates gene MAP1B. Compound Butyl tin trichloride upregulates gene SOCS1. Compound Butyl tin trichloride upregulates gene MMP1. Compound Butyl tin trichloride upregulates gene LY96. Compound Butyl tin trichloride upregulates gene GPX2. Compound Butyl tin trichloride upregulates gene MAP2. Compound Butyl tin trichloride upregulates gene HSPA6. Compound Butyl tin trichloride upregulates gene TNFRSF9. Compound Butyl tin trichloride upregulates gene LAMP3. Compound Butyl tin trichloride upregulates gene IL13RA2. Compound Butyl tin trichloride upregulates gene CSF2. Compound Butyl tin trichloride upregulates gene TXNRD1. Compound Butyl tin trichloride upregulates gene POPDC3. Compound Butyl tin trichloride upregulates gene OSGIN1. Compound Butyl tin trichloride upregulates gene TREM1. Compound Butyl tin trichloride upregulates gene SLC7A11. Compound Butyl tin trichloride upregulates gene AKR1C3. Compound Butyl tin trichloride upregulates gene HMOX1. Compound Butyl tin trichloride downregulates gene MUC1. Compound Butyl tin trichloride downregulates gene CAMK2B. Compound Butyl tin trichloride downregulates gene IFIT3. Compound Butyl tin trichloride downregulates gene TGFB2. Compound Butyl tin trichloride downregulates gene MCM10. Compound Butyl tin trichloride downregulates gene SERPINB4. Compound Butyl tin trichloride downregulates gene VGLL1. Compound Butyl tin trichloride downregulates gene ECSCR. Compound Butyl tin trichloride downregulates gene HERC5. Compound Butyl tin trichloride downregulates gene ID3. Compound Butyl tin trichloride downregulates gene CCNE2. Compound Butyl tin trichloride downregulates gene IL2RB. Compound Butyl tin trichloride downregulates gene KRT4. Compound Butyl tin trichloride downregulates gene IL20. Compound Butyl tin trichloride downregulates gene CCL2. Compound Butyl tin trichloride downregulates gene H2BC14. Compound Butyl tin trichloride downregulates gene INSC. Compound Butyl tin trichloride downregulates gene THBS1. Compound Butyl tin trichloride downregulates gene CYP24A1. Compound Butyl tin trichloride downregulates gene EXO1. Compound Butyl tin trichloride downregulates gene IFIT1. Compound Butyl tin trichloride downregulates gene MCM3. Compound Butyl tin trichloride downregulates gene ATAD5. Compound Butyl tin trichloride downregulates gene STEAP4. Compound Butyl tin trichloride downregulates gene PCLAF. Compound Butyl tin trichloride downregulates gene CXCL14. Compound Butyl tin trichloride downregulates gene EGFL6. Compound Butyl tin trichloride downregulates gene PALMD. Compound Butyl tin trichloride downregulates gene ZNF367. Compound Butyl tin trichloride downregulates gene H2BC3. Compound Butyl tin trichloride downregulates gene H2BC7. Compound Butyl tin trichloride downregulates gene FOSB. Compound Butyl tin trichloride downregulates gene LMO3. Compound Butyl tin trichloride upregulates gene TRIM16L. Compound Butyl tin trichloride upregulates gene FTL. Compound Butyl tin trichloride upregulates gene IFIT3. Compound Butyl tin trichloride upregulates gene AKR1C2. Compound Butyl tin trichloride upregulates gene RRAD. Compound Butyl tin trichloride upregulates gene HSPA6. Compound Butyl tin trichloride upregulates gene NRCAM. Compound Butyl tin trichloride upregulates gene HSPA1A. Compound Butyl tin trichloride upregulates gene HSPA1B. Compound Butyl tin trichloride upregulates gene ZNF469. Compound Butyl tin trichloride upregulates gene MINDY1. Compound Butyl tin trichloride upregulates gene TXNRD1. Compound Butyl tin trichloride upregulates gene CTTNBP2. Compound Butyl tin trichloride upregulates gene AKR1C3. Compound Butyl tin trichloride upregulates gene HMOX1. Compound Butyl tin trichloride downregulates gene CX3CL1. Compound Butyl tin trichloride downregulates gene MMP1. Compound Butyl tin trichloride downregulates gene CYP1B1. Compound Butyl tin trichloride downregulates gene THBD. Compound Butyl tin trichloride downregulates gene NSG1. Compound Butyl tin trichloride downregulates gene CXCL14. Compound Butyl tin trichloride downregulates gene KRT6A. Compound Butyl tin trichloride downregulates gene KRT14. Compound Butyl tin trichloride downregulates gene KRT5. Compound Butyl tin trichloride upregulates gene LPCAT1. Compound Butyl tin trichloride upregulates gene SEMA3C. Compound Butyl tin trichloride upregulates gene MGC70870. Compound Butyl tin trichloride upregulates gene MT1H. Compound Butyl tin trichloride downregulates gene IGHV3-23. Compound Butyl tin trichloride downregulates gene POU5F2. Compound Butyl tin trichloride upregulates gene NMRAL2P. Compound Butyl tin trichloride upregulates gene HMOX1. Compound Butyl tin trichloride upregulates gene F2RL2. Compound Butyl tin trichloride downregulates gene CYP1A2. Compound Butyl tin trichloride upregulates gene IGHV3-23. Compound Butyl tin trichloride upregulates gene LPCAT1. Compound Butyl tin trichloride upregulates gene APOL3. Compound Butyl tin trichloride upregulates gene CDH11. Compound Butyl tin trichloride upregulates gene PLK3. Compound Butyl tin trichloride upregulates gene ALDOC. Compound Butyl tin trichloride downregulates gene GALNT3. Compound Butyl tin trichloride downregulates gene SMAD4. Compound Butyl tin trichloride downregulates gene TFAP2A. Compound Butyl tin trichloride downregulates gene IL1A. Compound Butyl tin trichloride downregulates gene KRT14. Compound Butyl tin trichloride downregulates gene KRT17. Compound Butyl tin trichloride downregulates gene KRT5. Compound Butyl tin trichloride downregulates gene KRT6A. Compound Butyl tin trichloride downregulates gene AREG. Compound Butyl tin trichloride downregulates gene DNMT1. Compound Butyl tin trichloride upregulates gene HMOX1. Compound Butyl tin trichloride downregulates gene S100A2. Compound Butyl tin trichloride downregulates gene KRT14. Compound Butyl tin trichloride downregulates gene KRT17. Compound Butyl tin trichloride downregulates gene KRT5. Compound Butyl tin trichloride downregulates gene KRT6A. Compound Butyl tin trichloride upregulates gene AKR1B10. Compound Butyl tin trichloride upregulates gene CYP24A1. Compound Butyl tin trichloride upregulates gene AKR1C2. Compound Butyl tin trichloride upregulates gene NMRAL2P. Compound Butyl tin trichloride upregulates gene GCLM. Compound Butyl tin trichloride upregulates gene OSGIN1. Compound Butyl tin trichloride upregulates gene AKR1B10. Compound Butyl tin trichloride upregulates gene RFK. Compound Butyl tin trichloride upregulates gene RRP7A. Compound Butyl tin trichloride downregulates gene HSPA9. Compound Butyl tin trichloride downregulates gene PTBP2. Compound Butyl tin trichloride downregulates gene KDM3A. Compound Butyl tin trichloride downregulates gene DNAJB4. Compound Butyl tin trichloride downregulates gene RPL15. Compound Butyl tin trichloride downregulates gene MTRNR2L8. Compound Butyl tin trichloride downregulates gene HIST1H3F. Compound Dibutyl tin dichloride upregulates gene CASR. Compound Dibutyl tin dichloride upregulates gene RET. Compound Dibutyl tin dichloride upregulates gene EMX1. Compound Dibutyl tin dichloride downregulates gene EOMES. Compound Dibutyl tin dichloride downregulates gene MMP1. Compound Dibutyl tin dichloride downregulates gene CCL2. Compound Dibutyl tin dichloride downregulates gene IRAK2. Compound Dibutyl tin dichloride downregulates gene PLAT. Compound Dibutyl tin dichloride downregulates gene CSF1. Compound Dibutyl tin dichloride downregulates gene IL13RA2. Compound Dibutyl tin dichloride downregulates gene CSF2. Compound Dibutyl tin dichloride downregulates gene CCL20. Compound Dibutyl tin dichloride downregulates gene IL1B. Compound Dibutyl tin dichloride upregulates gene DDIT4. Compound Dibutyl tin dichloride upregulates gene MT1H. Compound Dibutyl tin dichloride upregulates gene CYP26A1. Compound Dibutyl tin dichloride upregulates gene FOS. Compound Dibutyl tin dichloride upregulates gene PRR15L. Compound Dibutyl tin dichloride upregulates gene ANGPTL4. Compound Dibutyl tin dichloride downregulates gene MMP1. Compound Dibutyl tin dichloride downregulates gene CD69. Compound Dibutyl tin dichloride downregulates gene IRAK2. Compound Dibutyl tin dichloride downregulates gene PLAT. Compound Dibutyl tin dichloride downregulates gene IL13RA2. Compound Dibutyl tin dichloride downregulates gene SERPINB3. Compound Dibutyl tin dichloride downregulates gene IL1B. Compound Dibutyl tin dichloride upregulates gene PRR15L. Compound Dibutyl tin dichloride upregulates gene CYP26A1. Compound Dibutyl tin dichloride upregulates gene BBOX1. Compound Dibutyl tin dichloride downregulates gene SLCO2B1. Compound Dibutyl tin dichloride downregulates gene MMP1. Compound Dibutyl tin dichloride downregulates gene PLAT. Compound Dibutyl tin dichloride downregulates gene IL1B. Compound Dibutyl tin dichloride upregulates gene HMOX1. Compound Dibutyl tin dichloride upregulates gene CYP26A1. Compound Dibutyl tin dichloride downregulates gene MMP1. Compound Dibutyl tin dichloride downregulates gene PLAT. Compound Dibutyl tin dichloride downregulates gene IL1B. Compound Dibutyl tin dichloride upregulates gene UGT1A10. Compound Dibutyl tin dichloride upregulates gene UGT1A8. Compound Dibutyl tin dichloride upregulates gene NQO1. Compound Dibutyl tin dichloride upregulates gene UGT1A6. Compound Dibutyl tin dichloride upregulates gene HMOX1. Compound Dibutyl tin dichloride downregulates gene MMP1. Compound Dibutyl tin dichloride downregulates gene PLAT. Compound Dibutyl tin dichloride downregulates gene CEACAM6. Compound Dibutyl tin dichloride upregulates gene LINC00520. Compound Dibutyl tin dichloride upregulates gene FTL. Compound Dibutyl tin dichloride upregulates gene AKR1C2. Compound Dibutyl tin dichloride upregulates gene IL7R. Compound Dibutyl tin dichloride upregulates gene UGT1A8. Compound Dibutyl tin dichloride upregulates gene AKR1B10. Compound Dibutyl tin dichloride upregulates gene ALDH3A2. Compound Dibutyl tin dichloride upregulates gene AFP. Compound Dibutyl tin dichloride upregulates gene GPAT3. Compound Dibutyl tin dichloride upregulates gene EDNRA. Compound Dibutyl tin dichloride upregulates gene INA. Compound Dibutyl tin dichloride upregulates gene UGT1A6. Compound Dibutyl tin dichloride upregulates gene ITGA11. Compound Dibutyl tin dichloride upregulates gene TRIM16L. Compound Dibutyl tin dichloride upregulates gene NCR3LG1. Compound Dibutyl tin dichloride upregulates gene PKIB. Compound Dibutyl tin dichloride upregulates gene GCLM. Compound Dibutyl tin dichloride upregulates gene NMRAL2P. Compound Dibutyl tin dichloride upregulates gene SNHG8. Compound Dibutyl tin dichloride upregulates gene SRXN1. Compound Dibutyl tin dichloride upregulates gene SQSTM1. Compound Dibutyl tin dichloride upregulates gene DDIT3. Compound Dibutyl tin dichloride upregulates gene ABCC2. Compound Dibutyl tin dichloride upregulates gene KLRC2. Compound Dibutyl tin dichloride upregulates gene RGCC. Compound Dibutyl tin dichloride upregulates gene PPM1E. Compound Dibutyl tin dichloride upregulates gene KCNQ3. Compound Dibutyl tin dichloride upregulates gene SRPX. Compound Dibutyl tin dichloride upregulates gene EEF1A2. Compound Dibutyl tin dichloride upregulates gene IL13RA2. Compound Dibutyl tin dichloride upregulates gene TXNRD1. Compound Dibutyl tin dichloride upregulates gene NQO1. Compound Dibutyl tin dichloride upregulates gene ATF5. Compound Dibutyl tin dichloride upregulates gene ANGPTL4. Compound Dibutyl tin dichloride upregulates gene CRYAB. Compound Dibutyl tin dichloride upregulates gene MLLT11. Compound Dibutyl tin dichloride upregulates gene ASB5. Compound Dibutyl tin dichloride upregulates gene IFRD1. Compound Dibutyl tin dichloride upregulates gene OSGIN1. Compound Dibutyl tin dichloride upregulates gene SLCO1B1. Compound Dibutyl tin dichloride upregulates gene PEG10. Compound Dibutyl tin dichloride upregulates gene UGT1A10. Compound Dibutyl tin dichloride upregulates gene SLC7A11. Compound Dibutyl tin dichloride upregulates gene GADD45G. Compound Dibutyl tin dichloride upregulates gene AKR1C3. Compound Dibutyl tin dichloride upregulates gene HMOX1. Compound Dibutyl tin dichloride upregulates gene STC2. Compound Dibutyl tin dichloride upregulates gene GRWD1. Compound Dibutyl tin dichloride downregulates gene ATAD2. Compound Dibutyl tin dichloride downregulates gene FAM72C. Compound Dibutyl tin dichloride downregulates gene CYP3A5. Compound Dibutyl tin dichloride downregulates gene CYP2D6. Compound Dibutyl tin dichloride downregulates gene LIG1. Compound Dibutyl tin dichloride downregulates gene LIX1. Compound Dibutyl tin dichloride downregulates gene HLA-DMB. Compound Dibutyl tin dichloride downregulates gene TRIM22. Compound Dibutyl tin dichloride downregulates gene STIL. Compound Dibutyl tin dichloride downregulates gene TERT. Compound Dibutyl tin dichloride downregulates gene LRP1. Compound Dibutyl tin dichloride downregulates gene TPX2. Compound Dibutyl tin dichloride downregulates gene CCNB2. Compound Dibutyl tin dichloride downregulates gene KRT17. Compound Dibutyl tin dichloride downregulates gene MYL12A. Compound Dibutyl tin dichloride downregulates gene TCEA2. Compound Dibutyl tin dichloride downregulates gene RNASE4. Compound Dibutyl tin dichloride downregulates gene SHCBP1. Compound Dibutyl tin dichloride downregulates gene SPAG5. Compound Dibutyl tin dichloride downregulates gene CCNE2. Compound Dibutyl tin dichloride downregulates gene TTK. Compound Dibutyl tin dichloride downregulates gene H3C10. Compound Dibutyl tin dichloride downregulates gene H2BC13. Compound Dibutyl tin dichloride downregulates gene CENPF. Compound Dibutyl tin dichloride downregulates gene ANLN. Compound Dibutyl tin dichloride downregulates gene CYP2E1. Compound Dibutyl tin dichloride downregulates gene NEK2. Compound Dibutyl tin dichloride downregulates gene CDCA8. Compound Dibutyl tin dichloride downregulates gene EGFL6. Compound Dibutyl tin dichloride downregulates gene KIF15. Compound Dibutyl tin dichloride downregulates gene H2BC3. Compound Dibutyl tin dichloride downregulates gene LMNB1. Compound Dibutyl tin dichloride downregulates gene FIBIN. Compound Dibutyl tin dichloride downregulates gene EGR1. Compound Dibutyl tin dichloride downregulates gene DDIAS. Compound Dibutyl tin dichloride downregulates gene TOP2A. Compound Dibutyl tin dichloride downregulates gene KCNJ8. Compound Dibutyl tin dichloride downregulates gene SERPINB3. Compound Dibutyl tin dichloride downregulates gene KIF18A. Compound Dibutyl tin dichloride downregulates gene HELLS. Compound Dibutyl tin dichloride downregulates gene FAM183A. Compound Dibutyl tin dichloride downregulates gene NFATC4. Compound Dibutyl tin dichloride downregulates gene C15orf48. Compound Dibutyl tin dichloride downregulates gene KIF14. Compound Dibutyl tin dichloride downregulates gene AURKA. Compound Dibutyl tin dichloride downregulates gene PBK. Compound Dibutyl tin dichloride downregulates gene PLK1. Compound Dibutyl tin dichloride downregulates gene IFI44. Compound Dibutyl tin dichloride downregulates gene ORC1. Compound Dibutyl tin dichloride downregulates gene IFI44L. Compound Dibutyl tin dichloride downregulates gene CIT. Compound Dibutyl tin dichloride downregulates gene NCAPH. Compound Dibutyl tin dichloride downregulates gene CDCA3. Compound Dibutyl tin dichloride downregulates gene FAM72A. Compound Dibutyl tin dichloride downregulates gene NFKBIA. Compound Dibutyl tin dichloride downregulates gene KIF23. Compound Dibutyl tin dichloride downregulates gene DLGAP5. Compound Dibutyl tin dichloride downregulates gene EDN1. Compound Dibutyl tin dichloride downregulates gene RRM2. Compound Dibutyl tin dichloride downregulates gene CCNA2. Compound Dibutyl tin dichloride downregulates gene CDH5. Compound Dibutyl tin dichloride downregulates gene CENPE. Compound Dibutyl tin dichloride downregulates gene ASF1B. Compound Dibutyl tin dichloride downregulates gene CDC45. Compound Dibutyl tin dichloride downregulates gene PTGFR. Compound Dibutyl tin dichloride downregulates gene TXNIP. Compound Dibutyl tin dichloride downregulates gene BTN3A3. Compound Dibutyl tin dichloride downregulates gene BRIP1. Compound Dibutyl tin dichloride downregulates gene MELK. Compound Dibutyl tin dichloride downregulates gene KIF20A. Compound Dibutyl tin dichloride downregulates gene STMN1. Compound Dibutyl tin dichloride downregulates gene PLAT. Compound Dibutyl tin dichloride downregulates gene RAD51AP1. Compound Dibutyl tin dichloride downregulates gene PAIP1. Compound Dibutyl tin dichloride downregulates gene TNFSF10. Compound Dibutyl tin dichloride downregulates gene TCF19. Compound Dibutyl tin dichloride downregulates gene ALDH7A1. Compound Dibutyl tin dichloride downregulates gene ANKRD36B. Compound Dibutyl tin dichloride downregulates gene CASP1. Compound Dibutyl tin dichloride downregulates gene CEACAM6. Compound Dibutyl tin dichloride downregulates gene CLDN2. Compound Dibutyl tin dichloride downregulates gene USP1. Compound Dibutyl tin dichloride downregulates gene NUF2. Compound Dibutyl tin dichloride downregulates gene IL19. Compound Dibutyl tin dichloride downregulates gene CCL2. Compound Dibutyl tin dichloride downregulates gene MKI67. Compound Dibutyl tin dichloride downregulates gene UBE2T. Compound Dibutyl tin dichloride downregulates gene PHGDH. Compound Dibutyl tin dichloride downregulates gene UBE2C. Compound Dibutyl tin dichloride downregulates gene AHRR. Compound Dibutyl tin dichloride downregulates gene MYBL1. Compound Dibutyl tin dichloride downregulates gene EXO1. Compound Dibutyl tin dichloride downregulates gene H3C3. Compound Dibutyl tin dichloride downregulates gene ANXA8L1. Compound Dibutyl tin dichloride downregulates gene COL16A1. Compound Dibutyl tin dichloride downregulates gene VAV3. Compound Dibutyl tin dichloride downregulates gene NCAPG. Compound Dibutyl tin dichloride downregulates gene H2BC7. Compound Dibutyl tin dichloride downregulates gene CXCL3. Compound Dibutyl tin dichloride downregulates gene SGO2. Compound Dibutyl tin dichloride downregulates gene E2F8. Compound Dibutyl tin dichloride downregulates gene KIF18B. Compound Dibutyl tin dichloride downregulates gene NUSAP1. Compound Dibutyl tin dichloride downregulates gene PCNA. Compound Dibutyl tin dichloride downregulates gene BMF. Compound Dibutyl tin dichloride downregulates gene KNL1. Compound Dibutyl tin dichloride downregulates gene MCM10. Compound Dibutyl tin dichloride downregulates gene CDC20. Compound Dibutyl tin dichloride downregulates gene CCNB1. Compound Dibutyl tin dichloride downregulates gene ESPL1. Compound Dibutyl tin dichloride downregulates gene CCL20. Compound Dibutyl tin dichloride downregulates gene CTTNBP2. Compound Dibutyl tin dichloride downregulates gene CYP1B1. Compound Dibutyl tin dichloride downregulates gene RACGAP1. Compound Dibutyl tin dichloride downregulates gene SKA1. Compound Dibutyl tin dichloride downregulates gene CEP55. Compound Dibutyl tin dichloride downregulates gene H3C2. Compound Dibutyl tin dichloride downregulates gene CDK1. Compound Dibutyl tin dichloride downregulates gene CXCL5. Compound Dibutyl tin dichloride downregulates gene TMC5. Compound Dibutyl tin dichloride downregulates gene DTL. Compound Dibutyl tin dichloride downregulates gene KIF11. Compound Dibutyl tin dichloride downregulates gene TNFAIP2. Compound Dibutyl tin dichloride downregulates gene BUB1B. Compound Dibutyl tin dichloride downregulates gene PRC1. Compound Dibutyl tin dichloride downregulates gene IFIT1. Compound Dibutyl tin dichloride downregulates gene ARHGAP45. Compound Dibutyl tin dichloride downregulates gene ZNF185. Compound Dibutyl tin dichloride downregulates gene HMMR. Compound Dibutyl tin dichloride downregulates gene KIF2C. Compound Dibutyl tin dichloride downregulates gene LTB. Compound Dibutyl tin dichloride downregulates gene CCNF. Compound Dibutyl tin dichloride downregulates gene DEFB1. Compound Dibutyl tin dichloride downregulates gene DEPDC1. Compound Dibutyl tin dichloride downregulates gene SPC25. Compound Dibutyl tin dichloride downregulates gene LAPTM5. Compound Dibutyl tin dichloride upregulates gene ANKRD36B. Compound Dibutyl tin dichloride downregulates gene KRT4. Compound Dibutyl tin dichloride upregulates gene CA9. Compound Dibutyl tin dichloride upregulates gene PHLDA2. Compound Dibutyl tin dichloride upregulates gene TPI1. Compound Dibutyl tin dichloride upregulates gene ZNF469. Compound Dibutyl tin dichloride upregulates gene ABCA1. Compound Dibutyl tin dichloride upregulates gene HDAC9. Compound Dibutyl tin dichloride upregulates gene SLC22A1. Compound Dibutyl tin dichloride upregulates gene GPAT3. Compound Dibutyl tin dichloride upregulates gene ZNF114. Compound Dibutyl tin dichloride upregulates gene ANKRD36B. Compound Dibutyl tin dichloride upregulates gene EGF. Compound Dibutyl tin dichloride upregulates gene TRIM16L. Compound Dibutyl tin dichloride upregulates gene NMRAL2P. Compound Dibutyl tin dichloride upregulates gene PLIN2. Compound Dibutyl tin dichloride upregulates gene UGT1A3. Compound Dibutyl tin dichloride upregulates gene ASTN2. Compound Dibutyl tin dichloride upregulates gene STC1. Compound Dibutyl tin dichloride upregulates gene GDF15. Compound Dibutyl tin dichloride upregulates gene PDGFB. Compound Dibutyl tin dichloride upregulates gene IGFBP3. Compound Dibutyl tin dichloride upregulates gene SULF1. Compound Dibutyl tin dichloride upregulates gene GLI1. Compound Dibutyl tin dichloride upregulates gene UCHL1. Compound Dibutyl tin dichloride upregulates gene SOCS1. Compound Dibutyl tin dichloride upregulates gene MMP1. Compound Dibutyl tin dichloride upregulates gene KCNQ3. Compound Dibutyl tin dichloride upregulates gene ANKRD20A17P. Compound Dibutyl tin dichloride upregulates gene LINC02806. Compound Dibutyl tin dichloride upregulates gene LY96. Compound Dibutyl tin dichloride upregulates gene GPX2. Compound Dibutyl tin dichloride upregulates gene CHN1. Compound Dibutyl tin dichloride upregulates gene TNFRSF9. Compound Dibutyl tin dichloride upregulates gene LAMP3. Compound Dibutyl tin dichloride upregulates gene IL13RA2. Compound Dibutyl tin dichloride upregulates gene CSF2. Compound Dibutyl tin dichloride upregulates gene TXNRD1. Compound Dibutyl tin dichloride upregulates gene SGK2. Compound Dibutyl tin dichloride upregulates gene TRAF1. Compound Dibutyl tin dichloride upregulates gene F2RL2. Compound Dibutyl tin dichloride upregulates gene POPDC3. Compound Dibutyl tin dichloride upregulates gene POU5F2. Compound Dibutyl tin dichloride upregulates gene TREM1. Compound Dibutyl tin dichloride upregulates gene SLC7A11. Compound Dibutyl tin dichloride upregulates gene HMOX1. Compound Dibutyl tin dichloride downregulates gene CCNE2. Compound Dibutyl tin dichloride downregulates gene KRT4. Compound Dibutyl tin dichloride downregulates gene ZNF367. Compound Dibutyl tin dichloride downregulates gene CCL2. Compound Dibutyl tin dichloride downregulates gene MCM10. Compound Dibutyl tin dichloride downregulates gene IFIT1. Compound Dibutyl tin dichloride downregulates gene SERPINB4. Compound Dibutyl tin dichloride downregulates gene BDH1. Compound Dibutyl tin dichloride downregulates gene FEN1. Compound Dibutyl tin dichloride downregulates gene STEAP4. Compound Dibutyl tin dichloride downregulates gene CXCL14. Compound Dibutyl tin dichloride downregulates gene CDCA7. Compound Dibutyl tin dichloride downregulates gene CAVIN2. Compound Dibutyl tin dichloride upregulates gene ADAM12. Compound Dibutyl tin dichloride upregulates gene SLC44A4. Compound Dibutyl tin dichloride upregulates gene HDAC9. Compound Dibutyl tin dichloride upregulates gene INA. Compound Dibutyl tin dichloride upregulates gene LCAL1. Compound Dibutyl tin dichloride upregulates gene EGLN3. Compound Dibutyl tin dichloride upregulates gene SEMA6A. Compound Dibutyl tin dichloride upregulates gene NMRAL2P. Compound Dibutyl tin dichloride upregulates gene IGFBP3. Compound Dibutyl tin dichloride upregulates gene SOCS1. Compound Dibutyl tin dichloride upregulates gene ITGB3. Compound Dibutyl tin dichloride upregulates gene TNFRSF9. Compound Dibutyl tin dichloride upregulates gene ADM. Compound Dibutyl tin dichloride upregulates gene CSF2. Compound Dibutyl tin dichloride upregulates gene SGK2. Compound Dibutyl tin dichloride upregulates gene POPDC3. Compound Dibutyl tin dichloride upregulates gene POU5F2. Compound Dibutyl tin dichloride upregulates gene WFDC2. Compound Dibutyl tin dichloride upregulates gene TNFSF13B. Compound Dibutyl tin dichloride upregulates gene HMOX1. Compound Dibutyl tin dichloride upregulates gene CA9. Compound Dibutyl tin dichloride upregulates gene IL6. Compound Dibutyl tin dichloride upregulates gene ADAM8. Compound Dibutyl tin dichloride upregulates gene FTL. Compound Dibutyl tin dichloride upregulates gene LCP1. Compound Dibutyl tin dichloride upregulates gene C15orf48. Compound Dibutyl tin dichloride upregulates gene ALDH8A1. Compound Dibutyl tin dichloride upregulates gene IL23A. Compound Dibutyl tin dichloride upregulates gene PDGFB. Compound Dibutyl tin dichloride upregulates gene HCAR3. Compound Dibutyl tin dichloride upregulates gene ANKRD20A17P. Compound Dibutyl tin dichloride upregulates gene GPX2. Compound Dibutyl tin dichloride upregulates gene MAP2. Compound Dibutyl tin dichloride upregulates gene ABCC3. Compound Dibutyl tin dichloride upregulates gene IL13RA2. Compound Dibutyl tin dichloride upregulates gene PMAIP1. Compound Dibutyl tin dichloride upregulates gene TRAF1. Compound Dibutyl tin dichloride upregulates gene CRYAB. Compound Dibutyl tin dichloride upregulates gene DDIT4. Compound Dibutyl tin dichloride upregulates gene ACADVL. Compound Dibutyl tin dichloride upregulates gene LPIN3. Compound Dibutyl tin dichloride upregulates gene IL7R. Compound Dibutyl tin dichloride upregulates gene MINDY1. Compound Dibutyl tin dichloride upregulates gene EGF. Compound Dibutyl tin dichloride upregulates gene TRIM16L. Compound Dibutyl tin dichloride upregulates gene SQSTM1. Compound Dibutyl tin dichloride upregulates gene ISG20. Compound Dibutyl tin dichloride upregulates gene NRCAM. Compound Dibutyl tin dichloride upregulates gene STC1. Compound Dibutyl tin dichloride upregulates gene KCNQ3. Compound Dibutyl tin dichloride upregulates gene DMTN. Compound Dibutyl tin dichloride upregulates gene POU5F1. Compound Dibutyl tin dichloride upregulates gene LY96. Compound Dibutyl tin dichloride upregulates gene INPP4B. Compound Dibutyl tin dichloride upregulates gene GBP5. Compound Dibutyl tin dichloride upregulates gene RGPD3. Compound Dibutyl tin dichloride upregulates gene TXNRD1. Compound Dibutyl tin dichloride upregulates gene PPP1R15A. Compound Dibutyl tin dichloride upregulates gene SMIM22. Compound Dibutyl tin dichloride upregulates gene CLU. Compound Dibutyl tin dichloride upregulates gene TREM1. Compound Dibutyl tin dichloride upregulates gene KCNK1. Compound Dibutyl tin dichloride upregulates gene LINC00520. Compound Dibutyl tin dichloride upregulates gene AGR2. Compound Dibutyl tin dichloride upregulates gene NANOG. Compound Dibutyl tin dichloride upregulates gene PHLDA2. Compound Dibutyl tin dichloride upregulates gene NCF2. Compound Dibutyl tin dichloride upregulates gene TPI1. Compound Dibutyl tin dichloride upregulates gene ZNF469. Compound Dibutyl tin dichloride upregulates gene FTH1. Compound Dibutyl tin dichloride upregulates gene SLC22A1. Compound Dibutyl tin dichloride upregulates gene GPAT3. Compound Dibutyl tin dichloride upregulates gene CXCL8. Compound Dibutyl tin dichloride upregulates gene PLIN2. Compound Dibutyl tin dichloride upregulates gene TNFAIP2. Compound Dibutyl tin dichloride upregulates gene PPP1R13B. Compound Dibutyl tin dichloride upregulates gene ABCC2. Compound Dibutyl tin dichloride upregulates gene UCHL1. Compound Dibutyl tin dichloride upregulates gene SLIT2. Compound Dibutyl tin dichloride upregulates gene MMP1. Compound Dibutyl tin dichloride upregulates gene ST3GAL1. Compound Dibutyl tin dichloride upregulates gene CDH2. Compound Dibutyl tin dichloride upregulates gene F2RL2. Compound Dibutyl tin dichloride upregulates gene ENO2. Compound Dibutyl tin dichloride upregulates gene DENND3. Compound Dibutyl tin dichloride downregulates gene APLN. Compound Dibutyl tin dichloride downregulates gene NEFL. Compound Dibutyl tin dichloride downregulates gene SERPINB4. Compound Dibutyl tin dichloride downregulates gene TMEM97. Compound Dibutyl tin dichloride downregulates gene CYP1B1. Compound Dibutyl tin dichloride downregulates gene ATP12A. Compound Dibutyl tin dichloride downregulates gene KRT4. Compound Dibutyl tin dichloride downregulates gene CCL2. Compound Dibutyl tin dichloride downregulates gene H2AC11. Compound Dibutyl tin dichloride downregulates gene CYP24A1. Compound Dibutyl tin dichloride downregulates gene IFIT1. Compound Dibutyl tin dichloride downregulates gene MSMO1. Compound Dibutyl tin dichloride downregulates gene CXCL14. Compound Dibutyl tin dichloride downregulates gene ASNS. Compound Dibutyl tin dichloride downregulates gene S100A8. Compound Dibutyl tin dichloride downregulates gene SMIM19. Compound Dibutyl tin dichloride downregulates gene ZNF367. Compound Dibutyl tin dichloride downregulates gene HMGCS1. Compound Dibutyl tin dichloride downregulates gene CXCL11. Compound Dibutyl tin dichloride downregulates gene SERPINB3. Compound Dibutyl tin dichloride upregulates gene IGHV3-23. Compound Dibutyl tin dichloride downregulates gene KRT6A. Compound Dibutyl tin dichloride downregulates gene KRT14. Compound Dibutyl tin dichloride downregulates gene KRT17. Compound Dibutyl tin dichloride downregulates gene KRT5. Compound Dibutyl tin dichloride upregulates gene ABL1. Compound Dibutyl tin dichloride upregulates gene TPRKB. Compound Dibutyl tin dichloride upregulates gene IFIT1. Compound Dibutyl tin dichloride upregulates gene S100A4. Compound Dibutyl tin dichloride upregulates gene IFI44. Compound Dibutyl tin dichloride upregulates gene IL36B. Compound Dibutyl tin dichloride upregulates gene PLK3. Compound Dibutyl tin dichloride upregulates gene H2BC21. Compound Dibutyl tin dichloride downregulates gene IGHV3-23. Compound Dibutyl tin dichloride downregulates gene S100A2. Compound Dibutyl tin dichloride downregulates gene KRT14. Compound Dibutyl tin dichloride downregulates gene KRT5. Compound Dibutyl tin dichloride downregulates gene TLCD3A. Compound Dibutyl tin dichloride downregulates gene KRT6A. Compound Dibutyl tin dichloride downregulates gene GJB1. Compound Dibutyl tin dichloride upregulates gene IGF1R. Compound Dibutyl tin dichloride upregulates gene MGC70870. Compound Dibutyl tin dichloride upregulates gene PAX8. Compound Dibutyl tin dichloride upregulates gene HDAC9. Compound Dibutyl tin dichloride upregulates gene RELN. Compound Dibutyl tin dichloride upregulates gene CYP19A1. Compound Dibutyl tin dichloride '" + "{'Study': 'EUT101',\n", + " 'Treatment compound': 'Amino_nitroanilino_ethanol',\n", + " 'Treatment concentration': 180.0,\n", + " 'Treatment timepoint': 24,\n", + " 'Control compound': 'DMSO03',\n", + " 'Control concentration': 0.0,\n", + " 'Control timepoint': 24,\n", + " 'Filename': 'EUT101_Amino_nitroanilino_ethanol_180_24_DMSO03_0_24.csv',\n", + " 'Case study': 'CS11',\n", + " 'Index in compound list': 31,\n", + " 'Comments': nan,\n", + " 'Parent compound': '2-(4-amino-2-nitroanilino)ethanol',\n", + " \"Harris's Preferred Name (ChEMBL/ECHA)\": nan,\n", + " 'SMILES': \"{'original': 'Nc1ccc(NCCO)c([N+](=O)[O-])c1', 'canonical': 'Nc1ccc(NCCO)c([N+](=O)[O-])c1'}\",\n", + " 'InChI key': 'GZGZVOLBULPDFD-UHFFFAOYSA-N',\n", + " 'CAS number': '4-1-2871',\n", + " 'Starting substance': '2-(4-amino-2-nitroanilino)ethanol',\n", + " \"Barbara's prefered name\": '2-(4-amino-2-nitroanilino)ethanol',\n", + " 'Alternative name': '2-((4-AMino-2-nitrophenyl)aMino)ethanol',\n", + " 'Starting substance SMILES': \"{'original': '[N+](=O)([O-])c1c(ccc(c1)N)NCCO', 'canonical': 'Nc1ccc(NCCO)c([N+](=O)[O-])c1'}\",\n", + " 'Starting substance CAS number': '2871-01-04',\n", + " 'Supplier': 'eNovation Chemicals LLC',\n", + " 'Cat no': 'COMH93D67389',\n", + " 'Lot no': 'B02619596',\n", + " 'Form': 'S',\n", + " 'Storage pure compound': 'rT',\n", + " 'Solvent': 'DMSO',\n", + " 'Stock concentration': 0.06,\n", + " 'Stock concentration unit': 'M',\n", + " 'Stock aliquot storage': -20,\n", + " 'Purity': 95.0,\n", + " 'Molar weight': 197.19,\n", + " 'Molecular formula': 'C8H11O3N3',\n", + " 'MDLNUM': 'MFCD00071801',\n", + " 'Code': 'CS11-24',\n", + " 'Dataset id': '192c9770-9d24-4a46-ad7b-3ef17fd85009',\n", + " 'Compound': 'inchikey:GZGZVOLBULPDFD-UHFFFAOYSA-N',\n", + " 'Assay': 'study:EUT101',\n", + " 'Gene': 'gene:UGT1A8',\n", + " 'Endpoint': 'endpoint:deregulation',\n", + " 'Endpoint_value': 'value:positive'}" ] }, - "execution_count": 59, + "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "context_str[:45500]" + "measure_groups[0]" ] }, { "cell_type": "code", - "execution_count": 47, + "execution_count": 28, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "71\n", - "(rdflib.term.Literal('WHIVNJATOVLWBW-SNAWJCMRSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Butanone_oxime'))\n", - "(rdflib.term.Literal('YMLFYGFCXGNERH-UHFFFAOYSA-K', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Butyl_tin_trichloride'))\n", - "(rdflib.term.Literal('RJGHQTVXGKYATR-UHFFFAOYSA-L', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Dibutyl_tin_dichloride'))\n", - "(rdflib.term.Literal('PDQAZBWRQCGBEV-UHFFFAOYSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Imidazolidinethione'))\n", - "(rdflib.term.Literal('YHMYGUUIMTVXNW-UHFFFAOYSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Mercapto_benzimidazole'))\n", - "(rdflib.term.Literal('XLSZMDLNRCVEIJ-UHFFFAOYSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Methylimidazole_two'))\n", - "(rdflib.term.Literal('GCTFWCDSFPMHHS-UHFFFAOYSA-M', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Tributyl_tin_chloride'))\n", - "(rdflib.term.Literal('ZAJAQTYSTDTMCU-UHFFFAOYSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Aminobenzenesulfonic_acid'))\n", - "(rdflib.term.Literal('UCMIRNVEIXFBKS-UHFFFAOYSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Aminopropanoic_acid'))\n", - "(rdflib.term.Literal('GZGZVOLBULPDFD-UHFFFAOYSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Amino_nitroanilino_ethanol'))\n", - "(rdflib.term.Literal('RNLHGQLZWXBQNY-UHFFFAOYSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Amino_trimethyl_cyclohexylmethyl_amine'))\n", - "(rdflib.term.Literal('QIGBRXMKCJKVMJ-UHFFFAOYSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Benzenediol'))\n", - "(rdflib.term.Literal('JQVAPEJNIZULEK-UHFFFAOYSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Benzenediol_chloro'))\n", - "(rdflib.term.Literal('SRPWOOOHEPICQU-UHFFFAOYSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Benzenetricarboxylic_anhydride'))\n", - "(rdflib.term.Literal('DMSMPAJRVJJAGA-UHFFFAOYSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Benzisothiazol'))\n", - "(rdflib.term.Literal('YOUGRGFIHBUKRS-UHFFFAOYSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Benzyltrimethylammonium_chloride'))\n", - "(rdflib.term.Literal('WHGYBXFWUBPSRW-VOXAOYDDSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Beta_cyclodextrin'))\n", - "(rdflib.term.Literal('OAYXUHPQHDHDDZ-UHFFFAOYSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Butoxyethoxy_ethanol'))\n", - "(rdflib.term.Literal('JBKVHLHDHHXQEQ-UHFFFAOYSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:caprolactam'))\n", - "(rdflib.term.Literal('PVNIIMVLHYAWGP-UHFFFAOYSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Carboxylpyridine'))\n", - "(rdflib.term.Literal('VXIVSQZSERGHQP-UHFFFAOYSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Chloroacetamide'))\n", - "(rdflib.term.Literal('FOCAUTSVDIKZOP-UHFFFAOYSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Monochloroacetic_acid'))\n", - "(rdflib.term.Literal('PNPCRKVUWYDDST-UHFFFAOYSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Chloro_aniline'))\n", - "(rdflib.term.Literal('CFKMVGJGLGKFKI-UHFFFAOYSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Chloro_methylphenol'))\n", - "(rdflib.term.Literal('ZFXYFBGIUFBOJW-UHFFFAOYSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Dimethyl_tetrahydro_purine_dione'))\n", - "(rdflib.term.Literal('LNTHITQWFMADLM-UHFFFAOYSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Gallic_acid'))\n", - "(rdflib.term.Literal('XXMIOPMDWAUFGU-UHFFFAOYSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Hexanediol'))\n", - "(rdflib.term.Literal('PLIKAWJENQZMHA-UHFFFAOYSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Hydroxy_aminobenzene'))\n", - "(rdflib.term.Literal('LVTYICIALWPMFW-UHFFFAOYSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Propanediamine'))\n", - "(rdflib.term.Literal('OUYCCCASQSFEME-UHFFFAOYSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:L_Tyrosine'))\n", - "(rdflib.term.Literal('XZWYZXLIPXDOLR-UHFFFAOYSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Metformin_hydrochloride'))\n", - "(rdflib.term.Literal('SBGKURINHGJRFN-UHFFFAOYSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Methanesulfinic_acid'))\n", - "(rdflib.term.Literal('YFNKIDBQEZZDLK-UHFFFAOYSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Methoxyethoxy_ethane'))\n", - "(rdflib.term.Literal('JLGLQAWTXXGVEM-UHFFFAOYSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Methoxyethoxy_ethoxy_ethanol'))\n", - "(rdflib.term.Literal('LMYRWZFENFIFIT-UHFFFAOYSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Methylbenzene_sulfonamide'))\n", - "(rdflib.term.Literal('GPNYZBKIGXGYNU-UHFFFAOYSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Methylenebis_ethyl_tert_butylphenol'))\n", - "(rdflib.term.Literal('BEGLCMHJXHIJLR-UHFFFAOYSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Methyl_isothiazolin_one'))\n", - "(rdflib.term.Literal('YDONNITUKPKTIG-UHFFFAOYSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Nitrilotrimethanediyl_tris_phosphonic_acid'))\n", - "(rdflib.term.Literal('FGVVTMRZYROCTH-UHFFFAOYSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Oxide_pyridinethiol'))\n", - "(rdflib.term.Literal('RUOJZAUFBMNUDX-UHFFFAOYSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Propanediol_carbonate'))\n", - "(rdflib.term.Literal('MAGFQRLKWCCTQJ-UHFFFAOYSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Sodium_vinylbenzenesulphonate'))\n", - "(rdflib.term.Literal('HXJUTPCZVOIRIF-UHFFFAOYSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Sulfolane'))\n", - "(rdflib.term.Literal('MQJKPEGWNLWLTK-UHFFFAOYSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Sulfonylbisbenzenamine'))\n", - "(rdflib.term.Literal('RFKITWRHKUYMRJ-UHFFFAOYSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Tartrazine'))\n", - "(rdflib.term.Literal('HUHGPYXAVBJSJV-UHFFFAOYSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Triazine_triethanol'))\n", - "(rdflib.term.Literal('KLSJWNVTNUYHDU-UHFFFAOYSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Triazol_ylamine'))\n", - "(rdflib.term.Literal('ZIBGPFATKBEMQZ-UHFFFAOYSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Triethylene_glycol'))\n", - "(rdflib.term.Literal('QIVBCDIJIAJPQS-VIFPVBQESA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Tryptophan'))\n", - "(rdflib.term.Literal('AVKUERGKIZMTKX-YKLVJOERSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Ampicillin_Trihydrate'))\n", - "(rdflib.term.Literal('IAOZJIPTCAWIRG-QWRGUYRKSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Aspartame'))\n", - "(rdflib.term.Literal('XNEFYCZVKIDDMS-UHFFFAOYSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Avobenzone'))\n", - "(rdflib.term.Literal('RYYVLZVUVIJVGH-UHFFFAOYSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Caffeine'))\n", - "(rdflib.term.Literal('MMOXZBCLCQITDF-UHFFFAOYSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:DEET'))\n", - "(rdflib.term.Literal('FBPFZTCFMRRESA-IANNHFEVSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:D_Sorbitol'))\n", - "(rdflib.term.Literal('KCXVZYZYPLLWCC-UHFFFAOYSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:EDTA_EGTA'))\n", - "(rdflib.term.Literal('TZBJGXHYKVUXJN-UHFFFAOYSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Genistein'))\n", - "(rdflib.term.Literal('FMJSMJQBSVNSBF-UHFFFAOYSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Octocrylene'))\n", - "(rdflib.term.Literal('BPLBGHOLXOTWMN-MBNYWOFBSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Penicillin_VK'))\n", - "(rdflib.term.Literal('WPYMKLBDIGXBTP-UHFFFAOYSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Sodium_Benzoate'))\n", - "(rdflib.term.Literal('BAQAVOSOZGMPRM-RMEMJPMPSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Sucralose'))\n", - "(rdflib.term.Literal('YAPQBXQYLJRXSA-UHFFFAOYSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Theobromine'))\n", - "(rdflib.term.Literal('IGXZMQCLUNTWCC-UHFFFAOYSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Direct_Red_81'))\n", - "(rdflib.term.Literal('BACYUWVYYTXETD-UHFFFAOYSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Dodecanoyl_methylglycine'))\n", - "(rdflib.term.Literal('IAJNXBNRYMEYAZ-UHFFFAOYSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Ethyl_cyano_diphenylacrylate'))\n", - "(rdflib.term.Literal('DUKPKQFHJQGTGU-UHFFFAOYSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Hexyl_salicylate'))\n", - "(rdflib.term.Literal('WDQFELCEOPFLCZ-UHFFFAOYSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Hydroxyethyl_pyrrolidinone'))\n", - "(rdflib.term.Literal('ZMSQJSMSLXVTKN-UHFFFAOYSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Oxydiethylene_bis_morpholine'))\n", - "(rdflib.term.Literal('XQVWYOYUZDUNRW-UHFFFAOYSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Phenyl_naphthylamine'))\n", - "(rdflib.term.Literal('CVHZOJJKTDOEJC-UHFFFAOYSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Saccharin'))\n", - "(rdflib.term.Literal('UZFMOKQJFYMBGY-UHFFFAOYSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:TEMPO'))\n", - "(rdflib.term.Literal('DZLFLBLQUQXARW-UHFFFAOYSA-N', datatype=rdflib.term.URIRef('http://www.w3.org/2001/XMLSchema#string')), rdflib.term.URIRef('compound:Tetrabutylammonium_bromide'))\n" + "0\n" ] } ],