Repository: biocypher/biocypher (language: python)

Issue:
YAML spec: single vs double quote and escape
YAML makes a difference between single and double quotes with respect to escaping characters: https://stackoverflow.com/questions/19109912/yaml-do-i-need-quotes-for-strings-in-yaml

"Single quotes let you put almost any character in your string, and won't try to parse escape codes. '\n' would be returned as the string \n . Double quotes parse escape codes. "\n" would be returned as a line feed character."

We need to account for both possibilities, otherwise we end up "double escaping" when writing files.


Discussion / hints:

Fix patch:
diff --git a/.bumpversion.cfg b/.bumpversion.cfg
index c7882f31..5d254eff 100644
--- a/.bumpversion.cfg
+++ b/.bumpversion.cfg
@@ -1,5 +1,5 @@
 [bumpversion]
-current_version = 0.4.5
+current_version = 0.5.4
 commit = True
 tag = True
 files = pyproject.toml
diff --git a/biocypher/__init__.py b/biocypher/__init__.py
index d092710e..52c067da 100644
--- a/biocypher/__init__.py
+++ b/biocypher/__init__.py
@@ -9,7 +9,7 @@
 # Distributed under MIT licence, see the file `LICENSE`.
 #
 """
-Graph database standard for molecular biology
+BioCypher: a unifying framework for biomedical knowledge graphs.
 """
 
 __all__ = [
@@ -20,9 +20,21 @@
     'logfile',
     'log',
     'Driver',
+    'BioCypher',
 ]
 
+from ._core import BioCypher
 from ._config import config, module_data
-from ._driver import Driver
-from ._logger import log, logfile
+from ._logger import log, logger, logfile
 from ._metadata import __author__, __version__
+
+
+class Driver(BioCypher):
+
+    # initialise parent class but log a warning
+    def __init__(self, *args, **kwargs):
+        logger.warning(
+            'The class `Driver` is deprecated and will be removed in a future '
+            'release. Please use `BioCypher` instead.'
+        )
+        super().__init__(*args, **kwargs)
diff --git a/biocypher/_config/__init__.py b/biocypher/_config/__init__.py
index 91274859..584a30a5 100644
--- a/biocypher/_config/__init__.py
+++ b/biocypher/_config/__init__.py
@@ -17,12 +17,38 @@
 
 from typing import Any, Optional
 import os
+import re
+import warnings
 
 import yaml
 import appdirs
 
 __all__ = ['module_data', 'module_data_path', 'read_config', 'config', 'reset']
 
+_USER_CONFIG_DIR = appdirs.user_config_dir('biocypher', 'saezlab')
+_USER_CONFIG_FILE = os.path.join(_USER_CONFIG_DIR, 'conf.yaml')
+
+
+class MyLoader(yaml.SafeLoader):
+    def construct_scalar(self, node):
+        # Check if the scalar contains double quotes and an escape sequence
+        value = super().construct_scalar(node)
+        q = bool(node.style == '"')
+        b = bool('\\' in value.encode('unicode_escape').decode('utf-8'))
+        if q and b:
+            warnings.warn(
+                (
+                    'Double quotes detected in YAML configuration scalar: '
+                    f"{value.encode('unicode_escape')}. "
+                    'These allow escape sequences and may cause problems, for '
+                    "instance with the Neo4j admin import files (e.g. '\\t'). "
+                    'Make sure you wanted to do this, and use single quotes '
+                    'whenever possible.'
+                ),
+                category=UserWarning
+            )
+        return value
+
 
 def module_data_path(name: str) -> str:
     """
@@ -50,7 +76,7 @@ def _read_yaml(path: str) -> Optional[dict]:
 
         with open(path, 'r') as fp:
 
-            return yaml.load(fp.read(), Loader=yaml.FullLoader)
+            return yaml.load(fp.read(), Loader=MyLoader)
 
 
 def read_config() -> dict:
@@ -58,25 +84,26 @@ def read_config() -> dict:
     Read the module config.
 
     Read and merge the built-in default, the user level and directory level
-    configuration.
+    configuration, with the later taking precendence over the former.
 
     TODO explain path configuration
     """
 
     defaults = module_data('biocypher_config')
-    user_confdir = appdirs.user_config_dir('biocypher', 'saezlab')
-    user = _read_yaml(os.path.join(user_confdir, 'biocypher_config.yaml')) or {}
-    # check if there is a local config file `biocypher_config.yaml` in the
-    # current working directory # TODO account for .yml?
-    if os.path.exists('biocypher_config.yaml'):
-        local = _read_yaml('biocypher_config.yaml')
-    elif os.path.exists('config/biocypher_config.yaml'):
-        local = _read_yaml('config/biocypher_config.yaml')
-    else:
-        local = {}
-
-    defaults.update(user)
-    defaults.update(local)
+    user = _read_yaml(_USER_CONFIG_FILE) or {}
+    # TODO account for .yml?
+    local = _read_yaml('biocypher_config.yaml'
+                      ) or _read_yaml('config/biocypher_config.yaml') or {}
+
+    for key in defaults:
+
+        value = local[key] if key in local else user[key] if key in user else None
+
+        if value is not None:
+            if type(defaults[key]) == str: # first level config (like title)
+                defaults[key] = value
+            else:
+                defaults[key].update(value)
 
     return defaults
 
@@ -98,7 +125,9 @@ def config(*args, **kwargs) -> Optional[Any]:
 
         return result[0] if len(result) == 1 else result
 
-    globals()['_config'].update(kwargs)
+    for key, value in kwargs.items():
+
+        globals()['_config'][key].update(value)
 
 
 def reset():
@@ -110,3 +139,11 @@ def reset():
 
 
 reset()
+
+
+def update_from_file(path: str):
+    """
+    Update the module configuration from a YAML file.
+    """
+
+    config(**_read_yaml(path))
diff --git a/biocypher/_config/biocypher_config.yaml b/biocypher/_config/biocypher_config.yaml
index 4ca9cb97..e8dc465d 100644
--- a/biocypher/_config/biocypher_config.yaml
+++ b/biocypher/_config/biocypher_config.yaml
@@ -1,54 +1,96 @@
 Title: BioCypher python module configuration file
 
-# Offline mode: do not connect to a running Neo4j instance
-# Can be used e.g. for writing CSV files for admin import
-offline: true
-
-# Strict mode: do not allow to create new nodes or relationships without
-# specifying source, version, and license parameters
-strict_mode: false
-
-# Logging granularity
-# Set debug to true if more granular logging is desired
-debug: true
-
-# Set to change the log directory
-logdir: biocypher-log
-
-# Set to change the output directory
-outdir: biocypher-out
-
-# Ontology configuration
-head_ontology:
-  url: https://raw.githubusercontent.com/biolink/biolink-model/master/biolink-model.owl.ttl
-  root_node: entity
-# tail_ontologies:
-#   so:
-#     url: test/so.owl
-#     head_join_node: sequence variant
-#     tail_join_node: sequence_variant
-#   mondo:
-#     url: test/mondo.owl
-#     head_join_node: disease
-#     tail_join_node: disease
-
-### Neo4j configuration ###
-# Neo4j connection credentials
-neo4j_uri: neo4j://localhost:7687
-neo4j_db: neo4j # DB name
-neo4j_user: neo4j # user name
-neo4j_pw: neo4j # password
-
-# Neo4j admin import batch writer settings
-neo4j_delimiter: '¦'
-neo4j_array_delimiter: '|'
-neo4j_quote_char: '"'
-
-# MultiDB functionality
-# Set to false for using community edition or older versions of Neo4j
-neo4j_multi_db: true
-
-
-# Import call prefixes
-# neo4j_import_call_bin_prefix: bin/
-# neo4j_import_call_file_prefix: path/to/files/
+## Some options are not used by default. Uncomment them to use them.
+
+biocypher:
+
+  ### Required parameters ###
+  ## DBMS type
+
+  dbms: neo4j
+
+  ## Schema configuration
+
+  schema_config_path: config/schema_config.yaml
+
+  ## Offline mode: do not connect to a running DBMS instance
+  ## Can be used e.g. for writing batch import files
+
+  offline: true
+
+  ## Strict mode: do not allow to create new nodes or relationships without
+  ## specifying source, version, and license parameters
+
+  strict_mode: false
+
+  ## Ontology configuration
+
+  head_ontology:
+    url: https://github.com/biolink/biolink-model/raw/master/biolink-model.owl.ttl
+    root_node: entity
+
+  ### Optional parameters ###
+  ## Logging granularity
+  ## Set debug to true if more granular logging is desired
+
+  debug: false
+
+  ## Set to change the log directory
+
+  # log_directory: biocypher-log
+
+  ## Set to change the output directory
+
+  # output_directory: biocypher-out
+
+  ## Optional tail ontologies
+
+  # tail_ontologies:
+  #   so:
+  #     url: test/so.owl
+  #     head_join_node: sequence variant
+  #     tail_join_node: sequence_variant
+  #   mondo:
+  #     url: test/mondo.owl
+  #     head_join_node: disease
+  #     tail_join_node: disease
+
+### DBMS configuration ###
+
+neo4j:
+
+  ### Neo4j configuration ###
+  ## Database name
+
+  database_name: neo4j
+
+  ## Wipe DB before import (offline mode: --force)
+
+  wipe: true
+
+  ## Neo4j authentication
+
+  uri: neo4j://localhost:7687
+  user: neo4j
+  password: neo4j
+
+  ## Neo4j admin import batch writer settings
+
+  delimiter: ';'
+  array_delimiter: '|'
+  quote_character: "'"
+
+  ## MultiDB functionality
+  ## Set to false for using community edition or older versions of Neo4j
+
+  multi_db: true
+
+  ## Import options
+
+  skip_duplicate_nodes: false
+  skip_bad_relationships: false
+
+  ## Import call prefixes
+
+  # import_call_bin_prefix: bin/
+  # import_call_file_prefix: path/to/files/
diff --git a/biocypher/_config/schema_config.yaml b/biocypher/_config/schema_config.yaml
deleted file mode 100644
index bc84c048..00000000
--- a/biocypher/_config/schema_config.yaml
+++ /dev/null
@@ -1,198 +0,0 @@
-Title: BioCypher graph schema configuration file
-
-# This configuration file establishes the hierarchy and connectivity in a newly
-# set-up BioCypher property graph database. Naming should adhere to Biolink
-# nomenclature (available at https://biolink.github.io/biolink-model/ or via
-# the python module 'biolink-model-toolkit').
-
-# The BioCypher YAML file specifies only the leaves of the hierarchy tree of
-# the desired graph; the hierarchical structure of entities will be derived
-# from the Biolink model. Thus, only the immediate constituents of the graph
-# need to be specified in the schema config.
-
-
-# ---
-# "Named Things"
-# ---
-# The implementation of named things is fairly straightforward, since they are
-# usually represented in node form, which is also the Biolink recommendation.
-# The same is not true for associations.
-#
-# A little more complex is the representation of aggregates of named things,
-# for instance in the case of functional protein complexes. These are represented
-# by so-called "mixins", which are not officially part of the hierarchy.
-
-protein: # this is the Biolink entity name and will be used as the node label
-         # do not modify or else the Biolink translation will fail
-  represented_as: node
-  preferred_id: uniprot # this is the CURIE URI prefix as given by Bioregistry
-  label_in_input: protein # modify this to allow translation
-  # this is the entity name (ie, type) in the input database
-
-drug:
-  represented_as: node
-  preferred_id: pubchem.compound
-  label_in_input: drug
-
-microRNA:
-  represented_as: node
-  preferred_id: mirbase.mature
-  label_in_input: mirna
-
-macromolecular complex mixin:
-  represented_as: node
-  preferred_id: complexportal
-  label_in_input: complex
-
-organism taxon:
-  represented_as: node
-  preferred_id: ncbitaxon
-  label_in_input: taxon
-
-publication:
-  represented_as: node
-  preferred_id: pubmed
-
-confidence level:
-  represented_as: node
-  preferred_id: id
-
-cell:
-  represented_as: node
-  preferred_id: cl
-
-disease:
-  represented_as: node
-  preferred_id: icd10
-
-pathway:
-   represented_as: node
-   preferred_id: [reactome, wikipathways]
-   label_in_input: [reactome, wikipathways]
-
-
-# ---
-# Associations
-# ---
-# Associations are not supposed to be represented in node form as per the
-# specifications of Biolink. However, in an analytic context, it often makes
-# sense to represent interactions as nodes in Neo4j, because it enables, for
-# instance, the annotation of a relationship with a publication as source of
-# evidence (also known as reification in the knowledge graph world).
-
-# The Biolink specifications for these types of relationships do
-# not go into depth; for example, the hierarchy for molecular interactions
-# (ie, "associations") ends at "PairwiseMolecularInteraction", there are no
-# explicit terms for protein-protein-interaction, phosphorylation, miRNA-
-# targeting, etc. Biolink proposes to use interaction identifiers from
-# ontologies, such as https://www.ebi.ac.uk/ols/ontologies/mi/.
-
-pairwise molecular interaction:
-  represented_as: node
-  preferred_id: intact
-
-disease to entity association mixin:
-  represented_as: edge
-  preferred_id: id
-  source: Disease
-  target: Protein
-
-entity to disease association mixin:
-  represented_as: edge
-  preferred_id: id
-  source: Protein
-  target: Disease
-
-
-# below not in biolink
-# will insert into custom biolink yaml, get hierarchy from there
-post translational interaction:
-  represented_as: node
-  preferred_id: id
-  source: Protein
-  # optional other sources/targets?
-  # source and target need to adhere to Biolink naming, otherwise the
-  # meta-graph will not work
-  target: Protein
-  label_in_input: post_translational
-  label_as_edge: INTERACTS_POST_TRANSLATIONAL
-phosphorylation:
-  represented_as: edge
-  preferred_id: id
-  source: Protein
-  target: Protein
-acetylation:
-  represented_as: edge
-  preferred_id: id
-  source: Protein
-  target: Protein
-
-post transcriptional interaction:
-  represented_as: node
-  preferred_id: id
-  source: microRNA
-  target: Protein
-  label_in_input: post_transcriptional
-  label_as_edge: INTERACTS_POST_TRANSCRIPTIONAL
-
-
-
-## CROssBAR list of source database attributes
-# UniProtKB (related MongoDB collections: Proteins):
-# accession(protein,UniProt)
-# ec
-# fullName
-# gene(symbol)
-# go
-# interpro
-# omim
-# orphanet
-# pfam
-# reactome
-# taxId
-
-# IntAct (related MongoDB collections: Intact):
-# accession(protein,UniProt)
-# confidence
-# gene(symbol)
-
-# EFO (related MongoDB collections: EFO disease terms):
-# doid
-# label
-# mesh
-# oboId
-# omimId
-# synonym
-
-# HPO (related MongoDB collections: HPO):
-# genesymbol
-# hpotermname
-# synonym
-
-# ChEMBL (related MongoDB collections: Molecules, Targets, Assays, Activities):
-# assayChemblId
-# assayType
-# assayOrganism
-# moleculeChemblId
-# canonicalSmiles
-# inchiKey
-# pchemblValue
-# targetChemblId
-# accession(protein,UniProt)
-# targetIds
-# DrugBank (related MongoDB collections: Drugs):
-# accession(target protein,UniProt)
-# chemblId
-# identifier
-# name
-# pubchemCid
-
-# PubChem (related MongoDB collections: PubChem Bioassay Sids, PubChem Biossays, PubChem Compounds, PubChem Substances):
-# canonicalSmiles
-# cid
-# inchiKey
-# accession(target protein,UniProt)
-# assayPubchemId
-# ncbiProteinId
-# sids
-# outcome
diff --git a/biocypher/_connect.py b/biocypher/_connect.py
new file mode 100644
index 00000000..88f3b3aa
--- /dev/null
+++ b/biocypher/_connect.py
@@ -0,0 +1,415 @@
+#!/usr/bin/env python
+
+#
+# Copyright 2021, Heidelberg University Clinic
+#
+# File author(s): Sebastian Lobentanzer
+#                 ...
+#
+# Distributed under MIT licence, see the file `LICENSE`.
+#
+"""
+BioCypher 'online' mode. Handles connection and manipulation of a running DBMS.
+"""
+from ._logger import logger
+
+logger.debug(f'Loading module {__name__}.')
+
+from typing import Optional
+from collections.abc import Iterable
+import itertools
+
+import neo4j_utils
+
+from . import _misc
+from ._config import config as _config
+from ._create import BioCypherEdge, BioCypherNode
+from ._ontology import Ontology
+from ._translate import Translator
+
+__all__ = ['_Neo4jDriver']
+
+
+class _Neo4jDriver():
+    """
+    Manages a BioCypher connection to a Neo4j database using the
+    ``neo4j_utils.Driver`` class.
+
+    Args:
+
+        database_name (str): The name of the database to connect to.
+
+        wipe (bool): Whether to wipe the database before importing.
+
+        uri (str): The URI of the database.
+
+        user (str): The username to use for authentication.
+
+        password (str): The password to use for authentication.
+
+        multi_db (bool): Whether to use multi-database mode.
+
+        fetch_size (int): The number of records to fetch at a time.
+
+        increment_version (bool): Whether to increment the version number.
+
+        ontology (Ontology): The ontology to use for mapping.
+
+        translator (Translator): The translator to use for mapping.
+
+    """
+    def __init__(
+        self,
+        database_name: str,
+        uri: str,
+        user: str,
+        password: str,
+        multi_db: bool,
+        ontology: Ontology,
+        translator: Translator,
+        wipe: bool = False,
+        fetch_size: int = 1000,
+        increment_version: bool = True,
+    ):
+
+        self._ontology = ontology
+        self._translator = translator
+
+        self._driver = neo4j_utils.Driver(
+            db_name=database_name,
+            db_uri=uri,
+            db_user=user,
+            db_passwd=password,
+            fetch_size=fetch_size,
+            wipe=wipe,
+            multi_db=multi_db,
+            raise_errors=True,
+        )
+
+        # check for biocypher config in connected graph
+
+        if wipe:
+
+            self.init_db()
+
+        if increment_version:
+
+            # set new current version node
+            self._update_meta_graph()
+
+    def _update_meta_graph(self):
+
+        logger.info('Updating Neo4j meta graph.')
+
+        # find current version node
+        db_version = self._driver.query(
+            'MATCH (v:BioCypher) '
+            'WHERE NOT (v)-[:PRECEDES]->() '
+            'RETURN v',
+        )
+        # add version node
+        self.add_biocypher_nodes(self._ontology)
+
+        # connect version node to previous
+        if db_version[0]:
+            previous = db_version[0][0]
+            previous_id = previous['v']['id']
+            e_meta = BioCypherEdge(
+                previous_id,
+                self._ontology.get_dict().get('node_id'),
+                'PRECEDES',
+            )
+            self.add_biocypher_edges(e_meta)
+
+    def init_db(self):
+        """
+        Used to initialise a property graph database by setting up new
+        constraints. Wipe has been performed by the ``neo4j_utils.Driver``
+        class` already.
+
+        Todo:
+            - set up constraint creation interactively depending on the
+                need of the database
+        """
+
+        logger.info('Initialising database.')
+        self._create_constraints()
+
+    def _create_constraints(self):
+        """
+        Creates constraints on node types in the graph. Used for
+        initial setup.
+
+        Grabs leaves of the ``schema_config.yaml`` file and creates
+        constraints on the id of all entities represented as nodes.
+        """
+
+        logger.info('Creating constraints for node types in config.')
+
+        # get structure
+        for leaf in self._ontology.extended_schema.items():
+            label = _misc.sentencecase_to_pascalcase(leaf[0])
+            if leaf[1]['represented_as'] == 'node':
+
+                s = (
+                    f'CREATE CONSTRAINT `{label}_id` '
+                    f'IF NOT EXISTS ON (n:`{label}`) '
+                    'ASSERT n.id IS UNIQUE'
+                )
+                self._driver.query(s)
+
+    def add_nodes(self, id_type_tuples: Iterable[tuple]) -> tuple:
+        """
+        Generic node adder method to add any kind of input to the graph via the
+        :class:`biocypher.create.BioCypherNode` class. Employs translation
+        functionality and calls the :meth:`add_biocypher_nodes()` method.
+
+        Args:
+            id_type_tuples (iterable of 3-tuple): for each node to add to
+                the biocypher graph, a 3-tuple with the following layout:
+                first, the (unique if constrained) ID of the node; second, the
+                type of the node, capitalised or PascalCase and in noun form
+                (Neo4j primary label, eg `:Protein`); and third, a dictionary
+                of arbitrary properties the node should possess (can be empty).
+
+        Returns:
+            2-tuple: the query result of :meth:`add_biocypher_nodes()`
+                - first entry: data
+                - second entry: Neo4j summary.
+        """
+
+        bn = self._translator.translate_nodes(id_type_tuples)
+        return self.add_biocypher_nodes(bn)
+
+    def add_edges(self, id_src_tar_type_tuples: Iterable[tuple]) -> tuple:
+        """
+        Generic edge adder method to add any kind of input to the graph
+        via the :class:`biocypher.create.BioCypherEdge` class. Employs
+        translation functionality and calls the
+        :meth:`add_biocypher_edges()` method.
+
+        Args:
+
+            id_src_tar_type_tuples (iterable of 5-tuple):
+
+                for each edge to add to the biocypher graph, a 5-tuple
+                with the following layout: first, the optional unique ID
+                of the interaction. This can be `None` if there is no
+                systematic identifier (which for many interactions is
+                the case). Second and third, the (unique if constrained)
+                IDs of the source and target nodes of the relationship;
+                fourth, the type of the relationship; and fifth, a
+                dictionary of arbitrary properties the edge should
+                possess (can be empty).
+
+        Returns:
+
+            2-tuple: the query result of :meth:`add_biocypher_edges()`
+
+                - first entry: data
+                - second entry: Neo4j summary.
+        """
+
+        bn = self._translator.translate_edges(id_src_tar_type_tuples)
+        return self.add_biocypher_edges(bn)
+
+    def add_biocypher_nodes(
+        self,
+        nodes: Iterable[BioCypherNode],
+        explain: bool = False,
+        profile: bool = False,
+    ) -> bool:
+        """
+        Accepts a node type handoff class
+        (:class:`biocypher.create.BioCypherNode`) with id,
+        label, and a dict of properties (passing on the type of
+        property, ie, ``int``, ``str``, ...).
+
+        The dict retrieved by the
+        :meth:`biocypher.create.BioCypherNode.get_dict()` method is
+        passed into Neo4j as a map of maps, explicitly encoding node id
+        and label, and adding all other properties from the 'properties'
+        key of the dict. The merge is performed via APOC, matching only
+        on node id to prevent duplicates. The same properties are set on
+        match and on create, irrespective of the actual event.
+
+        Args:
+            nodes:
+                An iterable of :class:`biocypher.create.BioCypherNode` objects.
+            explain:
+                Call ``EXPLAIN`` on the CYPHER query.
+            profile:
+                Do profiling on the CYPHER query.
+
+        Returns:
+            True for success, False otherwise.
+        """
+
+        try:
+
+            nodes = _misc.to_list(nodes)
+
+            entities = [node.get_dict() for node in nodes]
+
+        except AttributeError:
+
+            msg = 'Nodes must have a `get_dict` method.'
+            logger.error(msg)
+
+            raise ValueError(msg)
+
+        logger.info(f'Merging {len(entities)} nodes.')
+
+        entity_query = (
+            'UNWIND $entities AS ent '
+            'CALL apoc.merge.node([ent.node_label], '
+            '{id: ent.node_id}, ent.properties, ent.properties) '
+            'YIELD node '
+            'RETURN node'
+        )
+
+        method = 'explain' if explain else 'profile' if profile else 'query'
+
+        result = getattr(self._driver, method)(
+            entity_query,
+            parameters={
+                'entities': entities,
+            },
+        )
+
+        logger.info('Finished merging nodes.')
+
+        return result
+
+    def add_biocypher_edges(
+        self,
+        edges: Iterable[BioCypherEdge],
+        explain: bool = False,
+        profile: bool = False,
+    ) -> bool:
+        """
+        Accepts an edge type handoff class
+        (:class:`biocypher.create.BioCypherEdge`) with source
+        and target ids, label, and a dict of properties (passing on the
+        type of property, ie, int, string ...).
+
+        The individual edge is either passed as a singleton, in the case
+        of representation as an edge in the graph, or as a 4-tuple, in
+        the case of representation as a node (with two edges connecting
+        to interaction partners).
+
+        The dict retrieved by the
+        :meth:`biocypher.create.BioCypherEdge.get_dict()` method is
+        passed into Neo4j as a map of maps, explicitly encoding source
+        and target ids and the relationship label, and adding all edge
+        properties from the 'properties' key of the dict. The merge is
+        performed via APOC, matching only on source and target id to
+        prevent duplicates. The same properties are set on match and on
+        create, irrespective of the actual event.
+
+        Args:
+            edges:
+                An iterable of :class:`biocypher.create.BioCypherEdge` objects.
+            explain:
+                Call ``EXPLAIN`` on the CYPHER query.
+            profile:
+                Do profiling on the CYPHER query.
+
+        Returns:
+            `True` for success, `False` otherwise.
+        """
+
+        edges = _misc.ensure_iterable(edges)
+        edges = itertools.chain(*(_misc.ensure_iterable(i) for i in edges))
+
+        nodes = []
+        rels = []
+
+        try:
+
+            for e in edges:
+
+                if hasattr(e, 'get_node'):
+
+                    nodes.append(e.get_node())
+                    rels.append(e.get_source_edge().get_dict())
+                    rels.append(e.get_target_edge().get_dict())
+
+                else:
+
+                    rels.append(e.get_dict())
+
+        except AttributeError:
+
+            msg = 'Edges and nodes must have a `get_dict` method.'
+            logger.error(msg)
+
+            raise ValueError(msg)
+
+        self.add_biocypher_nodes(nodes)
+        logger.info(f'Merging {len(rels)} edges.')
+
+        # cypher query
+
+        # merging only on the ids of the entities, passing the
+        # properties on match and on create;
+        # TODO add node labels?
+        node_query = (
+            'UNWIND $rels AS r '
+            'MERGE (src {id: r.source_id}) '
+            'MERGE (tar {id: r.target_id}) '
+        )
+
+        self._driver.query(node_query, parameters={'rels': rels})
+
+        edge_query = (
+            'UNWIND $rels AS r '
+            'MATCH (src {id: r.source_id}) '
+            'MATCH (tar {id: r.target_id}) '
+            'WITH src, tar, r '
+            'CALL apoc.merge.relationship'
+            '(src, r.relationship_label, NULL, '
+            'r.properties, tar, r.properties) '
+            'YIELD rel '
+            'RETURN rel'
+        )
+
+        method = 'explain' if explain else 'profile' if profile else 'query'
+
+        result = getattr(self._driver,
+                         method)(edge_query, parameters={
+                             'rels': rels
+                         })
+
+        logger.info('Finished merging edges.')
+
+        return result
+
+
+def get_driver(
+    dbms: str,
+    translator: 'Translator',
+    ontology: 'Ontology',
+):
+    """
+    Function to return the writer class.
+
+    Returns:
+        class: the writer class
+    """
+
+    dbms_config = _config(dbms)
+
+    if dbms == 'neo4j':
+        return _Neo4jDriver(
+            database_name=dbms_config['database_name'],
+            wipe=dbms_config['wipe'],
+            uri=dbms_config['uri'],
+            user=dbms_config['user'],
+            password=dbms_config['password'],
+            multi_db=dbms_config['multi_db'],
+            ontology=ontology,
+            translator=translator,
+        )
+
+    return None
diff --git a/biocypher/_core.py b/biocypher/_core.py
new file mode 100644
index 00000000..aeceb0f1
--- /dev/null
+++ b/biocypher/_core.py
@@ -0,0 +1,422 @@
+#!/usr/bin/env python
+
+#
+# Copyright 2021, Heidelberg University Clinic
+#
+# File author(s): Sebastian Lobentanzer
+#                 ...
+#
+# Distributed under MIT licence, see the file `LICENSE`.
+#
+"""
+BioCypher core module. Interfaces with the user and distributes tasks to
+submodules.
+"""
+from more_itertools import peekable
+
+from ._logger import logger
+
+logger.debug(f'Loading module {__name__}.')
+
+from ._write import get_writer
+from ._config import config as _config
+from ._config import update_from_file as _file_update
+from ._create import BioCypherEdge, BioCypherNode
+from ._connect import get_driver
+from ._mapping import OntologyMapping
+from ._ontology import Ontology
+from ._translate import Translator
+
+__all__ = ['BioCypher']
+
+SUPPORTED_DBMS = ['neo4j']
+
+REQUIRED_CONFIG = [
+    'dbms',
+    'offline',
+    'strict_mode',
+    'head_ontology',
+]
+
+
+class BioCypher:
+    def __init__(
+        self,
+        dbms: str = None,
+        offline: bool = None,
+        strict_mode: bool = None,
+        biocypher_config_path: str = None,
+        schema_config_path: str = None,
+        head_ontology: dict = None,
+        tail_ontologies: dict = None,
+        output_directory: str = None,
+        # legacy params
+        db_name: str = None,
+    ):
+        """
+        Orchestration of BioCypher operations.
+
+        Args:
+
+            dbms (str): The database management system to use. For supported
+                systems see SUPPORTED_DBMS.
+
+            offline (bool): Whether to run in offline mode. If True, no
+                connection to the database will be made.
+
+            strict_mode (bool): Whether to run in strict mode. If True, the
+                translator will raise an error if a node or edge does not
+                provide source, version, and licence information.
+
+            user_schema_config_path (str): Path to the user schema config
+                file.
+
+            head_ontology (dict): The head ontology defined by URL and root
+                node.
+
+            tail_ontologies (dict): The tail ontologies defined by URL and
+                join nodes for both head and tail ontology.
+
+            output_directory (str): Path to the output directory. If not
+                provided, the default value 'biocypher-out' will be used.
+
+        """
+
+        # Update configuration if custom path is provided
+        if biocypher_config_path:
+            _file_update(biocypher_config_path)
+
+        if db_name:
+            logger.warning(
+                'The parameter `db_name` is deprecated. Please set the '
+                '`database_name` setting in the `biocypher_config.yaml` file '
+                'instead.'
+            )
+            _config(**{'neo4j': {'database_name': db_name}})
+
+        # Load configuration
+        self.base_config = _config('biocypher')
+
+        # Check for required configuration
+        for key in REQUIRED_CONFIG:
+            if key not in self.base_config:
+                raise ValueError(f'Configuration key {key} is required.')
+
+        # Set configuration - mandatory
+        self._dbms = dbms or self.base_config['dbms']
+
+        if offline is None:
+            self._offline = self.base_config['offline']
+        else:
+            self._offline = offline
+
+        if strict_mode is None:
+            self._strict_mode = self.base_config['strict_mode']
+        else:
+            self._strict_mode = strict_mode
+
+        self._schema_config_path = schema_config_path or self.base_config.get(
+            'schema_config_path'
+        )
+
+        if not self._schema_config_path:
+            raise ValueError(
+                'BioCypher requires a schema configuration; please provide a '
+                'path to the schema configuration YAML file via '
+                '`biocypher_config.yaml` or `BioCypher` class parameter.'
+            )
+
+        self._head_ontology = head_ontology or self.base_config['head_ontology']
+
+        # Set configuration - optional
+        self._output_directory = output_directory or self.base_config.get(
+            'output_directory'
+        )
+        self._tail_ontologies = tail_ontologies or self.base_config.get(
+            'tail_ontologies'
+        )
+
+        if self._dbms not in SUPPORTED_DBMS:
+            raise ValueError(
+                f'DBMS {self._dbms} not supported. '
+                f'Please select from {SUPPORTED_DBMS}.'
+            )
+
+        # Initialize
+        self._ontology_mapping = None
+        self._translator = None
+        self._ontology = None
+        self._writer = None
+
+    def _get_ontology_mapping(self):
+        """
+        Create ontology mapping if not exists and return.
+        """
+
+        if not self._ontology_mapping:
+            self._ontology_mapping = OntologyMapping(
+                config_file=self._schema_config_path,
+            )
+
+        return self._ontology_mapping
+
+    def _get_translator(self):
+        """
+        Create translator if not exists and return.
+        """
+
+        if not self._translator:
+            self._translator = Translator(
+                ontology_mapping=self._get_ontology_mapping(),
+                strict_mode=self._strict_mode,
+            )
+
+        return self._translator
+
+    def _get_ontology(self):
+        """
+        Create ontology if not exists and return.
+        """
+
+        if not self._ontology:
+            self._ontology = Ontology(
+                ontology_mapping=self._get_ontology_mapping(),
+                head_ontology=self._head_ontology,
+                tail_ontologies=self._tail_ontologies,
+            )
+
+        return self._ontology
+
+    def _get_writer(self):
+        """
+        Create writer if not online.
+        """
+
+        # Get worker
+        if self._offline:
+            self._writer = get_writer(
+                dbms=self._dbms,
+                translator=self._get_translator(),
+                ontology=self._get_ontology(),
+                output_directory=self._output_directory,
+                strict_mode=self._strict_mode,
+            )
+        else:
+            raise NotImplementedError('Cannot get writer in online mode.')
+
+    def _get_driver(self):
+        """
+        Create driver if not exists and return.
+        """
+
+        if not self._offline:
+            self._driver = get_driver(
+                dbms=self._dbms,
+                translator=self._get_translator(),
+                ontology=self._get_ontology(),
+            )
+        else:
+            raise NotImplementedError('Cannot get driver in offline mode.')
+
+    def write_nodes(self, nodes):
+        """
+        Write nodes to database.
+        """
+
+        if not self._writer:
+            self._get_writer()
+
+        nodes = peekable(nodes)
+        if not isinstance(nodes.peek(), BioCypherNode):
+            tnodes = self._translator.translate_nodes(nodes)
+        else:
+            tnodes = nodes
+        # write node files
+        return self._writer.write_nodes(tnodes)
+
+    def write_edges(self, edges):
+        """
+        Write edges to database.
+        """
+
+        if not self._writer:
+            self._get_writer()
+
+        edges = peekable(edges)
+        if not isinstance(edges.peek(), BioCypherEdge):
+            tedges = self._translator.translate_edges(edges)
+        else:
+            tedges = edges
+        # write edge files
+        return self._writer.write_edges(tedges)
+
+    def add_nodes(self, nodes):
+        pass
+
+    def add_edges(self, edges):
+        pass
+
+    def merge_nodes(self, nodes):
+        """
+        Merge nodes into database.
+        """
+
+        if not self._driver:
+            self._get_driver()
+
+        nodes = peekable(nodes)
+        if not isinstance(nodes.peek(), BioCypherNode):
+            tnodes = self._translator.translate_nodes(nodes)
+        else:
+            tnodes = nodes
+        # write node files
+        return self._driver.merge_nodes(tnodes)
+
+    def merge_edges(self, edges):
+        pass
+
+    # OVERVIEW AND CONVENIENCE METHODS ###
+
+    def log_missing_bl_types(self):
+        """
+        Get the set of Biolink types encountered without an entry in
+        the `schema_config.yaml` and print them to the logger.
+
+        Returns:
+            set: a set of missing Biolink types
+        """
+
+        mt = self._translator.get_missing_biolink_types()
+
+        if mt:
+            msg = (
+                'Input entities not accounted for due to them not being '
+                'present in the `schema_config.yaml` configuration file '
+                '(this is not necessarily a problem, if you did not intend '
+                'to include them in the database; see the log for details): \n'
+            )
+            for k, v in mt.items():
+                msg += f'    {k}: {v} \n'
+
+            logger.info(msg)
+            return mt
+
+        else:
+            logger.info('No missing Biolink types in input.')
+            return None
+
+    def log_duplicates(self):
+        """
+        Get the set of duplicate nodes and edges encountered and print them to
+        the logger.
+        """
+
+        dn = self._writer.get_duplicate_nodes()
+
+        if dn:
+
+            ntypes = dn[0]
+            nids = dn[1]
+
+            msg = ('Duplicate node types encountered (IDs in log): \n')
+            for typ in ntypes:
+                msg += f'    {typ}\n'
+
+            logger.info(msg)
+
+            idmsg = ('Duplicate node IDs encountered: \n')
+            for _id in nids:
+                idmsg += f'    {_id}\n'
+
+            logger.debug(idmsg)
+
+        else:
+            logger.info('No duplicate nodes in input.')
+
+        de = self._writer.get_duplicate_edges()
+
+        if de:
+
+            etypes = de[0]
+            eids = de[1]
+
+            msg = ('Duplicate edge types encountered (IDs in log): \n')
+            for typ in etypes:
+                msg += f'    {typ}\n'
+
+            logger.info(msg)
+
+            idmsg = ('Duplicate edge IDs encountered: \n')
+            for _id in eids:
+                idmsg += f'    {_id}\n'
+
+            logger.debug(idmsg)
+
+        else:
+            logger.info('No duplicate edges in input.')
+
+    def show_ontology_structure(self) -> None:
+        """
+        Show the ontology structure of the database using the Biolink schema and
+        treelib.
+        """
+
+        if not self._ontology:
+            self._get_ontology()
+
+        self._ontology.show_ontology_structure()
+
+    def write_import_call(self) -> None:
+        """
+        Write a shell script to import the database depending on the chosen
+        DBMS.
+        """
+
+        if not self._offline:
+            raise NotImplementedError(
+                'Cannot write import call in online mode.'
+            )
+
+        self._writer.write_import_call()
+
+    # TRANSLATION METHODS ###
+
+    def translate_term(self, term: str) -> str:
+        """
+        Translate a term to its BioCypher equivalent.
+        """
+
+        # instantiate adapter if not exists
+        self.start_ontology()
+
+        return self._translator.translate_term(term)
+
+    def reverse_translate_term(self, term: str) -> str:
+        """
+        Reverse translate a term from its BioCypher equivalent.
+        """
+
+        # instantiate adapter if not exists
+        self.start_ontology()
+
+        return self._translator.reverse_translate_term(term)
+
+    def translate_query(self, query: str) -> str:
+        """
+        Translate a query to its BioCypher equivalent.
+        """
+
+        # instantiate adapter if not exists
+        self.start_ontology()
+
+        return self._translator.translate(query)
+
+    def reverse_translate_query(self, query: str) -> str:
+        """
+        Reverse translate a query from its BioCypher equivalent.
+        """
+
+        # instantiate adapter if not exists
+        self.start_ontology()
+
+        return self._translator.reverse_translate(query)
diff --git a/biocypher/_create.py b/biocypher/_create.py
index c6bc0b83..a723bed2 100644
--- a/biocypher/_create.py
+++ b/biocypher/_create.py
@@ -8,48 +8,23 @@
 # Distributed under MIT licence, see the file `LICENSE`.
 #
 """
-Create a property graph database for biomedical research applications.
-Transforms ordered collections of biomedical entities and relationships
-to BioCypher objects that represent property graph nodes and edges.
-
-Todo:
-
-    - Calls to the classes are independent, so there is no way to
-      check directly; nodes can be created at any point in time
-      previous to edge creation. We could require a pass of all
-      the nodes in the graph when creating edges. Pro: this would
-      also allow a check whether the existing graph adheres to
-      BioCypher, at least in the node domain. If it doesn't,
-      the call does not make much sense.
-
-    - establish a dictionary lookup with the id types to be used / basic
-      type checking of the input
-
-    - translation of id types using pypath translation facilities (to be
-      later externalised)
+BioCypher 'create' module. Handles the creation of BioCypher node and edge
+dataclasses.
 """
+from ._logger import logger
+
+logger.debug(f'Loading module {__name__}.')
 
-from typing import Union, Optional
-from datetime import datetime
+from typing import Union
 from dataclasses import field, dataclass
-from urllib.request import urlopen
 import os
 
-import yaml
-
-from . import _misc
-from . import _config as config
-from ._logger import logger
-
 __all__ = [
     'BioCypherEdge',
     'BioCypherNode',
     'BioCypherRelAsNode',
-    'VersionNode',
 ]
 
-logger.debug(f'Loading module {__name__}.')
-
 
 @dataclass(frozen=True)
 class BioCypherNode:
@@ -345,415 +320,3 @@ def get_source_edge(self):
 
     def get_target_edge(self) -> BioCypherEdge:
         return self.target_edge
-
-
-class VersionNode:
-    """
-    Versioning and graph structure information meta node. Similar to
-    BioCypherNode but fixes label to ":BioCypher" and sets version by using the
-    current date and time (meaning it overrides both mandatory args from
-    BioCypherNode).
-
-    Is created upon establishment of connection with the database and remains
-    fixed for each BioCypher "session" (ie, the entire duration from starting
-    the connection to the termination of the BioCypher adapter instance). Is
-    connected to MetaNodes and MetaEdges via ":CONTAINS" relationships.
-    """
-    def __init__(
-        self,
-        offline: bool = False,
-        from_config: bool = False,
-        config_file: str = None,
-        node_label: str = 'BioCypher',
-        bcy_driver=None,
-    ):
-
-        logger.warning('VersionNode is deprecated.')
-
-        # if we do not have a driver, then likely we are offline, right?
-        self.offline = offline or getattr(bcy_driver, 'offline', True)
-        self.from_config = from_config
-        self.config_file = config_file
-        self.node_label = node_label
-        self.bcy_driver = bcy_driver
-
-        self.node_id = self._get_current_id()
-        self.graph_state = (
-            self._get_graph_state() if not self.offline else None
-        )
-        self.schema = self._get_graph_schema()
-        self.extended_schema = self._get_leaves()
-
-        self.properties = {
-            'graph_state': self.graph_state,
-            'schema': self.schema,
-            'leaves': self.extended_schema,
-        }
-
-    def get_id(self) -> str:
-        """
-        Returns primary node identifier.
-
-        Returns:
-            str: node_id
-        """
-        return self.node_id
-
-    def get_label(self) -> str:
-        """
-        Returns primary node label.
-
-        Returns:
-            str: node_label
-        """
-        return self.node_label
-
-    def get_dict(self) -> dict:
-        """
-        Return dict of id, labels, and properties.
-
-        Returns:
-            dict: node_id and node_label as top-level key-value pairs,
-            properties as second-level dict.
-        """
-        return {
-            'node_id': self.node_id,
-            'node_label': self.node_label,
-            'properties': self.properties,
-        }
-
-    def _get_current_id(self):
-        """
-        Instantiate a version ID for the current session. For now does
-        versioning using datetime.
-
-        Can later implement incremental versioning, versioning from
-        config file, or manual specification via argument.
-        """
-
-        now = datetime.now()
-        return now.strftime('v%Y%m%d-%H%M%S')
-
-    def _get_graph_state(self):
-        """
-        Check in active DBMS connection for existence of VersionNodes,
-        return the most recent VersionNode as representation of the
-        graph state. If no VersionNode found, assume blank graph state
-        and initialise.
-        """
-
-        logger.info('Getting graph state.')
-
-        result, summary = self.bcy_driver.query(
-            'MATCH (meta:BioCypher)'
-            'WHERE NOT (meta)-[:PRECEDES]->(:BioCypher)'
-            'RETURN meta',
-        )
-
-        # if result is empty, initialise
-        if not result:
-            logger.info('No existing graph found, initialising.')
-            return None
-        # else, pass on graph state
-        else:
-            version = result[0]['meta']['id']
-            logger.info(f'Found graph state at {version}.')
-            return result[0]['meta']
-
-    def _get_graph_schema(
-        self,
-        from_config: Optional[bool] = None,
-        config_file: Optional[str] = None,
-    ) -> dict:
-        """
-        Return graph schema information from meta graph if it exists, or
-        create new schema information properties from configuration
-        file.
-
-        Todo:
-            - get schema from meta graph
-        """
-
-        from_config = self.from_config if from_config is None else from_config
-        config_file = config_file or self.config_file
-
-        if self.graph_state and not from_config:
-            # TODO do we want information about actual structure here?
-            res = self.bcy_driver.query(
-                'MATCH (src:MetaNode) '
-                # "OPTIONAL MATCH (src)-[r]->(tar)"
-                'RETURN src',  # , type(r) AS type, tar"
-            )
-            gs_dict = {}
-            for r in res[0]:
-                src = r['src']
-                key = src.pop('id')
-                gs_dict[key] = src
-
-            return gs_dict
-
-        else:
-            # load default yaml from module
-            if config_file is None:
-
-                dataMap = config.module_data('schema_config')
-
-            # load yaml file from web
-            elif config_file.startswith('http'):
-
-                with urlopen(config_file) as f:
-
-                    dataMap = yaml.safe_load(f)
-
-            # get graph state from config (assume file is local)
-            else:
-
-                with open(config_file, 'r') as f:
-
-                    dataMap = yaml.safe_load(f)
-
-            return dataMap
-
-    def _get_leaves(self, d: Optional[dict] = None) -> dict:
-        """
-        Get leaves of the tree hierarchy from the data structure dict
-        contained in the `schema_config.yaml`. Creates virtual leaves
-        (as children) from entries that provide more than one preferred
-        id type (and corresponding inputs).
-
-        Args:
-            d:
-                Data structure dict from yaml file.
-
-        """
-
-        d = d or self.schema
-
-        leaves = dict()
-        max_depth = 0  # TODO needed?
-
-        # first pass: get parent leaves with direct representation in ontology
-        for k, v in d.items():
-
-            # k is not an entity
-            if 'represented_as' not in v:
-                continue
-
-            # preferred_id optional: if not provided, use `id`
-            if not v.get('preferred_id'):
-                v['preferred_id'] = 'id'
-
-            # k is an entity that is present in the ontology
-            if 'is_a' not in v:
-                leaves[k] = v
-
-            # find max depth of children
-            else:
-                lst = v['is_a'] if isinstance(v['is_a'], list) else [v['is_a']]
-                max_depth = max(max_depth, len(lst))
-
-        # second pass: "vertical" inheritance
-        d = self._vertical_property_inheritance(d)
-        # create leaves for all straight descendants (no multiple identifiers
-        # or sources) -> explicit children
-        # TODO do we need to order children by depth from real leaves?
-        leaves.update({k: v for k, v in d.items() if 'is_a' in v})
-
-        # "horizontal" inheritance: create siblings for multiple identifiers or
-        # sources -> virtual leaves or implicit children
-        mi_leaves = {}
-        ms_leaves = {}
-        for k, v in d.items():
-
-            # k is not an entity
-            if 'represented_as' not in v:
-                continue
-
-            if isinstance(v.get('preferred_id'), list):
-                mi_leaves = self._horizontal_inheritance_pid(k, v)
-                leaves.update(mi_leaves)
-
-            elif isinstance(v.get('source'), list):
-                ms_leaves = self._horizontal_inheritance_source(k, v)
-                leaves.update(ms_leaves)
-
-        return leaves
-
-    def _vertical_property_inheritance(self, d):
-        """
-        Inherit properties from parents to children and update `d` accordingly.
-        """
-        for k, v in d.items():
-
-            # k is not an entity
-            if 'represented_as' not in v:
-                continue
-
-            # k is an entity that is present in the ontology
-            if 'is_a' not in v:
-                continue
-
-            # "vertical" inheritance: inherit properties from parent
-            if v.get('inherit_properties', False):
-
-                # get direct ancestor
-                if isinstance(v['is_a'], list):
-                    parent = v['is_a'][0]
-                else:
-                    parent = v['is_a']
-
-                # update properties of child
-                if self.schema[parent].get('properties'):
-                    v['properties'] = self.schema[parent]['properties']
-                if self.schema[parent].get('exclude_properties'):
-                    v['exclude_properties'] = self.schema[parent][
-                        'exclude_properties']
-
-                # update schema (d)
-                d[k] = v
-
-        return d
-
-    def _horizontal_inheritance_pid(self, key, value):
-        """
-        Create virtual leaves for multiple preferred id types or sources.
-
-        If we create virtual leaves, label_in_input always has to be a list.
-        """
-
-        leaves = {}
-
-        preferred_id = value['preferred_id']
-        label_in_input = value['label_in_input']
-        represented_as = value['represented_as']
-
-        # adjust lengths
-        max_l = max(
-            [
-                len(_misc.to_list(preferred_id)),
-                len(_misc.to_list(label_in_input)),
-                len(_misc.to_list(represented_as)),
-            ],
-        )
-
-        # adjust pid length if necessary
-        if isinstance(preferred_id, str):
-            pids = [preferred_id] * max_l
-        else:
-            pids = preferred_id
-
-        # adjust rep length if necessary
-        if isinstance(represented_as, str):
-            reps = [represented_as] * max_l
-        else:
-            reps = represented_as
-
-        for pid, lab, rep in zip(pids, label_in_input, reps):
-
-            skey = pid + '.' + key
-            svalue = {
-                'preferred_id': pid,
-                'label_in_input': lab,
-                'represented_as': rep,
-                # mark as virtual
-                'virtual': True,
-            }
-
-            # inherit is_a if exists
-            if 'is_a' in value.keys():
-
-                # treat as multiple inheritance
-                if isinstance(value['is_a'], list):
-                    v = list(value['is_a'])
-                    v.insert(0, key)
-                    svalue['is_a'] = v
-
-                else:
-                    svalue['is_a'] = [key, value['is_a']]
-
-            else:
-                # set parent as is_a
-                svalue['is_a'] = key
-
-            # inherit everything except core attributes
-            for k, v in value.items():
-                if k not in [
-                    'is_a',
-                    'preferred_id',
-                    'label_in_input',
-                    'represented_as',
-                ]:
-                    svalue[k] = v
-
-            leaves[skey] = svalue
-
-        return leaves
-
-    def _horizontal_inheritance_source(self, key, value):
-        """
-        Create virtual leaves for multiple sources.
-
-        If we create virtual leaves, label_in_input always has to be a list.
-        """
-
-        leaves = {}
-
-        source = value['source']
-        label_in_input = value['label_in_input']
-        represented_as = value['represented_as']
-
-        # adjust lengths
-        src_l = len(source)
-
-        # adjust label length if necessary
-        if isinstance(label_in_input, str):
-            labels = [label_in_input] * src_l
-        else:
-            labels = label_in_input
-
-        # adjust rep length if necessary
-        if isinstance(represented_as, str):
-            reps = [represented_as] * src_l
-        else:
-            reps = represented_as
-
-        for src, lab, rep in zip(source, labels, reps):
-
-            skey = src + '.' + key
-            svalue = {
-                'source': src,
-                'label_in_input': lab,
-                'represented_as': rep,
-                # mark as virtual
-                'virtual': True,
-            }
-
-            # inherit is_a if exists
-            if 'is_a' in value.keys():
-
-                # treat as multiple inheritance
-                if isinstance(value['is_a'], list):
-                    v = list(value['is_a'])
-                    v.insert(0, key)
-                    svalue['is_a'] = v
-
-                else:
-                    svalue['is_a'] = [key, value['is_a']]
-
-            else:
-                # set parent as is_a
-                svalue['is_a'] = key
-
-            # inherit everything except core attributes
-            for k, v in value.items():
-                if k not in [
-                    'is_a',
-                    'source',
-                    'label_in_input',
-                    'represented_as',
-                ]:
-                    svalue[k] = v
-
-            leaves[skey] = svalue
-
-        return leaves
diff --git a/biocypher/_driver.py b/biocypher/_driver.py
deleted file mode 100644
index 42ef7e9c..00000000
--- a/biocypher/_driver.py
+++ /dev/null
@@ -1,831 +0,0 @@
-#!/usr/bin/env python
-
-#
-# Copyright 2021, Heidelberg University Clinic
-#
-# File author(s): Sebastian Lobentanzer
-#                 ...
-#
-# Distributed under MIT licence, see the file `LICENSE`.
-#
-"""
-A wrapper around the Neo4j driver which handles the DBMS connection and
-provides basic management methods.
-"""
-from collections.abc import Iterable
-
-from ._logger import logger
-
-logger.debug(f'Loading module {__name__}.')
-
-from typing import TYPE_CHECKING, Optional
-import itertools
-
-from more_itertools import peekable
-
-if TYPE_CHECKING:
-
-    import neo4j
-
-import neo4j_utils
-
-from . import _misc
-from ._write import BatchWriter
-from ._config import config as _config
-from ._create import VersionNode, BioCypherEdge, BioCypherNode
-from ._mapping import OntologyMapping
-from ._ontology import Ontology
-from ._translate import Translator
-
-__all__ = ['Driver']
-
-
-class Driver(neo4j_utils.Driver):
-    """
-    Manages a connection to a biocypher database.
-
-    The connection can be defined in three ways:
-        * Providing a ready ``neo4j.Driver`` instance
-        * By URI and authentication data
-        * By a YAML config file
-
-    Args:
-        driver:
-            A ``neo4j.Driver`` instance, created by, for example,
-            ``neo4j.GraphDatabase.driver``.
-        db_name:
-            Name of the database (Neo4j graph) to use.
-        db_uri:
-            Protocol, host and port to access the Neo4j server.
-        db_user:
-            Neo4j user name.
-        db_passwd:
-            Password of the Neo4j user.
-        fetch_size:
-            Optional; the fetch size to use in database transactions.
-        wipe:
-            Wipe the database after connection, ensuring the data is
-            loaded into an empty database.
-        offline:
-            Do not connect to the database, but use the provided
-            schema to create a graph representation and write CSVs for
-            admin import.
-        output_directory:
-            Directory to write CSV files to.
-        increment_version:
-            Whether to increase version number automatically and create a
-            new BioCypher version node in the graph.
-        user_schema_config_path:
-            Path to the graph database schema configuration file.
-        clear_cache:
-            Whether to clear the ontological hierarchy cache at driver
-            instantiation. The cache is used to speed up the translation
-            of Biolink classes to the database schema.
-        delimiter:
-            Delimiter for CSV export.
-        array_delimiter:
-            Array delimiter for CSV exported contents.
-        quote_char:
-            String quotation character for CSV export.
-        import_call_bin_prefix:
-            Prefix for the Cypher call to the admin import shell command.
-            Defaults to ``bin/``.
-        import_call_file_prefix:
-            Path prefix for the data files (headers and parts) in the admin
-            import call. Defaults to the absolute output directory path.
-        skip_bad_relationships:
-            Whether to skip relationships with missing source or target
-            nodes in the admin import shell command.
-        skip_duplicate_nodes:
-            Whether to skip duplicate nodes in the admin import shell
-            command.
-        biolink_model:
-            Path to the custom Biolink model YAML file.
-        tail_ontology_url:
-            URL of the ontology to hybridise to the head ontology.
-        head_join_node:
-            Biolink class of the node to join the tail ontology to.
-        tail_join_node:
-            Ontology class of the node to join the head ontology to.
-    """
-    def __init__(
-        self,
-        driver: Optional['neo4j.Driver'] = None,
-        db_name: Optional[str] = None,
-        db_uri: Optional[str] = None,
-        db_user: Optional[str] = None,
-        db_passwd: Optional[str] = None,
-        multi_db: Optional[bool] = None,
-        fetch_size: int = 1000,
-        skip_bad_relationships: bool = False,
-        skip_duplicate_nodes: bool = False,
-        wipe: bool = False,
-        strict_mode: Optional[bool] = None,
-        offline: Optional[bool] = None,
-        output_directory: Optional[str] = None,
-        increment_version: bool = True,
-        clear_cache: Optional[bool] = None,
-        user_schema_config_path: Optional[str] = None,
-        delimiter: Optional[str] = None,
-        array_delimiter: Optional[str] = None,
-        quote_char: Optional[str] = None,
-        import_call_bin_prefix: Optional[str] = None,
-        import_call_file_prefix: Optional[str] = None,
-        head_ontology: Optional[dict] = None,
-        tail_ontologies: Optional[dict] = None,
-    ):
-
-        # Neo4j options
-        db_name = db_name or _config('neo4j_db')
-        db_uri = db_uri or _config('neo4j_uri')
-        db_user = db_user or _config('neo4j_user')
-        db_passwd = db_passwd or _config('neo4j_pw')
-        multi_db = multi_db or _config('neo4j_multi_db')
-        self.db_delim = delimiter or _config('neo4j_delimiter')
-        self.db_adelim = array_delimiter or _config('neo4j_array_delimiter')
-        self.db_quote = quote_char or _config('neo4j_quote_char')
-
-        if import_call_bin_prefix is None:
-            self.import_call_bin_prefix = _config(
-                'neo4j_import_call_bin_prefix'
-            )
-        else:
-            self.import_call_bin_prefix = import_call_bin_prefix
-
-        if import_call_file_prefix is None:
-            self.import_call_file_prefix = _config(
-                'neo4j_import_call_file_prefix'
-            )
-        else:
-            self.import_call_file_prefix = import_call_file_prefix
-
-        self.skip_bad_relationships = skip_bad_relationships
-        self.skip_duplicate_nodes = skip_duplicate_nodes
-        self.wipe = wipe
-
-        if offline is None:
-            self._offline = _config('offline')
-        else:
-            self._offline = offline
-
-        # BioCypher options
-        self.user_schema_config_path = user_schema_config_path or _config(
-            'user_schema_config_path'
-        )
-        self.strict_mode = strict_mode or _config('strict_mode')
-        self.output_directory = output_directory or _config('output_directory')
-        self.clear_cache = clear_cache or _config('clear_cache')
-
-        self.head_ontology = head_ontology or _config('head_ontology')
-
-        self.tail_ontologies = tail_ontologies or _config('tail_ontologies')
-
-        if self._offline:
-
-            if not self.user_schema_config_path:
-                raise ValueError(
-                    'Offline mode requires a user schema config file.'
-                    ' Please provide one with the `user_schema_config_path`'
-                    ' argument or set the `user_schema_config_path`'
-                    ' configuration variable.'
-                )
-
-            logger.info('Offline mode: no connection to DBMS.')
-
-            self._ontology_mapping = OntologyMapping(
-                config_file=self.user_schema_config_path,
-            )
-
-            self._db_config = {
-                'uri': db_uri,
-                'user': db_user,
-                'passwd': db_passwd,
-                'db': db_name,
-                'fetch_size': fetch_size,
-            }
-
-            self.driver = None
-            self._db_name = db_name
-
-        else:
-
-            neo4j_utils.Driver.__init__(**locals())
-
-            # if db representation node does not exist or explicitly
-            # asked for wipe, create new graph representation: default
-            # yaml, interactive?
-            if wipe:
-
-                # get database version node ('check' module) immutable
-                # variable of each instance (ie, each call from the
-                # adapter to BioCypher); checks for existence of graph
-                # representation and returns if found, else creates new
-                # one
-                self._ontology_mapping = VersionNode(
-                    from_config=offline or wipe,
-                    config_file=self.user_schema_config_path,
-                    bcy_driver=self,
-                )
-
-                # init requires db_meta to be set
-                self.init_db()
-
-            else:
-
-                self._ontology_mapping = VersionNode(self)
-
-        if increment_version:
-
-            # set new current version node
-            self.update_meta_graph()
-
-        self.ontology = None
-        self.batch_writer = None
-        self._update_translator()
-
-        # TODO: implement passing a driver instance
-        # I am not sure, but seems like it should work from driver
-
-    def update_meta_graph(self):
-
-        if self._offline:
-            return
-
-        logger.info('Updating Neo4j meta graph.')
-        # add version node
-        self.add_biocypher_nodes(self._ontology_mapping)
-
-        # find current version node
-        db_version = self.query(
-            'MATCH (v:BioCypher) '
-            'WHERE NOT (v)-[:PRECEDES]->() '
-            'RETURN v',
-        )
-        # connect version node to previous
-        if db_version[0]:
-            e_meta = BioCypherEdge(
-                self._ontology_mapping.graph_state['id'],
-                self._ontology_mapping.node_id,
-                'PRECEDES',
-            )
-            self.add_biocypher_edges(e_meta)
-
-        # add structure nodes
-        no_l = []
-        # leaves of the hierarchy specified in schema yaml
-        for entity, params in self._ontology_mapping.extended_schema.items():
-            no_l.append(
-                BioCypherNode(
-                    node_id=entity,
-                    node_label='MetaNode',
-                    properties=params,
-                ),
-            )
-        self.add_biocypher_nodes(no_l)
-
-        # remove connection of structure nodes from previous version
-        # node(s)
-        self.query('MATCH ()-[r:CONTAINS]-()'
-                   'DELETE r', )
-
-        # connect structure nodes to version node
-        ed_v = []
-        current_version = self._ontology_mapping.get_id()
-        for entity in self._ontology_mapping.extended_schema.keys():
-            ed_v.append(
-                BioCypherEdge(
-                    source_id=current_version,
-                    target_id=entity,
-                    relationship_label='CONTAINS',
-                ),
-            )
-        self.add_biocypher_edges(ed_v)
-
-        # add graph structure between MetaNodes
-        ed = []
-        for no in no_l:
-            id = no.get_id()
-            src = no.get_properties().get('source')
-            tar = no.get_properties().get('target')
-            if None not in [id, src, tar]:
-                ed.append(BioCypherEdge(id, src, 'IS_SOURCE_OF'))
-                ed.append(BioCypherEdge(id, tar, 'IS_TARGET_OF'))
-        self.add_biocypher_edges(ed)
-
-    def _update_translator(self):
-
-        self.translator = Translator(
-            extended_schema=self._ontology_mapping.extended_schema,
-            strict_mode=self.strict_mode,
-        )
-
-    def init_db(self):
-        """
-        Used to initialise a property graph database by deleting
-        contents and constraints and setting up new constraints.
-
-        Todo:
-            - set up constraint creation interactively depending on the
-                need of the database
-        """
-
-        self.wipe_db()
-        self._create_constraints()
-        logger.info('Initialising database.')
-
-    def _create_constraints(self):
-        """
-        Creates constraints on node types in the graph. Used for
-        initial setup.
-
-        Grabs leaves of the ``schema_config.yaml`` file and creates
-        constraints on the id of all entities represented as nodes.
-        """
-
-        logger.info('Creating constraints for node types in config.')
-
-        # get structure
-        for leaf in self._ontology_mapping.extended_schema.items():
-            label = leaf[0]
-            if leaf[1]['represented_as'] == 'node':
-
-                s = (
-                    f'CREATE CONSTRAINT `{label}_id` '
-                    f'IF NOT EXISTS ON (n:`{label}`) '
-                    'ASSERT n.id IS UNIQUE'
-                )
-                self.query(s)
-
-    def add_nodes(self, id_type_tuples: Iterable[tuple]) -> tuple:
-        """
-        Generic node adder method to add any kind of input to the graph via the
-        :class:`biocypher.create.BioCypherNode` class. Employs translation
-        functionality and calls the :meth:`add_biocypher_nodes()` method.
-
-        Args:
-            id_type_tuples (iterable of 3-tuple): for each node to add to
-                the biocypher graph, a 3-tuple with the following layout:
-                first, the (unique if constrained) ID of the node; second, the
-                type of the node, capitalised or PascalCase and in noun form
-                (Neo4j primary label, eg `:Protein`); and third, a dictionary
-                of arbitrary properties the node should possess (can be empty).
-
-        Returns:
-            2-tuple: the query result of :meth:`add_biocypher_nodes()`
-                - first entry: data
-                - second entry: Neo4j summary.
-        """
-
-        bn = self.translator.translate_nodes(id_type_tuples)
-        return self.add_biocypher_nodes(bn)
-
-    def add_edges(self, id_src_tar_type_tuples: Iterable[tuple]) -> tuple:
-        """
-        Generic edge adder method to add any kind of input to the graph
-        via the :class:`biocypher.create.BioCypherEdge` class. Employs
-        translation functionality and calls the
-        :meth:`add_biocypher_edges()` method.
-
-        Args:
-
-            id_src_tar_type_tuples (iterable of 5-tuple):
-
-                for each edge to add to the biocypher graph, a 5-tuple
-                with the following layout: first, the optional unique ID
-                of the interaction. This can be `None` if there is no
-                systematic identifier (which for many interactions is
-                the case). Second and third, the (unique if constrained)
-                IDs of the source and target nodes of the relationship;
-                fourth, the type of the relationship; and fifth, a
-                dictionary of arbitrary properties the edge should
-                possess (can be empty).
-
-        Returns:
-
-            2-tuple: the query result of :meth:`add_biocypher_edges()`
-
-                - first entry: data
-                - second entry: Neo4j summary.
-        """
-
-        bn = self.translator.translate_edges(id_src_tar_type_tuples)
-        return self.add_biocypher_edges(bn)
-
-    def add_biocypher_nodes(
-        self,
-        nodes: Iterable[BioCypherNode],
-        explain: bool = False,
-        profile: bool = False,
-    ) -> bool:
-        """
-        Accepts a node type handoff class
-        (:class:`biocypher.create.BioCypherNode`) with id,
-        label, and a dict of properties (passing on the type of
-        property, ie, ``int``, ``str``, ...).
-
-        The dict retrieved by the
-        :meth:`biocypher.create.BioCypherNode.get_dict()` method is
-        passed into Neo4j as a map of maps, explicitly encoding node id
-        and label, and adding all other properties from the 'properties'
-        key of the dict. The merge is performed via APOC, matching only
-        on node id to prevent duplicates. The same properties are set on
-        match and on create, irrespective of the actual event.
-
-        Args:
-            nodes:
-                An iterable of :class:`biocypher.create.BioCypherNode` objects.
-            explain:
-                Call ``EXPLAIN`` on the CYPHER query.
-            profile:
-                Do profiling on the CYPHER query.
-
-        Returns:
-            True for success, False otherwise.
-        """
-
-        try:
-
-            entities = [
-                node.get_dict() for node in _misc.ensure_iterable(nodes)
-            ]
-
-        except AttributeError:
-
-            msg = 'Nodes must have a `get_dict` method.'
-            logger.error(msg)
-
-            raise ValueError(msg)
-
-        logger.info(f'Merging {len(entities)} nodes.')
-
-        entity_query = (
-            'UNWIND $entities AS ent '
-            'CALL apoc.merge.node([ent.node_label], '
-            '{id: ent.node_id}, ent.properties, ent.properties) '
-            'YIELD node '
-            'RETURN node'
-        )
-
-        method = 'explain' if explain else 'profile' if profile else 'query'
-
-        result = getattr(self, method)(
-            entity_query,
-            parameters={
-                'entities': entities,
-            },
-        )
-
-        logger.info('Finished merging nodes.')
-
-        return result
-
-    def add_biocypher_edges(
-        self,
-        edges: Iterable[BioCypherEdge],
-        explain: bool = False,
-        profile: bool = False,
-    ) -> bool:
-        """
-        Accepts an edge type handoff class
-        (:class:`biocypher.create.BioCypherEdge`) with source
-        and target ids, label, and a dict of properties (passing on the
-        type of property, ie, int, string ...).
-
-        The individual edge is either passed as a singleton, in the case
-        of representation as an edge in the graph, or as a 4-tuple, in
-        the case of representation as a node (with two edges connecting
-        to interaction partners).
-
-        The dict retrieved by the
-        :meth:`biocypher.create.BioCypherEdge.get_dict()` method is
-        passed into Neo4j as a map of maps, explicitly encoding source
-        and target ids and the relationship label, and adding all edge
-        properties from the 'properties' key of the dict. The merge is
-        performed via APOC, matching only on source and target id to
-        prevent duplicates. The same properties are set on match and on
-        create, irrespective of the actual event.
-
-        Args:
-            edges:
-                An iterable of :class:`biocypher.create.BioCypherEdge` objects.
-            explain:
-                Call ``EXPLAIN`` on the CYPHER query.
-            profile:
-                Do profiling on the CYPHER query.
-
-        Returns:
-            `True` for success, `False` otherwise.
-        """
-
-        edges = _misc.ensure_iterable(edges)
-        edges = itertools.chain(*(_misc.ensure_iterable(i) for i in edges))
-
-        nodes = []
-        rels = []
-
-        try:
-
-            for e in edges:
-
-                if hasattr(e, 'get_node'):
-
-                    nodes.append(e.get_node())
-                    rels.append(e.get_source_edge().get_dict())
-                    rels.append(e.get_target_edge().get_dict())
-
-                else:
-
-                    rels.append(e.get_dict())
-
-        except AttributeError:
-
-            msg = 'Edges and nodes must have a `get_dict` method.'
-            logger.error(msg)
-
-            raise ValueError(msg)
-
-        self.add_biocypher_nodes(nodes)
-        logger.info(f'Merging {len(rels)} edges.')
-
-        # cypher query
-
-        # merging only on the ids of the entities, passing the
-        # properties on match and on create;
-        # TODO add node labels?
-        node_query = (
-            'UNWIND $rels AS r '
-            'MERGE (src {id: r.source_id}) '
-            'MERGE (tar {id: r.target_id}) '
-        )
-
-        self.query(node_query, parameters={'rels': rels})
-
-        edge_query = (
-            'UNWIND $rels AS r '
-            'MATCH (src {id: r.source_id}) '
-            'MATCH (tar {id: r.target_id}) '
-            'WITH src, tar, r '
-            'CALL apoc.merge.relationship'
-            '(src, r.relationship_label, NULL, '
-            'r.properties, tar, r.properties) '
-            'YIELD rel '
-            'RETURN rel'
-        )
-
-        method = 'explain' if explain else 'profile' if profile else 'query'
-
-        result = getattr(self, method)(edge_query, parameters={'rels': rels})
-
-        logger.info('Finished merging edges.')
-
-        return result
-
-    def write_nodes(self, nodes):
-        """
-        Write BioCypher nodes to disk using the :mod:`write` module,
-        formatting the CSV to enable Neo4j admin import from the target
-        directory.
-
-        Args:
-            nodes (iterable): collection of nodes to be written in
-                BioCypher-compatible CSV format; can be any compatible
-                (ie, translatable) input format or already as
-                :class:`biocypher.create.BioCypherNode`.
-        """
-
-        # instantiate ontology on demand because it takes time to load
-        self.start_ontology()
-
-        self.start_batch_writer()
-
-        nodes = peekable(nodes)
-        if not isinstance(nodes.peek(), BioCypherNode):
-            tnodes = self.translator.translate_nodes(nodes)
-        else:
-            tnodes = nodes
-        # write node files
-        return self.batch_writer.write_nodes(tnodes)
-
-    def start_batch_writer(self) -> None:
-        """
-        Instantiate the batch writer if it does not exist.
-
-        Args:
-            dirname (str): the directory to write the files to
-            db_name (str): the name of the database to write the files to
-        """
-        if not self.batch_writer:
-            self.batch_writer = BatchWriter(
-                ontology=self.ontology,
-                translator=self.translator,
-                delimiter=self.db_delim,
-                array_delimiter=self.db_adelim,
-                quote=self.db_quote,
-                dirname=self.output_directory,
-                db_name=self._db_name,
-                skip_bad_relationships=self.skip_bad_relationships,
-                skip_duplicate_nodes=self.skip_duplicate_nodes,
-                import_call_bin_prefix=self.import_call_bin_prefix,
-                import_call_file_prefix=self.import_call_file_prefix,
-                wipe=self.wipe,
-                strict_mode=self.strict_mode,
-            )
-
-    def start_ontology(self) -> None:
-        """
-        Instantiate the :class:`biocypher._ontology.Ontology` if not
-        existing.
-        """
-        if not self.ontology:
-            self.ontology = Ontology(
-                head_ontology=self.head_ontology,
-                mapping=self._ontology_mapping,
-                tail_ontologies=self.tail_ontologies,
-            )
-
-    def write_edges(
-        self,
-        edges,
-    ) -> None:
-        """
-        Write BioCypher edges to disk using the :mod:`write` module,
-        formatting the CSV to enable Neo4j admin import from the target
-        directory.
-
-        Args:
-            edges (iterable): collection of edges to be written in
-                BioCypher-compatible CSV format; can be any compatible
-                (ie, translatable) input format or already as
-                :class:`biocypher.create.BioCypherEdge`.
-        """
-
-        # instantiate adapter on demand because it takes time to load
-        # the biolink model toolkit
-        self.start_ontology()
-
-        self.start_batch_writer()
-
-        edges = peekable(edges)
-        if not isinstance(edges.peek(), BioCypherEdge):
-            tedges = self.translator.translate_edges(edges)
-        else:
-            tedges = edges
-        # write edge files
-        self.batch_writer.write_edges(tedges)
-
-    def get_import_call(self):
-        """
-        Upon using the batch writer for writing admin import CSV files,
-        return a string containing the neo4j admin import call with
-        delimiters, database name, and paths of node and edge files.
-
-        Returns:
-            str: a neo4j-admin import call
-        """
-        return self.batch_writer.get_import_call()
-
-    def write_import_call(self):
-        """
-        Upon using the batch writer for writing admin import CSV files,
-        write a string containing the neo4j admin import call with
-        delimiters, database name, and paths of node and edge files, to
-        the export directory.
-
-        Returns:
-            bool: The return value. True for success, False otherwise.
-        """
-        return self.batch_writer.write_import_call()
-
-    def log_missing_bl_types(self):
-        """
-        Get the set of Biolink types encountered without an entry in
-        the `schema_config.yaml` and print them to the logger.
-
-        Returns:
-            set: a set of missing Biolink types
-        """
-
-        mt = self.translator.get_missing_biolink_types()
-
-        if mt:
-            msg = (
-                'Input entities not accounted for due to them not being '
-                'present in the `schema_config.yaml` configuration file '
-                '(this is not necessarily a problem, if you did not intend '
-                'to include them in the database; see the log for details): \n'
-            )
-            for k, v in mt.items():
-                msg += f'    {k}: {v} \n'
-
-            logger.info(msg)
-            return mt
-
-        else:
-            logger.info('No missing Biolink types in input.')
-            return None
-
-    def log_duplicates(self):
-        """
-        Get the set of duplicate nodes and edges encountered and print them to
-        the logger.
-        """
-
-        dn = self.batch_writer.get_duplicate_nodes()
-
-        if dn:
-
-            ntypes = dn[0]
-            nids = dn[1]
-
-            msg = ('Duplicate node types encountered (IDs in log): \n')
-            for typ in ntypes:
-                msg += f'    {typ}\n'
-
-            logger.info(msg)
-
-            idmsg = ('Duplicate node IDs encountered: \n')
-            for _id in nids:
-                idmsg += f'    {_id}\n'
-
-            logger.debug(idmsg)
-
-        else:
-            logger.info('No duplicate nodes in input.')
-
-        de = self.batch_writer.get_duplicate_edges()
-
-        if de:
-
-            etypes = de[0]
-            eids = de[1]
-
-            msg = ('Duplicate edge types encountered (IDs in log): \n')
-            for typ in etypes:
-                msg += f'    {typ}\n'
-
-            logger.info(msg)
-
-            idmsg = ('Duplicate edge IDs encountered: \n')
-            for _id in eids:
-                idmsg += f'    {_id}\n'
-
-            logger.debug(idmsg)
-
-        else:
-            logger.info('No duplicate edges in input.')
-
-    def show_ontology_structure(self) -> None:
-        """
-        Show the ontology structure of the database using the Biolink schema and
-        treelib.
-        """
-
-        self.start_ontology()
-
-        self.ontology.show_ontology_structure()
-
-    # TRANSLATION METHODS ###
-
-    def translate_term(self, term: str) -> str:
-        """
-        Translate a term to its BioCypher equivalent.
-        """
-
-        # instantiate adapter if not exists
-        self.start_ontology()
-
-        return self.translator.translate_term(term)
-
-    def reverse_translate_term(self, term: str) -> str:
-        """
-        Reverse translate a term from its BioCypher equivalent.
-        """
-
-        # instantiate adapter if not exists
-        self.start_ontology()
-
-        return self.translator.reverse_translate_term(term)
-
-    def translate_query(self, query: str) -> str:
-        """
-        Translate a query to its BioCypher equivalent.
-        """
-
-        # instantiate adapter if not exists
-        self.start_ontology()
-
-        return self.translator.translate(query)
-
-    def reverse_translate_query(self, query: str) -> str:
-        """
-        Reverse translate a query from its BioCypher equivalent.
-        """
-
-        # instantiate adapter if not exists
-        self.start_ontology()
-
-        return self.translator.reverse_translate(query)
-
-    def __repr__(self):
-
-        return f'<BioCypher {neo4j_utils.Driver.__repr__(self)[1:]}'
diff --git a/biocypher/_logger.py b/biocypher/_logger.py
index edc7f246..8698f77a 100644
--- a/biocypher/_logger.py
+++ b/biocypher/_logger.py
@@ -61,7 +61,8 @@ def get_logger(name: str = 'biocypher') -> logging.Logger:
         now = datetime.now()
         date_time = now.strftime('%Y%m%d-%H%M%S')
 
-        logdir = _config.config('logdir')
+        logdir = _config.config('biocypher'
+                               ).get('log_directory') or 'biocypher-log'
         os.makedirs(logdir, exist_ok=True)
         logfile = os.path.join(logdir, f'biocypher-{date_time}.log')
 
diff --git a/biocypher/_mapping.py b/biocypher/_mapping.py
index 526a5a19..7a242bfe 100644
--- a/biocypher/_mapping.py
+++ b/biocypher/_mapping.py
@@ -8,6 +8,13 @@
 #
 # Distributed under MIT licence, see the file `LICENSE`.
 #
+"""
+BioCypher 'mapping' module. Handles the mapping of user-defined schema to the
+underlying ontology.
+"""
+from ._logger import logger
+
+logger.debug(f'Loading module {__name__}.')
 
 from typing import Optional
 from urllib.request import urlopen
@@ -16,7 +23,6 @@
 
 from . import _misc
 from ._config import config as _config
-from ._logger import logger
 
 
 class OntologyMapping:
@@ -170,20 +176,21 @@ def _horizontal_inheritance_pid(self, key, value):
         """
         Create virtual leaves for multiple preferred id types or sources.
 
-        If we create virtual leaves, label_in_input always has to be a list.
+        If we create virtual leaves, input_label/label_in_input always has to be
+        a list.
         """
 
         leaves = {}
 
         preferred_id = value['preferred_id']
-        label_in_input = value['label_in_input']
+        input_label = value.get('input_label') or value['label_in_input']
         represented_as = value['represented_as']
 
         # adjust lengths
         max_l = max(
             [
                 len(_misc.to_list(preferred_id)),
-                len(_misc.to_list(label_in_input)),
+                len(_misc.to_list(input_label)),
                 len(_misc.to_list(represented_as)),
             ],
         )
@@ -200,12 +207,12 @@ def _horizontal_inheritance_pid(self, key, value):
         else:
             reps = represented_as
 
-        for pid, lab, rep in zip(pids, label_in_input, reps):
+        for pid, lab, rep in zip(pids, input_label, reps):
 
             skey = pid + '.' + key
             svalue = {
                 'preferred_id': pid,
-                'label_in_input': lab,
+                'input_label': lab,
                 'represented_as': rep,
                 # mark as virtual
                 'virtual': True,
@@ -232,6 +239,7 @@ def _horizontal_inheritance_pid(self, key, value):
                 if k not in [
                     'is_a',
                     'preferred_id',
+                    'input_label',
                     'label_in_input',
                     'represented_as',
                 ]:
@@ -245,23 +253,24 @@ def _horizontal_inheritance_source(self, key, value):
         """
         Create virtual leaves for multiple sources.
 
-        If we create virtual leaves, label_in_input always has to be a list.
+        If we create virtual leaves, input_label/label_in_input always has to be
+        a list.
         """
 
         leaves = {}
 
         source = value['source']
-        label_in_input = value['label_in_input']
+        input_label = value.get('input_label') or value['label_in_input']
         represented_as = value['represented_as']
 
         # adjust lengths
         src_l = len(source)
 
         # adjust label length if necessary
-        if isinstance(label_in_input, str):
-            labels = [label_in_input] * src_l
+        if isinstance(input_label, str):
+            labels = [input_label] * src_l
         else:
-            labels = label_in_input
+            labels = input_label
 
         # adjust rep length if necessary
         if isinstance(represented_as, str):
@@ -274,7 +283,7 @@ def _horizontal_inheritance_source(self, key, value):
             skey = src + '.' + key
             svalue = {
                 'source': src,
-                'label_in_input': lab,
+                'input_label': lab,
                 'represented_as': rep,
                 # mark as virtual
                 'virtual': True,
@@ -301,6 +310,7 @@ def _horizontal_inheritance_source(self, key, value):
                 if k not in [
                     'is_a',
                     'source',
+                    'input_label',
                     'label_in_input',
                     'represented_as',
                 ]:
diff --git a/biocypher/_metadata.py b/biocypher/_metadata.py
index 3a739f07..60f71aab 100644
--- a/biocypher/_metadata.py
+++ b/biocypher/_metadata.py
@@ -19,8 +19,7 @@
 
 import toml
 
-_VERSION = '0.4.5'
-# TODO do we need this? it's another place we have to update the version number
+_VERSION = '0.5.4'
 
 
 def get_metadata():
diff --git a/biocypher/_misc.py b/biocypher/_misc.py
index c0b8b408..2cb664cb 100644
--- a/biocypher/_misc.py
+++ b/biocypher/_misc.py
@@ -1,3 +1,20 @@
+#!/usr/bin/env python
+
+#
+# Copyright 2021, Heidelberg University Clinic
+#
+# File author(s): Sebastian Lobentanzer
+#                 ...
+#
+# Distributed under MIT licence, see the file `LICENSE`.
+#
+"""
+Handy functions for use in various places.
+"""
+from ._logger import logger
+
+logger.debug(f'Loading module {__name__}.')
+
 from typing import (
     Any,
     Union,
@@ -78,10 +95,20 @@ def create_tree_visualisation(inheritance_tree: Union[dict, nx.Graph]) -> str:
     root = list(parents - classes)
 
     if len(root) > 1:
-        raise ValueError(
-            'Inheritance tree cannot have more than one root node.'
-        )
+
+        if 'entity' in root:
+
+            root = 'entity'  # default: good standard? TODO
+
+        else:
+
+            raise ValueError(
+                'Inheritance tree cannot have more than one root node. '
+                f'Found {len(root)}: {root}.'
+            )
+
     else:
+
         root = root[0]
 
     if not root:
diff --git a/biocypher/_ontology.py b/biocypher/_ontology.py
index d3687c55..0c08dbec 100644
--- a/biocypher/_ontology.py
+++ b/biocypher/_ontology.py
@@ -8,15 +8,24 @@
 #
 # Distributed under MIT licence, see the file `LICENSE`.
 #
+"""
+BioCypher 'ontology' module. Contains classes and functions to handle parsing
+and representation of single ontologies as well as their hybridisation and
+other advanced operations.
+"""
+import os
 
-from typing import Union, Optional
+from ._logger import logger
+
+logger.debug(f'Loading module {__name__}.')
+
+from typing import Optional
+from datetime import datetime
 
 import rdflib
 import networkx as nx
 
 from . import _misc
-from ._create import VersionNode
-from ._logger import logger
 from ._mapping import OntologyMapping
 
 
@@ -239,7 +248,7 @@ class Ontology:
     def __init__(
         self,
         head_ontology: dict,
-        mapping: Union[OntologyMapping, VersionNode],
+        ontology_mapping: 'OntologyMapping',
         tail_ontologies: Optional[dict] = None,
     ):
         """
@@ -253,7 +262,7 @@ def __init__(
         """
 
         self._head_ontology = head_ontology
-        self.extended_schema = mapping.extended_schema
+        self.extended_schema = ontology_mapping.extended_schema
         self._tail_ontology_meta = tail_ontologies
 
         self._tail_ontologies = None
@@ -281,6 +290,10 @@ def _main(self) -> None:
             self._nx_graph = self._head_ontology.get_nx_graph()
 
         self._extend_ontology()
+
+        # experimental: add connections of disjoint classes to entity
+        self._connect_biolink_classes()
+
         self._add_properties()
 
     def _load_ontologies(self) -> None:
@@ -384,6 +397,8 @@ def _extend_ontology(self) -> None:
                 if parent not in self._nx_graph.nodes:
 
                     self._nx_graph.add_node(parent)
+                    self._nx_graph.nodes[parent][
+                        'label'] = _misc.sentencecase_to_pascalcase(parent)
 
                     # mark parent as user extension
                     self._nx_graph.nodes[parent]['user_extension'] = True
@@ -391,6 +406,9 @@ def _extend_ontology(self) -> None:
 
                 if child not in self._nx_graph.nodes:
                     self._nx_graph.add_node(child)
+                    self._nx_graph.nodes[child][
+                        'label'] = _misc.sentencecase_to_pascalcase(child)
+
                     # mark child as user extension
                     self._nx_graph.nodes[child]['user_extension'] = True
                     self._extended_nodes.add(child)
@@ -399,6 +417,35 @@ def _extend_ontology(self) -> None:
 
                 child = parent
 
+    def _connect_biolink_classes(self) -> None:
+        """
+        Experimental: Adds edges from disjoint classes to the entity node.
+        """
+
+        if not self._nx_graph:
+            self._nx_graph = self._head_ontology.get_nx_graph().copy()
+
+        # biolink classes that are disjoint from entity
+        disjoint_classes = [
+            'frequency qualifier mixin',
+            'chemical entity to entity association mixin',
+            'ontology class',
+            'relationship quantifier',
+            'physical essence or occurrent',
+            'gene or gene product',
+            'subject of investigation',
+        ]
+
+        for node in disjoint_classes:
+
+            if not self._nx_graph.nodes.get(node):
+
+                self._nx_graph.add_node(node)
+                self._nx_graph.nodes[node][
+                    'label'] = _misc.sentencecase_to_pascalcase(node)
+
+            self._nx_graph.add_edge(node, 'entity')
+
     def _add_properties(self) -> None:
         """
         For each entity in the mapping, update the ontology with the properties
@@ -437,7 +484,7 @@ def get_ancestors(self, node_label: str) -> list:
 
         return nx.dfs_tree(self._nx_graph, node_label)
 
-    def show_ontology_structure(self):
+    def show_ontology_structure(self, to_disk: str = None, full: bool = False):
         """
         Show the ontology structure using treelib.
         """
@@ -453,26 +500,88 @@ def show_ontology_structure(self):
 
         print(msg)
 
-        # set of leaves and their intermediate parents up to the root
-        filter_nodes = set(self.extended_schema.keys())
+        if not full:
 
-        for node in self.extended_schema.keys():
-            filter_nodes.update(self.get_ancestors(node).nodes)
+            # set of leaves and their intermediate parents up to the root
+            filter_nodes = set(self.extended_schema.keys())
 
-        # filter graph
-        graph = self._nx_graph.subgraph(filter_nodes)
+            for node in self.extended_schema.keys():
+                filter_nodes.update(self.get_ancestors(node).nodes)
 
-        # create tree
-        tree = _misc.create_tree_visualisation(graph)
+            # filter graph
+            G = self._nx_graph.subgraph(filter_nodes)
 
-        # add synonym information
-        for node in self.extended_schema:
-            if self.extended_schema[node].get('synonym_for'):
-                tree.nodes[node].tag = (
-                    f'{node} = '
-                    f"{self.extended_schema[node].get('synonym_for')}"
-                )
+        else:
+
+            G = self._nx_graph
+
+        if not to_disk:
+
+            # create tree
+            tree = _misc.create_tree_visualisation(G)
 
-        tree.show()
+            # add synonym information
+            for node in self.extended_schema:
+                if self.extended_schema[node].get('synonym_for'):
+                    tree.nodes[node].tag = (
+                        f'{node} = '
+                        f"{self.extended_schema[node].get('synonym_for')}"
+                    )
+
+            tree.show()
+
+            return tree
+
+        else:
+
+            # convert lists/dicts to strings for vis only
+            for node in G.nodes:
+
+                # rename node and use former id as label
+                label = G.nodes[node].get('label')
+
+                if not label:
+                    label = node
+
+                G = nx.relabel_nodes(G, {node: label})
+                G.nodes[label]['label'] = node
+
+                for attrib in G.nodes[label]:
+                    if type(G.nodes[label][attrib]) in [list, dict]:
+                        G.nodes[label][attrib] = str(G.nodes[label][attrib])
+
+            path = os.path.join(to_disk, 'ontology_structure.graphml')
+
+            logger.info(f'Writing ontology structure to {path}.')
+
+            nx.write_graphml(G, path)
+
+            return True
+
+    def get_dict(self) -> dict:
+        """
+        Returns a dictionary compatible with a BioCypher node for compatibility
+        with the Neo4j driver.
+        """
+
+        d = {
+            'node_id': self._get_current_id(),
+            'node_label': 'BioCypher',
+            'properties': {
+                'schema': 'self.extended_schema',
+            },
+        }
+
+        return d
+
+    def _get_current_id(self):
+        """
+        Instantiate a version ID for the current session. For now does simple
+        versioning using datetime.
+
+        Can later implement incremental versioning, versioning from
+        config file, or manual specification via argument.
+        """
 
-        return tree
+        now = datetime.now()
+        return now.strftime('v%Y%m%d-%H%M%S')
diff --git a/biocypher/_translate.py b/biocypher/_translate.py
index e727f237..3b3bee29 100644
--- a/biocypher/_translate.py
+++ b/biocypher/_translate.py
@@ -9,41 +9,21 @@
 # Distributed under MIT licence, see the file `LICENSE`.
 #
 """
-Lookup and storage of entity IDs that are part of the BioCypher schema.
-
-Todo:
-
-    - genericise: standardise input data to BioCypher specifications or,
-      optionally, user specifications.
-
-        - if the database exists, read biocypher info node
-        - if newly created, ask for user input (?) as to which IDs to
-          use etc
-        - default scenario -> YAML?
-        - the consensus representation ("target" of translation) is
-          the literal Biolink class, which is assigned to database
-          content using user input for each class to be represented
-          in the graph ("source" of translation). currently,
-          implemented by assigning source nomenclature explicitly in
-          the schema_config.yaml file ("label_in_input").
-
-    - type checking: use biolink classes for typing directly?
-
-    - import ID types from pypath dictionary (later, externalised
-      dictionary)? biolink?
+BioCypher 'translation' module. Responsible for translating between the raw
+input data and the BioCypherNode and BioCypherEdge objects.
 """
-from collections.abc import Iterable, Generator
-
 from ._logger import logger
 
 logger.debug(f'Loading module {__name__}.')
 
 from typing import Any, Union, Optional
+from collections.abc import Iterable, Generator
 
 from more_itertools import peekable
 
 from . import _misc
 from ._create import BioCypherEdge, BioCypherNode, BioCypherRelAsNode
+from ._mapping import OntologyMapping
 
 __all__ = ['BiolinkAdapter', 'Translator']
 
@@ -61,7 +41,7 @@ class Translator:
     and cypher queries.
     """
     def __init__(
-        self, extended_schema: dict[str, dict], strict_mode: bool = False
+        self, ontology_mapping: 'OntologyMapping', strict_mode: bool = False
     ):
         """
         Args:
@@ -76,7 +56,7 @@ def __init__(
                 carry source, licence, and version information.
         """
 
-        self.extended_schema = extended_schema
+        self.extended_schema = ontology_mapping.extended_schema
         self.strict_mode = strict_mode
 
         # record nodes without biolink type configured in schema_config.yaml
@@ -400,33 +380,34 @@ def _update_ontology_types(self):
 
         for key, value in self.extended_schema.items():
 
-            if isinstance(value.get('label_in_input'), str):
+            labels = value.get('input_label') or value.get('label_in_input')
 
-                self._ontology_mapping[value.get('label_in_input')] = key
+            if isinstance(labels, str):
 
-            elif isinstance(value.get('label_in_input'), list):
+                self._ontology_mapping[labels] = key
 
-                for label in value['label_in_input']:
+            elif isinstance(labels, list):
+
+                for label in labels:
                     self._ontology_mapping[label] = key
 
             if value.get('label_as_edge'):
 
-                self._add_translation_mappings(
-                    value['label_in_input'], value['label_as_edge']
-                )
+                self._add_translation_mappings(labels, value['label_as_edge'])
 
             else:
 
-                self._add_translation_mappings(value['label_in_input'], key)
+                self._add_translation_mappings(labels, key)
 
     def _get_ontology_mapping(self, label: str) -> Optional[str]:
         """
-        For each given input type ("label_in_input"), find the corresponding
-        ontology class in the leaves dictionary (from the `schema_config.yam`).
+        For each given input type ("input_label" or "label_in_input"), find the
+        corresponding ontology class in the leaves dictionary (from the
+        `schema_config.yam`).
 
         Args:
             label:
-                The input type to find (`label_in_input` in
+                The input type to find (`input_label` or `label_in_input` in
                 `schema_config.yaml`).
         """
 
diff --git a/biocypher/_write.py b/biocypher/_write.py
index 226048e9..27c8a81a 100644
--- a/biocypher/_write.py
+++ b/biocypher/_write.py
@@ -9,66 +9,9 @@
 # Distributed under MIT licence, see the file `LICENSE`.
 #
 """
-Export of CSV files for the Neo4J admin import. The admin import is able
-to quickly transfer large amounts of content into an unused database. For more
-explanation, see https://neo4j.com/docs/operations-manual/current/tuto\
-rial/neo4j-admin-import/.
-
-Import like that:
-https://community.neo4j.com/t/how-can-i-use-a-database-created-with-neo4j-\
-admin-import-in-neo4j-desktop/40594
-
-    - Can properties the node/relationship does not own be left blank?
-
-Formatting: --delimiter=";"
-            --array-delimiter="|"
-            --quote="'"
-
-The header contains information for each field, for ID and properties
-in the format <name>: <field_type>. E.g.:
-`UniProtKB:ID;genesymbol;entrez_id:int;:LABEL`. Multiple labels can
-be given by separating with the array delimiter.
-
-There are three mandatory fields for relationship data:
-:START_ID — ID referring to a node.
-:END_ID — ID referring to a node.
-:TYPE — The relationship type.
-
-E.g.: `:START_ID;relationship_id;residue;:END_ID;:TYPE`.
-
-Headers would best be separate files, data files with similar name but
-different ending. Example from Neo4j documentation:
-
-.. code-block:: bash
-
-   bin/neo4j-admin import --database=neo4j
-   --nodes=import/entities-header.csv,import/entities-part1.csv,
-    import/entities-part2.csv
-   --nodes=import/interactions-header.csv,import/interactions-part1.csv,
-    import/interaction-part2.csv
-   --relationships=import/rels-header.csv,import/rels-part1.csv,
-    import/rels-part2.csv
-
-Can use regex, e.g., [..] import/rels-part*. In this case, use padding
-for ordering of the earlier part files ("01, 02").
-
-# How to import:
-
-1. stop the db
-
-2. shell command:
-
-.. code-block:: bash
-
-   bin/neo4j-admin import --database=neo4j
-   # nodes per type, separate header, regex for parts:
-   --nodes="<path>/<node_type>-header.csv,<path>/<node_type>-part.*"
-   # edges per type, separate header, regex for parts:
-   --relationships="<path>/<edge_type>-header.csv,<path>/<edge_type>-part.*"
-
-3. start db, test for consistency
+BioCypher 'offline' module. Handles the writing of node and edge representations
+suitable for import into a DBMS.
 """
-
 import glob
 
 from ._logger import logger
@@ -85,18 +28,16 @@
 
 from ._config import config as _config
 from ._create import BioCypherEdge, BioCypherNode, BioCypherRelAsNode
-from ._ontology import Ontology
 
-__all__ = ['BatchWriter']
+__all__ = ['get_writer']
 
 if TYPE_CHECKING:
 
-    from ._translate import Translator, OntologyAdapter
-
-# TODO retrospective check of written csvs?
+    from ._ontology import Ontology
+    from ._translate import Translator
 
 
-class BatchWriter:
+class _Neo4jBatchWriter:
     """
     Class for writing node and edge representations to disk using the
     format specified by Neo4j for the use of admin import. Each batch
@@ -158,7 +99,7 @@ def __init__(
         delimiter: str,
         array_delimiter: str,
         quote: str,
-        dirname: Optional[str] = None,
+        output_directory: Optional[str] = None,
         db_name: str = 'neo4j',
         skip_bad_relationships: bool = False,
         skip_duplicate_nodes: bool = False,
@@ -191,18 +132,21 @@ def __init__(
         self.import_call_nodes = ''
         self.import_call_edges = ''
 
-        timestamp = lambda: datetime.now().strftime('%Y%m%d%H%M')
-
-        self.outdir = dirname or os.path.join(_config('outdir'), timestamp())
-        self.outdir = os.path.abspath(self.outdir)
+        self.outdir = output_directory
 
         if import_call_file_prefix is None:
             self.import_call_file_prefix = self.outdir
         else:
             self.import_call_file_prefix = import_call_file_prefix
 
-        logger.info(f'Creating output directory `{self.outdir}`.')
-        os.makedirs(self.outdir, exist_ok=True)
+        if os.path.exists(self.outdir):
+            logger.warning(
+                f'Output directory `{self.outdir}` already exists. '
+                'If this is not planned, file consistency may be compromised.'
+            )
+        else:
+            logger.info(f'Creating output directory `{self.outdir}`.')
+            os.makedirs(self.outdir)
 
         self.seen_node_ids = set()  # set to store the ids of nodes that have
         # already been written; to avoid duplicates
@@ -1097,22 +1041,10 @@ def _construct_import_call(self) -> str:
             str: a bash command for neo4j-admin import
         """
 
-        # escape backslashes in self.delim and self.adelim
-        # only escape for specific delimiters that cause problems
-        if self.delim in ['\t', '\r', '\n']:
-            delim = self.delim.encode('unicode_escape').decode('utf-8')
-        else:
-            delim = self.delim
-
-        if self.adelim in ['\t', '\r', '\n']:
-            adelim = self.adelim.encode('unicode_escape').decode('utf-8')
-        else:
-            adelim = self.adelim
-
         import_call = (
             f'{self.import_call_bin_prefix}neo4j-admin import '
             f'--database={self.db_name} '
-            f'--delimiter="{delim}" --array-delimiter="{adelim}" '
+            f'--delimiter="{self.delim}" --array-delimiter="{self.adelim}" '
         )
 
         if self.quote == "'":
@@ -1158,3 +1090,48 @@ def get_duplicate_edges(self):
             return (self.duplicate_edge_types, self.duplicate_edge_ids)
         else:
             return None
+
+
+DBMS_TO_CLASS = {
+    'neo4j': _Neo4jBatchWriter,
+}
+
+
+def get_writer(
+    dbms: str,
+    translator: 'Translator',
+    ontology: 'Ontology',
+    output_directory: str,
+    strict_mode: bool,
+):
+    """
+    Function to return the writer class.
+
+    Returns:
+        class: the writer class
+    """
+
+    dbms_config = _config(dbms)
+
+    timestamp = lambda: datetime.now().strftime('%Y%m%d%H%M%S')
+    outdir = output_directory or os.path.join('biocypher-out', timestamp())
+    outdir = os.path.abspath(outdir)
+
+    if dbms == 'neo4j':
+        return _Neo4jBatchWriter(
+            ontology=ontology,
+            translator=translator,
+            delimiter=dbms_config.get('delimiter'),
+            array_delimiter=dbms_config.get('array_delimiter'),
+            quote=dbms_config.get('quote_character'),
+            output_directory=outdir,
+            db_name=dbms_config.get('database_name'),
+            skip_bad_relationships=dbms_config.get('skip_bad_relationships'),
+            skip_duplicate_nodes=dbms_config.get('skip_duplicate_nodes'),
+            import_call_bin_prefix=dbms_config.get('import_call_bin_prefix'),
+            import_call_file_prefix=dbms_config.get('import_call_file_prefix'),
+            wipe=dbms_config.get('wipe'),
+            strict_mode=strict_mode,
+        )
+
+    return None
diff --git a/docs/installation.md b/docs/installation.md
index 527a13f4..241a64ac 100644
--- a/docs/installation.md
+++ b/docs/installation.md
@@ -40,6 +40,30 @@ encounter any issues with a specific Python version, please open an issue on
 GitHub.
 ```
 
+## For developers
+If you want to directly install BioCypher, here are the steps (requires
+[Poetry](https://python-poetry.org/docs/#installation)):
+
+```{code-block} bash
+:caption: Execute in bash
+git clone https://github.com/saezlab/BioCypher
+cd BioCypher
+poetry install
+```
+
+Poetry creates a virtual environment for you (starting with `biocypher-`;
+alternatively you can name it yourself) and installs all dependencies.
+
+If you want to run the tests that use a Neo4j DBMS instance:
+- Make sure that you have a Neo4j instance with the APOC plugin installed and a
+database named `test` running on standard bolt port `7687`
+- Activate the virtual environment by running `% poetry shell` and then run the
+tests by running `% pytest` in the root directory of the repository with the
+command line argument `--password=<your DBMS password>`.
+
+Once this is set up, you can go through the [tutorial](tutorial) or use it in
+your project as a local dependency.
+
 (config)=
 # Configuration
 BioCypher comes with a default set of configuration parameters. You can
@@ -50,6 +74,26 @@ can create a `biocypher_config.yaml` in your default BioCypher user directory
 (as found using `appdirs.user_config_dir('biocypher')`). For instance, on Mac
 OS, this would be `~/Library/Caches/biocypher/biocypher_config.yaml`.
 
+```{note}
+
+It is important to follow the rules of indentation in the YAML file. BioCypher
+module configuration is found under the top-level keyword `biocypher`, while
+the settings for DBMS systems (e.g., Neo4j) are found under their respective
+keywords (e.g., `neo4j`).
+
+```
+
+```{admonition} Quote characters
+:class: warning
+
+If possible, avoid using quote characters in your YAML files. If you need to
+quote, for instance a tab delimiter (`\t`), use single quotes (`'`), since
+double quotes (`"`) allow parsing of escape characters in YAML, which can cause
+issues downstream. It is safe to use double quotes to quote a single quote
+character (`"'"`).
+
+```
+
 Configuration files are read in the order `default -> user level -> project
 level`, with the later ones overriding the preceding. The following parameters
 are available:
@@ -57,88 +101,85 @@ are available:
 ## BioCypher settings
 ```{code-block} yaml
 :caption: biocypher_config.yaml
-# Offline mode: do not connect to a running DBMS instance
-# Can be used e.g. for writing CSV files for admin import
-offline: true
-
-# Ontology mapping: `schema_config.yaml` path
-user_schema_config_path: config/schema_config.yaml
-
-# Strict mode: ensure source, version, and licence
-strict_mode: true
-
-# Logging granularity
-# Set debug to true if more granular logging is desired
-debug: true
-
-# Set to change the log directory
-logdir: biocypher-log
-
-# Set to change the output directory
-outdir: biocypher-out
-
-# Ontology configuration
-# We need to define a head ontology (default format OWL) and which node should
-# be the root of the ontology tree.
-head_ontology:
-  url: https://github.com/biolink/biolink-model/raw/master/biolink-model.owl.ttl
-  root_node: 'entity'
-
-# Optionally, we can define an arbitrary number of tail ontologies, using local
-# or online files. For each tail ontology, we need to define the join nodes in
-# the head and tail ontology, at which the two trees will be fused.
-tail_ontologies:
-  so:
-    url: test/so.owl
-    head_join_node: sequence variant
-    tail_join_node: sequence_variant
-  mondo:
-    url: test/mondo.owl
-    head_join_node: disease
-    tail_join_node: disease
+
+biocypher:  ### BioCypher module configuration ###
+
+  ### Required parameters ###
+  # DBMS type
+  dbms: neo4j
+
+  # Offline mode: do not connect to a running DBMS instance
+  # Can be used e.g. for writing batch import files
+  offline: true
+
+  # Strict mode: do not allow to create new nodes or relationships without
+  # specifying source, version, and license parameters
+  strict_mode: false
+
+  # Schema configuration: mapping of inputs to ontology
+  user_schema_config_path: biocypher/_config/test_schema_config.yaml
+
+  # Ontology configuration
+  head_ontology:
+    url: biocypher/_config/biolink-model.owl.ttl
+    root_node: entity
+
+  ### Optional parameters ###
+  # Logging granularity
+  # Set debug to true if more granular logging is desired
+  debug: false
+
+  # Set to change the log directory
+  log_directory: biocypher-log
+
+  # Set to change the output directory
+  output_directory: biocypher-out
+
+  # Optional tail ontologies
+  tail_ontologies:
+    so:
+      url: test/so.owl
+      head_join_node: sequence variant
+      tail_join_node: sequence_variant
+    mondo:
+      url: test/mondo.owl
+      head_join_node: disease
+      tail_join_node: disease
+
 ```
 
 ## Neo4j settings
 ```{code-block} yaml
 :caption: biocypher_config.yaml
-# Neo4j connection credentials
-neo4j_uri: neo4j://localhost:7687   # DB URI
-neo4j_db: neo4j                     # DB name
-neo4j_user: neo4j                   # user name
-neo4j_pw: neo4j                     # password
-
-# Neo4j admin import batch writer settings
-neo4j_delimiter: '¦'                      # delimiter for CSV files
-neo4j_array_delimiter: '|'                # delimiter for array values
-neo4j_quote_char: '"'                     # quote character for CSV files
-neo4j_import_call_bin_prefix: 'bin/'      # path of admin-import executable
-neo4j_import_call_file_prefix: 'import/'  # path of files in admin-import call
-
-# MultiDB functionality
-# Set to false for using community edition or older versions of Neo4j
-neo4j_multi_db: true
-```
 
-# Developers
-If you want to directly install BioCypher, here are the steps (requires
-[Poetry](https://python-poetry.org/docs/#installation)):
+neo4j:  ### Neo4j configuration ###
 
-```{code-block} bash
-:caption: Execute in bash
-git clone https://github.com/saezlab/BioCypher
-cd BioCypher
-poetry install
-```
+  # Database name
+  database_name: neo4j
 
-Poetry creates a virtual environment for you (starting with `biocypher-`;
-alternatively you can name it yourself) and installs all dependencies.
+  # Wipe DB before import (offline mode: --force)
+  wipe: true
 
-- Make sure that you have a Neo4j instance with the APOC plugin installed and a
-database named `test` running on standard bolt port `7687`
-- Enter your Neo4j DBMS password in `./test/test_driver.py`:
-`db_passwd='your_password_here'`
-- Activate the virtual environment by running `% poetry shell` and then run the
-tests by running `% pytest` in the root directory of the repository.
+  # Neo4j authentication
+  uri: neo4j://localhost:7687
+  user: neo4j
+  password: neo4j
 
-Once this is set up, you can go through the [tutorial](tutorial) or use it in
-your project as a local dependency.
+  # Neo4j admin import batch writer settings
+  delimiter: ';'
+  array_delimiter: '|'
+  quote_character: "'"
+
+  # MultiDB functionality
+  # Set to false for using community edition or older versions of Neo4j
+  multi_db: true
+
+  # Import options
+  skip_duplicate_nodes: false
+  skip_bad_relationships: false
+
+  # Import call prefixes to adjust the autogenerated shell script
+  import_call_bin_prefix: bin/
+  import_call_file_prefix: path/to/files/
+
+```
diff --git a/docs/neo4j.md b/docs/neo4j.md
index 3452a83b..67b63a69 100644
--- a/docs/neo4j.md
+++ b/docs/neo4j.md
@@ -133,3 +133,74 @@ driver.reverse_translate_term("PostTranslationalInteraction")
 {py:meth}`biocypher.driver.reverse_translate_query()` replace all label
 designations (following a ":") in entire CYPHER query strings with the
 BioCypher or original versions, respectively.
+
+(neo4j_tut)=
+# Tutorial - Neo4j
+After writing knowledge graph files with BioCypher in offline mode for the Neo4j
+DBMS, the graph can now be imported into Neo4j using the `neo4j-admin` command
+line tool. This is not necessary if the graph is created in online mode. For
+convenience, BioCypher provides the command line call required to import the
+data into Neo4j:
+
+```{code-block} python
+bc.write_import_call()
+```
+
+This creates an executable shell script in the output directory that can be
+executed from the location of the database folder (or copied into the Neo4j
+terminal) to import the graph into Neo4j. Since BioCypher creates separate
+header and data files for each entity type, the import call conveniently
+aggregates this information into one command, detailing the location of all
+files on disk, so no data need to be copied around.
+
+```{caution}
+The generated import call is currently only compatible with Neo4j version 4.
+Version 5 support coming soon!
+```
+
+Neo4j can manage multiple projects, each with multiple DBMS (database management
+system) instances, each of which can house multiple databases. The screenshot
+below shows a project managed by Neo4j Desktop (project name "BioCypher")
+containing a DBMS instance (called "Test DBMS") with multiple named databases in
+it: the non-removable "system" DB, the default "neo4j" DB, and several
+user-created databases.
+
+![Neo4j Desktop](DBMS.png)
+
+Crucially, the import call generated by BioCypher needs to be executed by the
+`neo4j-admin` binary in the DBMS folder (in the `bin/` directory of the root of
+the DBMS folder). The DBMS folder is the folder that contains the `data/`
+directory, which in turn contains the `databases/` folder, which is where the
+graph data is stored in individual folders corresponding to the DB names in the
+DBMS. On Neo4j Desktop, you can open a terminal at the DBMS root location by
+clicking on the three dots next to the DBMS name and selecting "Terminal" (see
+screenshot below).
+
+![Neo4j Desktop](DBMS-Terminal.png)
+
+Since the import call should be executed in the root of the DMBS folder,
+BioCypher generates the import call starting with `bin/neo4j-admin`, which can
+be copied into the terminal opened at the DBMS root location. For other
+operating systems and Neo4j installations (e.g. in Docker containers), please
+refer to the Neo4j documentation to find the correct location of your DMBS. We
+are working on extensions of the BioCypher process to improve interoperability
+with Neo4j as well as other storage systems.
+
+```{note}
+Neo4j provide a [Neo4j Desktop
+application](https://neo4j.com/download-center/#desktop) that can be used to
+create a local instance of Neo4j. The desktop application provides information
+about the DBMS folder and can open a terminal at the DBMS root location. The
+import call generated by BioCypher can then be copied into the terminal of the
+Neo4j Desktop application for each corresponding DBMS.
+
+Neo4j is also available as a command line interface (CLI) tool. To use the CLI
+with the BioCypher admin import call, directory structures and permissions need
+to be set up correctly. The Neo4j CLI tool can be downloaded from the [Neo4j
+download center](https://neo4j.com/download-center/#community). Please follow
+the [Neo4j documentation](https://neo4j.com/docs/) for correct setup and usage
+on your system.
+
+Be mindful that different versions of Neo4j may differ in features and thus are
+also documented differently.
+```
diff --git a/docs/quickstart.md b/docs/quickstart.md
index 8c8e8fac..3fb917d0 100644
--- a/docs/quickstart.md
+++ b/docs/quickstart.md
@@ -142,7 +142,7 @@ identifier, or an HGNC gene symbol. The CURIE prefix for "Uniprot Protein" is
 protein:
   represented_as: node
   preferred_id: uniprot
-  label_in_input: protein
+  input_label: protein
 ```
 
 ```{note}
@@ -162,7 +162,7 @@ case, `ensembl`, can be substituted.
 protein:
   represented_as: node
   preferred_id: ensembl
-  label_in_input: protein
+  input_label: protein
 ```
 
 If there exists no identifier system that is suitable for coverage of
@@ -192,7 +192,7 @@ post translational interaction:
   preferred_id: id
   source: protein
   target: protein
-  label_in_input: post_translational
+  input_label: post_translational
 ```
 
 For the post-translational interaction, which is an association, we are
@@ -240,6 +240,6 @@ post translational interaction:
   preferred_id: id
   source: protein
   target: protein
-  label_in_input: post_translational
+  input_label: post_translational
   label_as_edge: INTERACTS_POST_TRANSLATIONALLY
 ```
diff --git a/docs/tutorial-adapter.md b/docs/tutorial-adapter.md
index 9199cdc3..18dbdd9d 100644
--- a/docs/tutorial-adapter.md
+++ b/docs/tutorial-adapter.md
@@ -97,7 +97,7 @@ represented as 3-tuples, containing:
 - the node ID (unique in the space of the knowledge graph, ideally a CURIE with
   a prefix registered in the Bioregistry)
 - the node type, i.e., its label (this is the string that is mapped to an
-  ontological class via the `label_in_input` field in the schema configuration)
+  ontological class via the `input_label` field in the schema configuration)
 - a dictionary of node attributes
 
 While edges are represented as 5-tuples, containing:
@@ -105,7 +105,7 @@ While edges are represented as 5-tuples, containing:
 - the source node ID (referring to a unique node ID in the KG)
 - the target node ID (referring to a unique node ID in the KG)
 - the relationship type, i.e., its label (this is the string that is mapped to
-  an ontological class via the `label_in_input` field in the schema configuration)
+  an ontological class via the `input_label` field in the schema configuration)
 - a dictionary of relationship attributes
 
 ```{note}
diff --git a/docs/tutorial-ontology.md b/docs/tutorial-ontology.md
index 6829a412..487071f2 100644
--- a/docs/tutorial-ontology.md
+++ b/docs/tutorial-ontology.md
@@ -22,6 +22,7 @@ BioCypher, these nodes would additionally inherit the *PieceOfFurniture* label
 from the ontological hierarchy of things.
 
 ```{note}
+
 Why is the class called *piece of furniture* but the label is
 *PieceOfFurniture*?
 
@@ -35,6 +36,7 @@ PascalCase is more suitable; Neo4j labels and system file names don't deal well
 with spaces and special characters. We also remove the "biolink:"
 [CURIE](https://en.wikipedia.org/wiki/CURIE) prefix for use in file names and
 Neo4j labels.
+
 ```
 
 The relations between concepts can also be organized into a hierarchy. In the
@@ -70,23 +72,8 @@ files. The preferred way to specify the ontology or ontologies to be used in a
 project is to specify them in the biocypher configuration file
 (`biocypher_config.yaml`). This file is used to specify the location of the
 ontology files, as well as the root node of the main ("head") ontology and join
-nodes as fusion points for all "tail" ontologies.
-
-```{code-block} yaml
-:caption: biocypher_config.yaml
-head_ontology:
-  url: https://github.com/biolink/biolink-model/raw/master/biolink-model.owl.ttl
-  root_node: 'entity'
-tail_ontologies:
-  so:
-    url: https://raw.githubusercontent.com/The-Sequence-Ontology/SO-Ontologies/master/Ontology_Files/so.ow
-    head_join_node: sequence variant
-    tail_join_node: sequence_variant
-  mondo:
-    url: http://purl.obolibrary.org/obo/mondo.owl
-    head_join_node: disease
-    tail_join_node: disease
-```
+nodes as fusion points for all "tail" ontologies. For more info, see the
+[section on hybridising ontologies](tut_hybridising).
 
 ## Visualising ontologies
 BioCypher provides a simple way of visualising the ontology hierarchy. This is
@@ -97,12 +84,14 @@ driver:
 
 ```{code-block} python
 :caption: Visualising the ontology hierarchy
-import biocypher
-driver = biocypher.Driver(
+
+from biocypher import BioCypher
+bc = BioCypher(
     offline=True,  # no need to connect or to load data
-    user_schema_config_path="tutorial/06_schema_config.yaml",
+    schema_config_path="tutorial/06_schema_config.yaml",
 )
-driver.show_ontology_structure()
+bc.show_ontology_structure()
+
 ```
 
 This will build the ontology scaffold and print a tree visualisation of its
@@ -142,16 +131,18 @@ Biolink model. This mapping is defined in the schema configuration
 (`schema_config.yaml`, see also [here](qs_schema-config)). In the simplest case,
 the representation of a concept in the knowledge graph to be built and the
 Biolink model class representing this concept are synonymous. For instance, the
-concept *protein* is represented by the Biolink class [*protein*](). To
-introduce proteins into the knowledge graph, one would simply define a node
-constituent with the class label *protein*. This is the mechanism we implicitly
-used for proteins in the basic tutorial ([part 1](tut_01_schema)); to reiterate:
+concept *protein* is represented by the Biolink class *protein*. To introduce
+proteins into the knowledge graph, one would simply define a node constituent
+with the class label *protein*. This is the mechanism we implicitly used for
+proteins in the basic tutorial ([part 1](tut_01_schema)); to reiterate:
 
 ```{code-block} yaml
 :caption: schema_config.yaml
+
 protein:
   represented_as: node
   # ...
+
 ```
 
 (tutorial_ontology_extension)=
@@ -166,7 +157,8 @@ the above "soft" model extensions, proposing the introduction of a new class to
 the model itself. For instance, Biolink is an open source community project, and
 new classes can be requested by opening an issue or filing a pull request
 directly on the [Biolink model GitHub
-repository](https://github.com/biolink/biolink-model).
+repository](https://github.com/biolink/biolink-model). Similar mechanisms apply
+for OBO Foundry ontologies.
 
 BioCypher provides further methods for ontology manipulation. The name of a
 class of the model may be too unwieldy for the use inside the desired knowledge
@@ -189,10 +181,12 @@ of `protein` using the (optional) `is_a` field:
 
 ```{code-block} yaml
 :caption: schema_config.yaml
+
 protein isoform:
   is_a: protein
   represented_as: node
   # ...
+
 ```
 
 Explicit inheritance can also be used to introduce new relationship classes.
@@ -208,10 +202,12 @@ class `pairwise molecular interaction`. To reiterate:
 
 ```{code-block} yaml
 :caption: schema_config.yaml
+
 protein protein interaction:
   is_a: pairwise molecular interaction
   represented_as: node
   # ...
+
 ```
 
 The `is_a` field can be used to specify multiple inheritance, i.e., multiple
@@ -222,18 +218,22 @@ wanted to further extend the protein-protein interaction with a more specific
 
 ```{code-block} yaml
 :caption: schema_config.yaml
+
 enzymatic interaction:
   is_a: [protein protein interaction, pairwise molecular interaction]
   represented_as: node
   # ...
+
 ```
 
 ```{note}
+
 To create this multiple inheritance chain, we do not require the creation of a
 `protein protein interaction` class as shown above; all intermediary classes are
 automatically created by BioCypher and inserted into the ontological hierarchy.
 To obtain a continuous ontology tree, the target class (i.e., the last in the
 list) must be a real Biolink model class.
+
 ```
 
 (tut_implicit)=
@@ -241,16 +241,18 @@ list) must be a real Biolink model class.
 The base model (in the standard case, Biolink) can also be extended without
 specifying an explicit `is_a` field. This "implicit" inheritance happens when
 a class has multiple input labels that each refer to a distinct preferred
-identifier. In other words, if both the `label_in_input` and the `preferred_id`
+identifier. In other words, if both the `input_label` and the `preferred_id`
 fields of a schema configuration class are lists, BioCypher will automatically
 create a subclass for each of the preferred identifiers. This is demonstrated in
 [part 3](implicit_subclass) of the basic tutorial.
 
 ```{caution}
-If only the `label_in_input` field - but not the `preferred_id` field - is a
+
+If only the `input_label` field - but not the `preferred_id` field - is a
 list, BioCypher will merge the inputs instead. This is useful for cases where
 different input streams should be unified under the same class label. See
 [part 2](merging) of the basic tutorial for more information.
+
 ```
 
 To make this more concrete, let's consider the example of `pathway` annotations.
@@ -265,11 +267,13 @@ preferred identifiers in the `preferred_id` field:
 
 ```{code-block} yaml
 :caption: schema_config.yaml
+
 pathway:
   represented_as: node
   preferred_id: [reactome, wikipathways]
-  label_in_input: [react, wiki]
+  input_label: [react, wiki]
   # ...
+
 ```
 
 This will prompt BioCypher to create two subclasses of `pathway`, one for each
@@ -283,37 +287,43 @@ This allows us to query the graph for all `Pathway` nodes as well as for
 specific datasets depending on the desired granularity.
 
 ```{note}
+
 This also works for relationships, but in this case, not the preferred
 identifiers but the sources (defined in the `source` field) are used to
 create the subclasses.
+
 ```
 
 (tut_synonyms)=
 ### Synonyms
 ```{admonition} Tutorial files
 :class: note
-The code for this tutorial can be found at `tutorial/07_synonyms.py`. Schema
-files are at `tutorial/07_schema_config.yaml`. Data generation happens in
+
+The code for this tutorial can be found at `tutorial/07__synonyms.py`. Schema
+files are at `tutorial/07_schema_config.yaml`, configuration in
+`tutorial/07_biocypher_config.yaml`. Data generation happens in
 `tutorial/data_generator.py`.
+
 ```
 
 In some cases, an ontology may contain a biological concept, but the name of the
-concept does for some reason not agree with the users desired
-knowledge graph structure. For instance, the user may not want to represent
-protein complexes in the graph as `macromolecular complex` nodes due to
-ease of use and/or readability criteria and rather call these nodes `complex`.
-In such cases, the user can introduce a synonym for the ontology class. This is
-done by selecting another, more desirable name for the respective class(es) and
-specifying the `synonym_for` field in their schema configuration.  In this case,
-as we would like to represent protein complexes as `complex` nodes, we can do so
-as follows:
+concept does for some reason not agree with the users desired knowledge graph
+structure. For instance, the user may not want to represent protein complexes in
+the graph as `macromolecular complex` nodes due to ease of use and/or
+readability criteria and rather call these nodes `complex`.  In such cases, the
+user can introduce a synonym for the ontology class. This is done by selecting
+another, more desirable name for the respective class(es) and specifying the
+`synonym_for` field in their schema configuration.  In this case, as we would
+like to represent protein complexes as `complex` nodes, we can do so as follows:
 
 ```{code-block} yaml
 :caption: schema_config.yaml
+
 complex:
   synonym_for: macromolecular complex
   represented_as: node
   # ...
+
 ```
 
 Importantly, BioCypher preserves these mappings to enable compatibility between
@@ -322,10 +332,12 @@ ontologies). All entities that are mapped to ontology classes in any way can be
 harmonised even between different types of concrete representations.
 
 ```{note}
+
 It is essential that the desired class name is used as the main class key in the
 schema configuration, and the ontology class name is given in the `synonym_for`
 field. The name given in the `synonym_for` field must be an existing class name
 (in this example, a real Biolink class).
+
 ```
 
 We can visualise the structure of the ontology as we have before using
@@ -334,6 +346,7 @@ now a synonym for the `macromolecular complex` class (their being synonyms
 indicated as an equals sign):
 
 ```{code-block} text
+
 Showing ontology structure based on https://raw.githubusercontent.com/biolink/biolink-model/master/biolink-model.owl.ttl
 entity
 ├── association
@@ -349,6 +362,7 @@ entity
                 ├── entrez.protein
                 ├── protein isoform
                 └── uniprot.protein
+
 ```
 
 (tut_hybridising)=
@@ -374,10 +388,12 @@ make sure that the concept at which the ontologies shall be joined makes sense
 as a point of contact between the ontologies; ideally, it is the exact same
 concept.
 
-```{note}
+```{hint}
+
 If the concept does not exist in the head ontology, but is a feasible child
 class of an existing concept, the above extension functionalities can be used to
 introduce the concept and then fuse the tail ontology there.
+
 ```
 
 The ontology adapter also accepts any arbitrary "head ontology" as a base
@@ -389,19 +405,26 @@ for transparency reasons:
 ```{code-block} yaml
 :caption: Using biocypher_config.yaml
 # ...
-# Ontology configuration
-head_ontology:
-  url: https://github.com/biolink/biolink-model/raw/master/biolink-model.owl.ttl
-  root_node: 'entity'
-tail_ontologies:
-  so:
-    url: https://raw.githubusercontent.com/The-Sequence-Ontology/SO-Ontologies/master/Ontology_Files/so.ow
-    head_join_node: sequence variant
-    tail_join_node: sequence_variant
-  mondo:
-    url: http://purl.obolibrary.org/obo/mondo.owl
-    head_join_node: disease
-    tail_join_node: disease
+
+biocypher:  # biocypher settings
+
+  # Ontology configuration
+  head_ontology:
+    url: https://github.com/biolink/biolink-model/raw/master/biolink-model.owl.ttl
+    root_node: entity
+
+  tail_ontologies:
+
+    so:
+      url: data/so.owl
+      head_join_node: sequence variant
+      tail_join_node: sequence_variant
+
+    mondo:
+      url: http://purl.obolibrary.org/obo/mondo.owl
+      head_join_node: disease
+      tail_join_node: disease
+
 # ...
 ```
 
@@ -410,12 +433,19 @@ The `url` parameter can be either a local path or a URL to a remote resource.
 ```
 
 If you need to pass the ontology configuration programmatically, you can do so
-as follows at driver instantiation:
+as follows at BioCypher interface instantiation:
 
 ```{code-block} python
 :caption: Programmatic usage
-driver = BioCypher.driver(
+
+bc = BioCypher(
     # ...
+
+    head_ontology={
+      'url': 'https://github.com/biolink/biolink-model/raw/master/biolink-model.owl.ttl',
+      'root_node': 'entity',
+    },
+
     tail_ontologies={
         'so':
             {
@@ -430,6 +460,7 @@ driver = BioCypher.driver(
                 'tail_join_node': 'disease',
             }
     },
+
     # ...
 )
 ```
diff --git a/docs/tutorial.md b/docs/tutorial.md
index 85b494fa..d8ba4119 100644
--- a/docs/tutorial.md
+++ b/docs/tutorial.md
@@ -28,9 +28,12 @@ written to the ``biocypher-out`` directory.
 ## Section 1: Adding data
 ```{admonition} Tutorial files
 :class: note
-The code for this tutorial can be found at `tutorial/01_basic_import.py`. The
-schema is at `tutorial/01_schema_config.yaml`. Data generation happens in
+
+The code for this tutorial can be found at `tutorial/01__basic_import.py`. The
+schema is at `tutorial/01_schema_config.yaml`, configuration in
+`tutorial/01_biocypher_config.yaml`. Data generation happens in
 `tutorial/data_generator.py`.
+
 ```
 
 ### Input data stream ("adapter")
@@ -40,8 +43,10 @@ for the resulting desired output (the schema configuration). The former will be
 simulated by calling the `Protein` class of our data generator 10 times.
 
 ```{code-block} python
+
 from data_generator import Protein
 proteins = [Protein() for _ in range(10)]
+
 ```
 
 Each protein in our simulated data has a UniProt ID, a label
@@ -51,11 +56,11 @@ purely by coincidence - very close to the input BioCypher expects (for nodes):
 - an input label (to allow mapping to the ontology, see the second step below)
 - a dictionary of further properties (which can be empty)
 
-These should be presented to the BioCypher driver in the form of a tuple. To
-achieve this representation, we can use a generator function that iterates
-through our simulated input data and, for each entity, forms the corresponding
-tuple. The use of a generator allows for efficient streaming of larger datasets
-where required.
+These should be presented to BioCypher in the form of a tuple. To achieve this
+representation, we can use a generator function that iterates through our
+simulated input data and, for each entity, forms the corresponding tuple. The
+use of a generator allows for efficient streaming of larger datasets where
+required.
 
 ```{code-block} python
 def node_generator():
@@ -71,7 +76,8 @@ The concept of an adapter can become arbitrarily complex and involve
 programmatic access to databases, API requests, asynchronous queries, context
 managers, and other complicating factors. However, it always boils down to
 providing the BioCypher driver with a collection of tuples, one for each entity
-in the input data.
+in the input data. For more info, see the section on
+[Adapters](adapter_functions).
 
 As descibed above, *nodes* possess:
 
@@ -86,17 +92,17 @@ while *edges* possess:
 - a mandatory label, and
 - a property dictionary.
 
-How these entities are mapped to the ontological hierarchy
-underlying a BioCypher graph is determined by their mandatory labels, which
-connect the input data stream to the schema configuration. This we will see in
-the following section.
+How these entities are mapped to the ontological hierarchy underlying a
+BioCypher graph is determined by their mandatory labels, which connect the input
+data stream to the schema configuration. This we will see in the following
+section.
 
 <!-- Figure for ID, label, prop of nodes and edges? -->
 
 (tut_01_schema)=
 ### Schema configuration
-How each BioCypher graph is structured is determined by the schema
-configuration YAML file that is given to the driver. This also serves to ground
+How each BioCypher graph is structured is determined by the schema configuration
+YAML file that is given to the BioCypher interface. This also serves to ground
 the entities of the graph in the biomedical realm by using an ontological
 hierarchy. In this tutorial, we refer to the Biolink model as the general
 backbone of our ontological hierarchy. The basic premise of the schema
@@ -105,14 +111,14 @@ output should be configured here; if (and only if) an entity is represented in
 the schema configuration *and* is present in the input data stream, will it be
 part of our knowledge graph.
 
-In our case, since we only import proteins, we
-only require few lines of configuration:
+In our case, since we only import proteins, we only require few lines of
+configuration:
 
 ```{code-block} yaml
 protein:                            # mapping
   represented_as: node              # schema configuration
   preferred_id: uniprot             # uniqueness
-  label_in_input: uniprot_protein   # connection to input stream
+  input_label: uniprot_protein      # connection to input stream
 ```
 
 The first line (`protein`) identifies our entity and connects to the
@@ -130,8 +136,6 @@ to the underlying ontology, otherwise the multiple hierarchical labels will not
 be populated. Following this first line are three indented values of the
 protein class.
 
-<!-- TODO link to ontology manipulation -->
-
 The second line (`represented_as`) tells BioCypher in which way each entity
 should be represented in the graph; the only options are `node` and `edge`.
 Representation as an edge is only possible when source and target IDs are
@@ -157,104 +161,55 @@ also dealing with parsing of namespace prefixes and validation, we refer to the
 [Bioregistry](https://bioregistry.io) project namespaces, which should be
 preferred values for this field.
 
-Finally, the fourth line (`label_in_input`) connects the input data stream to
-the configuration; here we indicate which label to expect in the input tuple
-for each class in the graph. In our case, we expect "uniprot_protein" as the
-label for each protein in the input data stream; all other input entities that
-do not carry this label are ignored as long as they are not in the schema
+Finally, the fourth line (`input_label`) connects the input data stream to the
+configuration; here we indicate which label to expect in the input tuple for
+each class in the graph. In our case, we expect "uniprot_protein" as the label
+for each protein in the input data stream; all other input entities that do not
+carry this label are ignored as long as they are not in the schema
 configuration.
 
-### Creating the graph (using the BioCypher driver)
-All that remains to be done now is to instantiate the BioCypher driver (as the
+### Creating the graph (using the BioCypher interface)
+All that remains to be done now is to instantiate the BioCypher interface (as the
 main means of communicating with BioCypher) and call the function to create the
-graph. While this can be done "online", i.e., by connecting to a running Neo4j
+graph. While this can be done "online", i.e., by connecting to a running DBMS
 instance, we will in this example use the offline mode of BioCypher, which does
 not require setting up a graph database instance. The following code will use
 the data stream and configuration set up above to write the files for knowledge
 graph creation:
 
 ```{code-block} python
-import biocypher
-driver = biocypher.Driver(
-    offline=True,
-    user_schema_config_path="tutorial/01_schema_config.yaml",
+from biocypher import BioCypher
+bc = BioCypher(
+    biocypher_config_path='tutorial/01_biocypher_config.yaml',
+    schema_config_path="tutorial/01_schema_config.yaml",
 )
-driver.write_nodes(node_generator())
+bc.write_nodes(node_generator())
 ```
 
-We pass our configuration file at driver instantiation, and we pass the data
-stream to the `write_nodes` function. The driver will then create the graph and
-write it to the output directory, which is set to `biocypher-out/` by default,
-creating a subfolder with the current datetime for each driver instance.
+We pass our configuration files at instantiation of the interface, and we pass
+the data stream to the `write_nodes` function. BioCypher will then create the
+graph and write it to the output directory, which is set to `biocypher-out/` by
+default, creating a subfolder with the current datetime for each driver
+instance.
 
-### Importing data into Neo4j
-The graph can now be imported into Neo4j using the `neo4j-admin` command line
-tool. This is not necessary if the graph is created in online mode. For
-convenience, BioCypher provides the command line call required to import the
-data into Neo4j:
+```{note}
 
-```{code-block} python
-driver.write_import_call()
-```
+The `biocypher_config_path` parameter at instantiation of the `BioCypher` class
+should in most cases not be needed; we are using it here to increase convenience
+of the tutorial and to showcase its use. We are overriding the default value of
+only two settings: the offline mode (`offline` in `biocypher`) and the database
+name (`database_name` in `neo4j`).
 
-This creates an executable shell script in the output directory that can be
-executed from the location of the database folder (or copied into the Neo4j
-terminal) to import the graph into Neo4j. Since BioCypher creates separate
-header and data files for each entity type, the import call conveniently
-aggregates this information into one command, detailing the location of all
-files on disk, so no data need to be copied around.
+By default, BioCypher will look for a file named `biocypher_config.yaml` in the
+current working directory and in its subfolder `config`, as well as in various
+user directories. For more information, see the section on
+[configuration](config).
 
-```{caution}
-The generated import call is currently only compatible with Neo4j version 4.
-Version 5 support coming soon!
 ```
 
-Neo4j can manage multiple projects, each with multiple DBMS (database management
-system) instances, each of which can house multiple databases. The screenshot
-below shows a project managed by Neo4j Desktop (project name "BioCypher")
-containing a DBMS instance (called "Test DBMS") with multiple named databases in
-it: the non-removable "system" DB, the default "neo4j" DB, and several
-user-created databases.
-
-![Neo4j Desktop](DBMS.png)
-
-Crucially, the import call generated by BioCypher needs to be executed by the
-`neo4j-admin` binary in the DBMS folder (in the `bin/` directory of the root of
-the DBMS folder). The DBMS folder is the folder that contains the `data/`
-directory, which in turn contains the `databases/` folder, which is where the
-graph data is stored in individual folders corresponding to the DB names in the
-DBMS. On Neo4j Desktop, you can open a terminal at the DBMS root location by
-clicking on the three dots next to the DBMS name and selecting "Terminal" (see
-screenshot below).
-
-![Neo4j Desktop](DBMS-Terminal.png)
-
-Since the import call should be executed in the root of the DMBS folder,
-BioCypher generates the import call starting with `bin/neo4j-admin`, which can
-be copied into the terminal opened at the DBMS root location. For other
-operating systems and Neo4j installations (e.g. in Docker containers), please
-refer to the Neo4j documentation to find the correct location of your DMBS. We
-are working on extensions of the BioCypher process to improve interoperability
-with Neo4j as well as other storage systems.
-
-```{note}
-Neo4j provide a [Neo4j Desktop
-application](https://neo4j.com/download-center/#desktop) that can be used to
-create a local instance of Neo4j. The desktop application provides information
-about the DBMS folder and can open a terminal at the DBMS root location. The
-import call generated by BioCypher can then be copied into the terminal of the
-Neo4j Desktop application for each corresponding DBMS.
-
-Neo4j is also available as a command line interface (CLI) tool. To use the CLI
-with the BioCypher admin import call, directory structures and permissions need
-to be set up correctly. The Neo4j CLI tool can be downloaded from the [Neo4j
-download center](https://neo4j.com/download-center/#community). Please follow
-the [Neo4j documentation](https://neo4j.com/docs/) for correct setup and usage
-on your system.
-
-Be mindful that different versions of Neo4j may differ in features and thus are
-also documented differently.
-```
+### Importing data into Neo4j
+If you want to build an actual Neo4j graph from the tutorial output files,
+please follow the [Neo4j import tutorial](neo4j_tut).
 
 ### Quality control and convenience functions
 BioCypher provides a number of convenience functions for quality control and
@@ -266,9 +221,9 @@ also print the ontological hierarchy derived from the underlying model(s)
 according to the classes that were given in the schema configuration:
 
 ```{code-block} python
-driver.log_missing_bl_types()     # show input unaccounted for in the schema
-driver.log_duplicates()           # show duplicates in the input data
-driver.show_ontology_structure()  # show ontological hierarchy
+bc.log_missing_bl_types()     # show input unaccounted for in the schema
+bc.log_duplicates()           # show duplicates in the input data
+bc.show_ontology_structure()  # show ontological hierarchy
 ```
 
 ## Section 2: Merging data
@@ -277,9 +232,12 @@ driver.show_ontology_structure()  # show ontological hierarchy
 ### Plain merge
 ```{admonition} Tutorial files
 :class: note
-The code for this tutorial can be found at `tutorial/02_merge.py`.
-Schema files are at `tutorial/02_schema_config.yaml`. Data generation happens
-in `tutorial/data_generator.py`.
+
+The code for this tutorial can be found at `tutorial/02__merge.py`.  Schema
+files are at `tutorial/02_schema_config.yaml`, configuration in
+`tutorial/02_biocypher_config.yaml`. Data generation happens in
+`tutorial/data_generator.py`.
+
 ```
 
 Using the workflow described above with minor changes, we can merge data from
@@ -293,7 +251,7 @@ configuration:
 protein:
   represented_as: node
   preferred_id: uniprot
-  label_in_input: [uniprot_protein, entrez_protein]
+  input_label: [uniprot_protein, entrez_protein]
 ```
 
 This again creates a single output file, now for both protein types, including
@@ -311,9 +269,12 @@ hoc* subclasses.
 ### *Ad hoc* subclassing
 ```{admonition} Tutorial files
 :class: note
-The code for this tutorial can be found at `tutorial/03_implicit_subclass.py`.
-Schema files are at `tutorial/03_schema_config.yaml`. Data generation happens
-in `tutorial/data_generator.py`.
+
+The code for this tutorial can be found at `tutorial/03__implicit_subclass.py`.
+Schema files are at `tutorial/03_schema_config.yaml`, configuration in
+`tutorial/03_biocypher_config.yaml`. Data generation happens in
+`tutorial/data_generator.py`.
+
 ```
 
 In the previous section, we saw how to merge data from different sources into
@@ -331,7 +292,7 @@ identifiers. In our case, we update our schema configuration as follows:
 protein:
   represented_as: node
   preferred_id: [uniprot, entrez]
-  label_in_input: [uniprot_protein, entrez_protein]
+  input_label: [uniprot_protein, entrez_protein]
 ```
 
 This will "implicitly" create two subclasses of the `protein` class, which will
@@ -363,11 +324,13 @@ Thus, it is often desirable to filter out properties that are not needed to
 save time, disk space, and memory.
 
 ```{note}
+
 Maintaining consistent properties per entity type is particularly important
 when using the admin import feature of Neo4j, which requires consistency
 between the header and data files. Properties that are introduced into only
 some of the rows will lead to column misalignment and import failure. In
 "online mode", this is not an issue.
+
 ```
 
 We will take a look at how to handle property selection in BioCypher in a
@@ -376,9 +339,12 @@ way that is flexible and easy to maintain.
 ### Designated properties
 ```{admonition} Tutorial files
 :class: note
-The code for this tutorial can be found at `tutorial/04_properties.py`. Schema
-files are at `tutorial/04_schema_config.yaml`. Data generation happens in
+
+The code for this tutorial can be found at `tutorial/04__properties.py`. Schema
+files are at `tutorial/04_schema_config.yaml`, configuration in
+`tutorial/04_biocypher_config.yaml`. Data generation happens in
 `tutorial/data_generator.py`.
+
 ```
 
 The simplest and most straightforward way to ensure that properties are
@@ -389,8 +355,8 @@ standard case the keys are the names of the properties that the entity type
 should possess, and the values give the type of the property (`int`, `str`,
 `bool`). In the case of properties that are not present in (some of) the source
 data, BioCypher will add them to the output with a default value of `None`.
-Additional properties in the input, that are not represented in these
-designated property names, will be ignored.
+Additional properties in the input that are not represented in these
+designated property names will be ignored.
 
 Let's imagine that some, but not all, of our protein nodes have a `mass` value.
 If we want to include the mass value on all proteins, we can add the following
@@ -400,7 +366,7 @@ to our schema configuration:
 protein:
   represented_as: node
   preferred_id: [uniprot, entrez]
-  label_in_input: [uniprot_protein, entrez_protein]
+  input_label: [uniprot_protein, entrez_protein]
   properties:
     sequence: str
     description: str
@@ -421,17 +387,20 @@ remove the `mass` key from the `properties` dictionary.
 
 ```{tip}
 BioCypher provides feedback about property conflicts; try running the code
-for this example (`04_properties.py`) with the schema configuration of the
+for this example (`04__properties.py`) with the schema configuration of the
 previous section (`03_schema_config.yaml`) and see what happens.
 ```
 
 ### Inheriting properties
 ```{admonition} Tutorial files
 :class: note
+
 The code for this tutorial can be found at
-`tutorial/05_property_inheritance.py`. Schema files are at
-`tutorial/05_schema_config.yaml`. Data generation happens in
+`tutorial/05__property_inheritance.py`. Schema files are at
+`tutorial/05_schema_config.yaml`, configuration in
+`tutorial/05_biocypher_config.yaml`. Data generation happens in
 `tutorial/data_generator.py`.
+
 ```
 
 Sometimes, explicit designation of properties requires a lot of maintenance
@@ -451,7 +420,7 @@ protein isoform:
   inherit_properties: true
   represented_as: node
   preferred_id: uniprot
-  label_in_input: uniprot_isoform
+  input_label: uniprot_isoform
 ```
 
 This allows maintenance of property lists for many classes at once. If the child
@@ -474,9 +443,12 @@ and one explicit child (`protein isoform`).
 ## Section 4: Handling relationships
 ```{admonition} Tutorial files
 :class: note
-The code for this tutorial can be found at `tutorial/06_relationships.py`.
-Schema files are at `tutorial/06_schema_config.yaml`. Data generation happens
-in `tutorial/data_generator.py`.
+
+The code for this tutorial can be found at `tutorial/06__relationships.py`.
+Schema files are at `tutorial/06_schema_config.yaml`, configuration in
+`tutorial/06_biocypher_config.yaml`. Data generation happens in
+`tutorial/data_generator.py`.
+
 ```
 
 Naturally, we do not only want nodes in our knowledge graph, but also edges. In
@@ -484,9 +456,9 @@ BioCypher, the configuration of relationships is very similar to that of nodes,
 with some key differences. First the similarities: the top-level class
 configuration of edges is the same; class names refer to ontological classes or
 are an extension thereof. Similarly, the `is_a` key is used to define
-inheritance, and the `inherit_properties` key is used to inherit properties
-from a parent class. Relationships also possess a `preferred_id` key, a
-`label_in_input` key, and a `properties` key, which work in the same way as for
+inheritance, and the `inherit_properties` key is used to inherit properties from
+a parent class. Relationships also possess a `preferred_id` key, an
+`input_label` key, and a `properties` key, which work in the same way as for
 nodes.
 
 Relationships also have a `represented_as` key, which in this case can be
@@ -504,7 +476,7 @@ protein protein interaction:
   is_a: pairwise molecular interaction
   represented_as: node
   preferred_id: intact
-  label_in_input: interacts_with
+  input_label: interacts_with
   properties:
     method: str
     source: str
diff --git a/ontology.graphml b/ontology.graphml
new file mode 100644
index 00000000..1d4384b8
--- /dev/null
+++ b/ontology.graphml
@@ -0,0 +1,1374 @@
+<?xml version='1.0' encoding='utf-8'?>
+<graphml xmlns="http://graphml.graphdrawing.org/xmlns" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://graphml.graphdrawing.org/xmlns http://graphml.graphdrawing.org/xmlns/1.0/graphml.xsd">
+  <key id="virtual" for="node" attr.name="virtual" attr.type="boolean" />
+  <key id="inherit_properties" for="node" attr.name="inherit_properties" attr.type="boolean" />
+  <key id="is_a" for="node" attr.name="is_a" attr.type="string" />
+  <key id="user_extension" for="node" attr.name="user_extension" attr.type="boolean" />
+  <key id="properties" for="node" attr.name="properties" attr.type="string" />
+  <key id="exclude_properties" for="node" attr.name="exclude_properties" attr.type="string" />
+  <key id="input_label" for="node" attr.name="input_label" attr.type="string" />
+  <key id="label_as_edge" for="node" attr.name="label_as_edge" attr.type="string" />
+  <key id="preferred_id" for="node" attr.name="preferred_id" attr.type="string" />
+  <key id="label_in_input" for="node" attr.name="label_in_input" attr.type="string" />
+  <key id="target" for="node" attr.name="target" attr.type="string" />
+  <key id="source" for="node" attr.name="source" attr.type="string" />
+  <key id="represented_as" for="node" attr.name="represented_as" attr.type="string" />
+  <key id="label" for="node" attr.name="label" attr.type="string" />
+  <graph edgedefault="directed">
+    <node id="Entity">
+      <data key="label">entity</data>
+    </node>
+    <node id="Association">
+      <data key="label">association</data>
+    </node>
+    <node id="BehaviorToBehavioralFeatureAssociation">
+      <data key="label">behavior to behavioral feature association</data>
+    </node>
+    <node id="EntityToPhenotypicFeatureAssociationMixin">
+      <data key="label">entity to phenotypic feature association mixin</data>
+    </node>
+    <node id="EntityToFeatureOrDiseaseQualifiersMixin">
+      <data key="label">entity to feature or disease qualifiers mixin</data>
+    </node>
+    <node id="FrequencyQualifierMixin">
+      <data key="label">frequency qualifier mixin</data>
+    </node>
+    <node id="FrequencyQuantifier">
+      <data key="label">frequency quantifier</data>
+    </node>
+    <node id="RelationshipQuantifier">
+      <data key="label">relationship quantifier</data>
+    </node>
+    <node id="CaseToPhenotypicFeatureAssociation">
+      <data key="label">case to phenotypic feature association</data>
+    </node>
+    <node id="CaseToEntityAssociationMixin">
+      <data key="label">case to entity association mixin</data>
+    </node>
+    <node id="ChemicalAffectsGeneAssociation">
+      <data key="label">chemical affects gene association</data>
+    </node>
+    <node id="ChemicalEntityAssessesNamedThingAssociation">
+      <data key="label">chemical entity assesses named thing association</data>
+    </node>
+    <node id="ChemicalEntityOrGeneOrGeneProductRegulatesGeneAssociation">
+      <data key="label">chemical entity or gene or gene product regulates gene association</data>
+    </node>
+    <node id="ChemicalGeneInteractionAssociation">
+      <data key="label">chemical gene interaction association</data>
+    </node>
+    <node id="ChemicalToEntityAssociationMixin">
+      <data key="label">chemical to entity association mixin</data>
+    </node>
+    <node id="ChemicalEntityToEntityAssociationMixin">
+      <data key="label">chemical entity to entity association mixin</data>
+    </node>
+    <node id="ChemicalToDiseaseOrPhenotypicFeatureAssociation">
+      <data key="label">chemical to disease or phenotypic feature association</data>
+    </node>
+    <node id="EntityToDiseaseOrPhenotypicFeatureAssociationMixin">
+      <data key="label">entity to disease or phenotypic feature association mixin</data>
+    </node>
+    <node id="ChemicalToPathwayAssociation">
+      <data key="label">chemical to pathway association</data>
+    </node>
+    <node id="ContributorAssociation">
+      <data key="label">contributor association</data>
+    </node>
+    <node id="DiseaseOrPhenotypicFeatureToGeneticInheritanceAssociation">
+      <data key="label">disease or phenotypic feature to genetic inheritance association</data>
+    </node>
+    <node id="DiseaseOrPhenotypicFeatureToEntityAssociationMixin">
+      <data key="label">disease or phenotypic feature to entity association mixin</data>
+    </node>
+    <node id="DiseaseOrPhenotypicFeatureToLocationAssociation">
+      <data key="label">disease or phenotypic feature to location association</data>
+    </node>
+    <node id="DiseaseToExposureEventAssociation">
+      <data key="label">disease to exposure event association</data>
+    </node>
+    <node id="DiseaseToEntityAssociationMixin">
+      <data key="label">disease to entity association mixin</data>
+    </node>
+    <node id="EntityToExposureEventAssociationMixin">
+      <data key="label">entity to exposure event association mixin</data>
+    </node>
+    <node id="DiseaseToPhenotypicFeatureAssociation">
+      <data key="label">disease to phenotypic feature association</data>
+    </node>
+    <node id="DrugToGeneAssociation">
+      <data key="label">drug to gene association</data>
+    </node>
+    <node id="DrugToEntityAssociationMixin">
+      <data key="label">drug to entity association mixin</data>
+    </node>
+    <node id="EntityToDiseaseAssociation">
+      <data key="label">entity to disease association</data>
+    </node>
+    <node id="EntityToPhenotypicFeatureAssociation">
+      <data key="label">entity to phenotypic feature association</data>
+    </node>
+    <node id="ExposureEventToOutcomeAssociation">
+      <data key="label">exposure event to outcome association</data>
+    </node>
+    <node id="EntityToOutcomeAssociationMixin">
+      <data key="label">entity to outcome association mixin</data>
+    </node>
+    <node id="ExposureEventToPhenotypicFeatureAssociation">
+      <data key="label">exposure event to phenotypic feature association</data>
+    </node>
+    <node id="GeneToExpressionSiteAssociation">
+      <data key="label">gene to expression site association</data>
+    </node>
+    <node id="GeneToGeneFamilyAssociation">
+      <data key="label">gene to gene family association</data>
+    </node>
+    <node id="GeneToPathwayAssociation">
+      <data key="label">gene to pathway association</data>
+    </node>
+    <node id="GeneToEntityAssociationMixin">
+      <data key="label">gene to entity association mixin</data>
+    </node>
+    <node id="GeneToPhenotypicFeatureAssociation">
+      <data key="label">gene to phenotypic feature association</data>
+    </node>
+    <node id="GenotypeToGeneAssociation">
+      <data key="label">genotype to gene association</data>
+    </node>
+    <node id="GenotypeToGenotypePartAssociation">
+      <data key="label">genotype to genotype part association</data>
+    </node>
+    <node id="GenotypeToPhenotypicFeatureAssociation">
+      <data key="label">genotype to phenotypic feature association</data>
+    </node>
+    <node id="GenotypeToEntityAssociationMixin">
+      <data key="label">genotype to entity association mixin</data>
+    </node>
+    <node id="GenotypeToVariantAssociation">
+      <data key="label">genotype to variant association</data>
+    </node>
+    <node id="InformationContentEntityToNamedThingAssociation">
+      <data key="label">information content entity to named thing association</data>
+    </node>
+    <node id="MaterialSampleDerivationAssociation">
+      <data key="label">material sample derivation association</data>
+    </node>
+    <node id="MaterialSampleToDiseaseOrPhenotypicFeatureAssociation">
+      <data key="label">material sample to disease or phenotypic feature association</data>
+    </node>
+    <node id="MaterialSampleToEntityAssociationMixin">
+      <data key="label">material sample to entity association mixin</data>
+    </node>
+    <node id="MolecularActivityToChemicalEntityAssociation">
+      <data key="label">molecular activity to chemical entity association</data>
+    </node>
+    <node id="MolecularActivityToMolecularActivityAssociation">
+      <data key="label">molecular activity to molecular activity association</data>
+    </node>
+    <node id="MolecularActivityToPathwayAssociation">
+      <data key="label">molecular activity to pathway association</data>
+    </node>
+    <node id="NamedThingAssociatedWithLikelihoodOfNamedThingAssociation">
+      <data key="label">named thing associated with likelihood of named thing association</data>
+    </node>
+    <node id="OrganismTaxonToEnvironmentAssociation">
+      <data key="label">organism taxon to environment association</data>
+    </node>
+    <node id="OrganismTaxonToEntityAssociation">
+      <data key="label">organism taxon to entity association</data>
+    </node>
+    <node id="OrganismToOrganismAssociation">
+      <data key="label">organism to organism association</data>
+    </node>
+    <node id="OrganismalEntityAsAModelOfDiseaseAssociation">
+      <data key="label">organismal entity as a model of disease association</data>
+    </node>
+    <node id="EntityToDiseaseAssociationMixin">
+      <data key="label">entity to disease association mixin</data>
+    </node>
+    <node id="ModelToDiseaseAssociationMixin">
+      <data key="label">model to disease association mixin</data>
+    </node>
+    <node id="PopulationToPopulationAssociation">
+      <data key="label">population to population association</data>
+    </node>
+    <node id="SequenceVariantModulatesTreatmentAssociation">
+      <data key="label">sequence variant modulates treatment association</data>
+    </node>
+    <node id="TaxonToTaxonAssociation">
+      <data key="label">taxon to taxon association</data>
+    </node>
+    <node id="VariantToPhenotypicFeatureAssociation">
+      <data key="label">variant to phenotypic feature association</data>
+    </node>
+    <node id="VariantToEntityAssociationMixin">
+      <data key="label">variant to entity association mixin</data>
+    </node>
+    <node id="VariantToPopulationAssociation">
+      <data key="label">variant to population association</data>
+    </node>
+    <node id="CellLineToDiseaseOrPhenotypicFeatureAssociation">
+      <data key="label">cell line to disease or phenotypic feature association</data>
+    </node>
+    <node id="CellLineAsAModelOfDiseaseAssociation">
+      <data key="label">cell line as a model of disease association</data>
+    </node>
+    <node id="CellLineToEntityAssociationMixin">
+      <data key="label">cell line to entity association mixin</data>
+    </node>
+    <node id="ChemicalOrDrugOrTreatmentToDiseaseOrPhenotypicFeatureAssociation">
+      <data key="label">chemical or drug or treatment to disease or phenotypic feature association</data>
+    </node>
+    <node id="ChemicalOrDrugOrTreatmentSideEffectDiseaseOrPhenotypicFeatureAssociation">
+      <data key="label">chemical or drug or treatment side effect disease or phenotypic feature association</data>
+    </node>
+    <node id="GenotypeToDiseaseAssociation">
+      <data key="label">genotype to disease association</data>
+    </node>
+    <node id="GenotypeAsAModelOfDiseaseAssociation">
+      <data key="label">genotype as a model of disease association</data>
+    </node>
+    <node id="SequenceAssociation">
+      <data key="label">sequence association</data>
+    </node>
+    <node id="GenomicSequenceLocalization">
+      <data key="label">genomic sequence localization</data>
+    </node>
+    <node id="VariantToDiseaseAssociation">
+      <data key="label">variant to disease association</data>
+    </node>
+    <node id="VariantAsAModelOfDiseaseAssociation">
+      <data key="label">variant as a model of disease association</data>
+    </node>
+    <node id="VariantToGeneAssociation">
+      <data key="label">variant to gene association</data>
+      <data key="represented_as">edge</data>
+      <data key="source">['known.sequence variant', 'somatic.sequence variant']</data>
+      <data key="target">gene</data>
+      <data key="label_in_input">['VARIANT_FOUND_IN_GENE_Known_variant_Gene', 'VARIANT_FOUND_IN_GENE_Somatic_mutation_Gene']</data>
+      <data key="preferred_id">id</data>
+    </node>
+    <node id="VariantToGeneExpressionAssociation">
+      <data key="label">variant to gene expression association</data>
+    </node>
+    <node id="GeneExpressionMixin">
+      <data key="label">gene expression mixin</data>
+    </node>
+    <node id="AnatomicalEntityToAnatomicalEntityAssociation">
+      <data key="label">anatomical entity to anatomical entity association</data>
+    </node>
+    <node id="AnatomicalEntityToAnatomicalEntityOntogenicAssociation">
+      <data key="label">anatomical entity to anatomical entity ontogenic association</data>
+    </node>
+    <node id="AnatomicalEntityToAnatomicalEntityPartOfAssociation">
+      <data key="label">anatomical entity to anatomical entity part of association</data>
+    </node>
+    <node id="ChemicalToChemicalAssociation">
+      <data key="label">chemical to chemical association</data>
+    </node>
+    <node id="ChemicalToChemicalDerivationAssociation">
+      <data key="label">chemical to chemical derivation association</data>
+    </node>
+    <node id="ReactionToParticipantAssociation">
+      <data key="label">reaction to participant association</data>
+    </node>
+    <node id="ReactionToCatalystAssociation">
+      <data key="label">reaction to catalyst association</data>
+    </node>
+    <node id="OrganismTaxonToOrganismTaxonAssociation">
+      <data key="label">organism taxon to organism taxon association</data>
+    </node>
+    <node id="OrganismTaxonToOrganismTaxonInteraction">
+      <data key="label">organism taxon to organism taxon interaction</data>
+    </node>
+    <node id="OrganismTaxonToOrganismTaxonSpecialization">
+      <data key="label">organism taxon to organism taxon specialization</data>
+    </node>
+    <node id="GeneToDiseaseAssociation">
+      <data key="label">gene to disease association</data>
+      <data key="represented_as">edge</data>
+      <data key="label_as_edge">PERTURBED_IN_DISEASE</data>
+      <data key="input_label">['protein_disease', 'gene_disease']</data>
+      <data key="exclude_properties">accession</data>
+      <data key="preferred_id">id</data>
+    </node>
+    <node id="DruggableGeneToDiseaseAssociation">
+      <data key="label">druggable gene to disease association</data>
+    </node>
+    <node id="GeneAsAModelOfDiseaseAssociation">
+      <data key="label">gene as a model of disease association</data>
+    </node>
+    <node id="GeneHasVariantThatContributesToDiseaseAssociation">
+      <data key="label">gene has variant that contributes to disease association</data>
+    </node>
+    <node id="GeneToGeneAssociation">
+      <data key="label">gene to gene association</data>
+      <data key="represented_as">edge</data>
+      <data key="label_in_input">gene_gene</data>
+      <data key="properties">{'directional': 'bool', 'curated': 'bool', 'score': 'float'}</data>
+      <data key="preferred_id">id</data>
+    </node>
+    <node id="GeneToGeneCoexpressionAssociation">
+      <data key="label">gene to gene coexpression association</data>
+    </node>
+    <node id="GeneToGeneHomologyAssociation">
+      <data key="label">gene to gene homology association</data>
+    </node>
+    <node id="PairwiseGeneToGeneInteraction">
+      <data key="label">pairwise gene to gene interaction</data>
+    </node>
+    <node id="PairwiseMolecularInteraction">
+      <data key="label">pairwise molecular interaction</data>
+    </node>
+    <node id="SequenceFeatureRelationship">
+      <data key="label">sequence feature relationship</data>
+    </node>
+    <node id="ExonToTranscriptRelationship">
+      <data key="label">exon to transcript relationship</data>
+    </node>
+    <node id="GeneToGeneProductRelationship">
+      <data key="label">gene to gene product relationship</data>
+    </node>
+    <node id="TranscriptToGeneRelationship">
+      <data key="label">transcript to gene relationship</data>
+    </node>
+    <node id="FunctionalAssociation">
+      <data key="label">functional association</data>
+    </node>
+    <node id="GeneToGoTermAssociation">
+      <data key="label">gene to go term association</data>
+    </node>
+    <node id="MacromolecularMachineToBiologicalProcessAssociation">
+      <data key="label">macromolecular machine to biological process association</data>
+    </node>
+    <node id="MacromolecularMachineToEntityAssociationMixin">
+      <data key="label">macromolecular machine to entity association mixin</data>
+    </node>
+    <node id="MacromolecularMachineToCellularComponentAssociation">
+      <data key="label">macromolecular machine to cellular component association</data>
+    </node>
+    <node id="MacromolecularMachineToMolecularActivityAssociation">
+      <data key="label">macromolecular machine to molecular activity association</data>
+    </node>
+    <node id="NamedThing">
+      <data key="label">named thing</data>
+    </node>
+    <node id="Activity">
+      <data key="label">activity</data>
+    </node>
+    <node id="ActivityAndBehavior">
+      <data key="label">activity and behavior</data>
+    </node>
+    <node id="Occurrent">
+      <data key="label">occurrent</data>
+    </node>
+    <node id="PhysicalEssenceOrOccurrent">
+      <data key="label">physical essence or occurrent</data>
+    </node>
+    <node id="Event">
+      <data key="label">event</data>
+    </node>
+    <node id="Phenomenon">
+      <data key="label">phenomenon</data>
+    </node>
+    <node id="AdministrativeEntity">
+      <data key="label">administrative entity</data>
+    </node>
+    <node id="Agent">
+      <data key="label">agent</data>
+    </node>
+    <node id="Treatment">
+      <data key="label">treatment</data>
+    </node>
+    <node id="ChemicalOrDrugOrTreatment">
+      <data key="label">chemical or drug or treatment</data>
+    </node>
+    <node id="ExposureEvent">
+      <data key="label">exposure event</data>
+    </node>
+    <node id="OntologyClass">
+      <data key="label">ontology class</data>
+    </node>
+    <node id="ClinicalEntity">
+      <data key="label">clinical entity</data>
+    </node>
+    <node id="ClinicalTrial">
+      <data key="label">clinical trial</data>
+    </node>
+    <node id="ClinicalIntervention">
+      <data key="label">clinical intervention</data>
+    </node>
+    <node id="Hospitalization">
+      <data key="label">hospitalization</data>
+    </node>
+    <node id="Device">
+      <data key="label">device</data>
+    </node>
+    <node id="Procedure">
+      <data key="label">procedure</data>
+    </node>
+    <node id="PlanetaryEntity">
+      <data key="label">planetary entity</data>
+    </node>
+    <node id="EnvironmentalFeature">
+      <data key="label">environmental feature</data>
+    </node>
+    <node id="EnvironmentalProcess">
+      <data key="label">environmental process</data>
+    </node>
+    <node id="GeographicLocation">
+      <data key="label">geographic location</data>
+    </node>
+    <node id="GeographicLocationAtTime">
+      <data key="label">geographic location at time</data>
+    </node>
+    <node id="PhysicalEntity">
+      <data key="label">physical entity</data>
+    </node>
+    <node id="MaterialSample">
+      <data key="label">material sample</data>
+    </node>
+    <node id="SubjectOfInvestigation">
+      <data key="label">subject of investigation</data>
+    </node>
+    <node id="PhysicalEssence">
+      <data key="label">physical essence</data>
+    </node>
+    <node id="OrganismTaxon">
+      <data key="label">organism taxon</data>
+    </node>
+    <node id="InformationContentEntity">
+      <data key="label">information content entity</data>
+    </node>
+    <node id="CommonDataElement">
+      <data key="label">common data element</data>
+    </node>
+    <node id="Study">
+      <data key="label">study</data>
+    </node>
+    <node id="StudyVariable">
+      <data key="label">study variable</data>
+    </node>
+    <node id="ConfidenceLevel">
+      <data key="label">confidence level</data>
+    </node>
+    <node id="EvidenceType">
+      <data key="label">evidence type</data>
+    </node>
+    <node id="DatasetDistribution">
+      <data key="label">dataset distribution</data>
+    </node>
+    <node id="DatasetSummary">
+      <data key="label">dataset summary</data>
+    </node>
+    <node id="DatasetVersion">
+      <data key="label">dataset version</data>
+    </node>
+    <node id="Dataset">
+      <data key="label">dataset</data>
+    </node>
+    <node id="StudyResult">
+      <data key="label">study result</data>
+    </node>
+    <node id="ChiSquaredAnalysisResult">
+      <data key="label">chi squared analysis result</data>
+    </node>
+    <node id="ConceptCountAnalysisResult">
+      <data key="label">concept count analysis result</data>
+    </node>
+    <node id="ObservedExpectedFrequencyAnalysisResult">
+      <data key="label">observed expected frequency analysis result</data>
+    </node>
+    <node id="RelativeFrequencyAnalysisResult">
+      <data key="label">relative frequency analysis result</data>
+    </node>
+    <node id="TextMiningResult">
+      <data key="label">text mining result</data>
+    </node>
+    <node id="InformationResource">
+      <data key="label">information resource</data>
+    </node>
+    <node id="Publication">
+      <data key="label">publication</data>
+    </node>
+    <node id="Article">
+      <data key="label">article</data>
+    </node>
+    <node id="Book">
+      <data key="label">book</data>
+    </node>
+    <node id="Serial">
+      <data key="label">serial</data>
+    </node>
+    <node id="BookChapter">
+      <data key="label">book chapter</data>
+    </node>
+    <node id="BiologicalEntity">
+      <data key="label">biological entity</data>
+    </node>
+    <node id="Genome">
+      <data key="label">genome</data>
+    </node>
+    <node id="GenomicEntity">
+      <data key="label">genomic entity</data>
+    </node>
+    <node id="Haplotype">
+      <data key="label">haplotype</data>
+    </node>
+    <node id="MacromolecularComplex">
+      <data key="label">complex</data>
+    </node>
+    <node id="MacromolecularMachineMixin">
+      <data key="label">macromolecular machine mixin</data>
+    </node>
+    <node id="NucleicAcidSequenceMotif">
+      <data key="label">nucleic acid sequence motif</data>
+    </node>
+    <node id="NucleosomeModification">
+      <data key="label">nucleosome modification</data>
+    </node>
+    <node id="EpigenomicEntity">
+      <data key="label">epigenomic entity</data>
+    </node>
+    <node id="GeneProductIsoformMixin">
+      <data key="label">gene product isoform mixin</data>
+    </node>
+    <node id="GeneProductMixin">
+      <data key="label">gene product mixin</data>
+    </node>
+    <node id="GeneOrGeneProduct">
+      <data key="label">gene or gene product</data>
+    </node>
+    <node id="PosttranslationalModification">
+      <data key="label">posttranslational modification</data>
+    </node>
+    <node id="ProteinDomain">
+      <data key="label">protein domain</data>
+    </node>
+    <node id="ChemicalEntityOrGeneOrGeneProduct">
+      <data key="label">chemical entity or gene or gene product</data>
+    </node>
+    <node id="GeneGroupingMixin">
+      <data key="label">gene grouping mixin</data>
+    </node>
+    <node id="ProteinFamily">
+      <data key="label">protein family</data>
+    </node>
+    <node id="ReagentTargetedGene">
+      <data key="label">reagent targeted gene</data>
+    </node>
+    <node id="GeneFamily">
+      <data key="label">gene family</data>
+    </node>
+    <node id="Polypeptide">
+      <data key="label">polypeptide</data>
+    </node>
+    <node id="Protein">
+      <data key="label">protein</data>
+      <data key="represented_as">node</data>
+      <data key="preferred_id">uniprot</data>
+      <data key="input_label">protein</data>
+      <data key="properties">{'name': 'str', 'score': 'float', 'taxon': 'int', 'genes': 'str[]'}</data>
+    </node>
+    <node id="ProteinIsoform">
+      <data key="label">protein isoform</data>
+    </node>
+    <node id="ChemicalEntityOrProteinOrPolypeptide">
+      <data key="label">chemical entity or protein or polypeptide</data>
+    </node>
+    <node id="GeneticInheritance">
+      <data key="label">genetic inheritance</data>
+    </node>
+    <node id="Genotype">
+      <data key="label">genotype</data>
+    </node>
+    <node id="OrganismalEntity">
+      <data key="label">organismal entity</data>
+    </node>
+    <node id="CellularOrganism">
+      <data key="label">cellular organism</data>
+    </node>
+    <node id="Virus">
+      <data key="label">virus</data>
+    </node>
+    <node id="CellLine">
+      <data key="label">cell line</data>
+    </node>
+    <node id="IndividualOrganism">
+      <data key="label">individual organism</data>
+    </node>
+    <node id="Case">
+      <data key="label">case</data>
+    </node>
+    <node id="LifeStage">
+      <data key="label">life stage</data>
+    </node>
+    <node id="PopulationOfIndividualOrganisms">
+      <data key="label">population of individual organisms</data>
+    </node>
+    <node id="StudyPopulation">
+      <data key="label">study population</data>
+    </node>
+    <node id="Cohort">
+      <data key="label">cohort</data>
+    </node>
+    <node id="AnatomicalEntity">
+      <data key="label">anatomical entity</data>
+    </node>
+    <node id="Cell">
+      <data key="label">cell</data>
+    </node>
+    <node id="GrossAnatomicalStructure">
+      <data key="label">gross anatomical structure</data>
+    </node>
+    <node id="PathologicalAnatomicalStructure">
+      <data key="label">pathological anatomical structure</data>
+    </node>
+    <node id="PathologicalEntityMixin">
+      <data key="label">pathological entity mixin</data>
+    </node>
+    <node id="CellularComponent">
+      <data key="label">cellular component</data>
+    </node>
+    <node id="BiologicalProcessOrActivity">
+      <data key="label">biological process or activity</data>
+    </node>
+    <node id="MolecularActivity">
+      <data key="label">molecular activity</data>
+    </node>
+    <node id="BiologicalProcess">
+      <data key="label">biological process</data>
+    </node>
+    <node id="PathologicalProcess">
+      <data key="label">pathological process</data>
+    </node>
+    <node id="PhysiologicalProcess">
+      <data key="label">physiological process</data>
+    </node>
+    <node id="Behavior">
+      <data key="label">behavior</data>
+    </node>
+    <node id="Pathway">
+      <data key="label">pathway</data>
+      <data key="represented_as">node</data>
+      <data key="preferred_id">['reactome', 'wikipathways']</data>
+      <data key="input_label">['reactome', 'wikipathways']</data>
+    </node>
+    <node id="SO_0001060">
+      <data key="label">sequence variant</data>
+      <data key="represented_as">node</data>
+      <data key="preferred_id">['clinically relevant', 'known', 'somatic']</data>
+      <data key="label_in_input">['Clinically_relevant_variant', 'Known_variant', 'Somatic_mutation']</data>
+      <data key="properties">{'source': 'str', 'original_source': 'str', 'effect': 'str', 'biotype': 'str'}</data>
+    </node>
+    <node id="Snv">
+      <data key="label">snv</data>
+    </node>
+    <node id="Gene">
+      <data key="label">gene</data>
+      <data key="represented_as">node</data>
+      <data key="preferred_id">hgnc</data>
+      <data key="label_in_input">['hgnc', 'ensg']</data>
+      <data key="exclude_properties">accession</data>
+    </node>
+    <node id="DiseaseOrPhenotypicFeature">
+      <data key="label">disease or phenotypic feature</data>
+    </node>
+    <node id="PhenotypicFeature">
+      <data key="label">phenotypic feature</data>
+    </node>
+    <node id="ClinicalFinding">
+      <data key="label">clinical finding</data>
+    </node>
+    <node id="BehavioralFeature">
+      <data key="label">behavioral feature</data>
+    </node>
+    <node id="MONDO_0000001">
+      <data key="label">disease</data>
+      <data key="represented_as">node</data>
+      <data key="preferred_id">doid</data>
+      <data key="label_in_input">Disease</data>
+    </node>
+    <node id="ThingWithTaxon">
+      <data key="label">thing with taxon</data>
+    </node>
+    <node id="Attribute">
+      <data key="label">attribute</data>
+    </node>
+    <node id="BehavioralExposure">
+      <data key="label">behavioral exposure</data>
+    </node>
+    <node id="BioticExposure">
+      <data key="label">biotic exposure</data>
+    </node>
+    <node id="ComplexChemicalExposure">
+      <data key="label">complex chemical exposure</data>
+    </node>
+    <node id="DiseaseOrPhenotypicFeatureExposure">
+      <data key="label">disease or phenotypic feature exposure</data>
+    </node>
+    <node id="GenomicBackgroundExposure">
+      <data key="label">genomic background exposure</data>
+    </node>
+    <node id="PathologicalAnatomicalExposure">
+      <data key="label">pathological anatomical exposure</data>
+    </node>
+    <node id="PathologicalProcessExposure">
+      <data key="label">pathological process exposure</data>
+    </node>
+    <node id="SocioeconomicExposure">
+      <data key="label">socioeconomic exposure</data>
+    </node>
+    <node id="ChemicalExposure">
+      <data key="label">chemical exposure</data>
+    </node>
+    <node id="DrugExposure">
+      <data key="label">drug exposure</data>
+    </node>
+    <node id="DrugToGeneInteractionExposure">
+      <data key="label">drug to gene interaction exposure</data>
+    </node>
+    <node id="EnvironmentalExposure">
+      <data key="label">environmental exposure</data>
+    </node>
+    <node id="GeographicExposure">
+      <data key="label">geographic exposure</data>
+    </node>
+    <node id="OrganismAttribute">
+      <data key="label">organism attribute</data>
+    </node>
+    <node id="PhenotypicQuality">
+      <data key="label">phenotypic quality</data>
+    </node>
+    <node id="ChemicalRole">
+      <data key="label">chemical role</data>
+    </node>
+    <node id="SocioeconomicAttribute">
+      <data key="label">socioeconomic attribute</data>
+    </node>
+    <node id="Zygosity">
+      <data key="label">zygosity</data>
+    </node>
+    <node id="ClinicalAttribute">
+      <data key="label">clinical attribute</data>
+    </node>
+    <node id="ClinicalMeasurement">
+      <data key="label">clinical measurement</data>
+    </node>
+    <node id="ClinicalCourse">
+      <data key="label">clinical course</data>
+    </node>
+    <node id="Onset">
+      <data key="label">onset</data>
+    </node>
+    <node id="ClinicalModifier">
+      <data key="label">clinical modifier</data>
+    </node>
+    <node id="BiologicalSex">
+      <data key="label">biological sex</data>
+    </node>
+    <node id="GenotypicSex">
+      <data key="label">genotypic sex</data>
+    </node>
+    <node id="PhenotypicSex">
+      <data key="label">phenotypic sex</data>
+    </node>
+    <node id="SeverityValue">
+      <data key="label">severity value</data>
+    </node>
+    <node id="ChemicalEntity">
+      <data key="label">chemical entity</data>
+    </node>
+    <node id="EnvironmentalFoodContaminant">
+      <data key="label">environmental food contaminant</data>
+    </node>
+    <node id="FoodAdditive">
+      <data key="label">food additive</data>
+    </node>
+    <node id="ChemicalMixture">
+      <data key="label">chemical mixture</data>
+    </node>
+    <node id="ComplexMolecularMixture">
+      <data key="label">complex molecular mixture</data>
+    </node>
+    <node id="Food">
+      <data key="label">food</data>
+    </node>
+    <node id="ProcessedMaterial">
+      <data key="label">processed material</data>
+    </node>
+    <node id="MolecularMixture">
+      <data key="label">molecular mixture</data>
+    </node>
+    <node id="Drug">
+      <data key="label">drug</data>
+    </node>
+    <node id="MolecularEntity">
+      <data key="label">molecular entity</data>
+    </node>
+    <node id="SmallMolecule">
+      <data key="label">small molecule</data>
+    </node>
+    <node id="NucleicAcidEntity">
+      <data key="label">nucleic acid entity</data>
+    </node>
+    <node id="CodingSequence">
+      <data key="label">coding sequence</data>
+    </node>
+    <node id="Exon">
+      <data key="label">exon</data>
+    </node>
+    <node id="Transcript">
+      <data key="label">transcript</data>
+    </node>
+    <node id="RNAProduct">
+      <data key="label">RNA product</data>
+    </node>
+    <node id="RNAProductIsoform">
+      <data key="label">RNA product isoform</data>
+    </node>
+    <node id="NoncodingRNAProduct">
+      <data key="label">noncoding RNA product</data>
+    </node>
+    <node id="MicroRNA">
+      <data key="label">microRNA</data>
+      <data key="represented_as">node</data>
+      <data key="preferred_id">mirbase.mature</data>
+      <data key="label_in_input">mirna</data>
+    </node>
+    <node id="SiRNA">
+      <data key="label">siRNA</data>
+    </node>
+    <node id="SO_0001536">
+      <data key="label">functional effect variant</data>
+    </node>
+    <node id="SO_0002218">
+      <data key="label">functionally abnormal</data>
+    </node>
+    <node id="SO_0001773">
+      <data key="label">lethal variant</data>
+      <data key="represented_as">node</data>
+      <data key="label_in_input">lethal</data>
+      <data key="preferred_id">id</data>
+    </node>
+    <node id="SO_0002314">
+      <data key="label">altered gene product level</data>
+      <data key="represented_as">node</data>
+      <data key="label_in_input">agpl</data>
+      <data key="preferred_id">id</data>
+    </node>
+    <node id="SO_0002316">
+      <data key="label">decreased gene product level</data>
+      <data key="represented_as">node</data>
+      <data key="label_in_input">agpl_decreased</data>
+      <data key="preferred_id">id</data>
+    </node>
+    <node id="MONDO_0700096">
+      <data key="label">human disease</data>
+    </node>
+    <node id="MONDO_0002025">
+      <data key="label">psychiatric disorder</data>
+    </node>
+    <node id="MONDO_0024429">
+      <data key="label">Alice in Wonderland syndrome</data>
+    </node>
+    <node id="MONDO_0800105">
+      <data key="label">catatonia</data>
+    </node>
+    <node id="MONDO_0003847">
+      <data key="label">hereditary disease</data>
+    </node>
+    <node id="MONDO_0000429">
+      <data key="label">autosomal genetic disease</data>
+    </node>
+    <node id="MONDO_0006025">
+      <data key="label">autosomal recessive disease</data>
+    </node>
+    <node id="MONDO_0009061">
+      <data key="label">cystic fibrosis</data>
+    </node>
+    <node id="SideEffect">
+      <data key="label">side effect</data>
+      <data key="user_extension">True</data>
+      <data key="is_a">phenotypic feature</data>
+      <data key="represented_as">node</data>
+      <data key="preferred_id">sider.effect</data>
+      <data key="label_in_input">sider</data>
+    </node>
+    <node id="SnRNASequence">
+      <data key="label">snRNA sequence</data>
+      <data key="user_extension">True</data>
+      <data key="is_a">nucleic acid entity</data>
+      <data key="represented_as">node</data>
+      <data key="preferred_id">['intact', 'rnacentral']</data>
+      <data key="label_in_input">['intact_snrna', 'rnacentral_snrna']</data>
+      <data key="properties">{'ac': 'str', 'fullName': 'str', 'shortName': 'str', 'preferredName': 'str'}</data>
+      <data key="exclude_properties">sequence</data>
+    </node>
+    <node id="DNASequence">
+      <data key="label">DNA sequence</data>
+      <data key="user_extension">True</data>
+      <data key="is_a">nucleic acid entity</data>
+      <data key="represented_as">node</data>
+      <data key="preferred_id">ensembl</data>
+      <data key="label_in_input">dna</data>
+      <data key="properties">{'ac': 'str', 'fullName': 'str', 'shortName': 'str', 'preferredName': 'str', 'sequence': 'str'}</data>
+    </node>
+    <node id="DsDNASequence">
+      <data key="label">dsDNA sequence</data>
+      <data key="user_extension">True</data>
+      <data key="is_a">['DNA sequence', 'nucleic acid entity']</data>
+      <data key="inherit_properties">True</data>
+      <data key="represented_as">node</data>
+      <data key="preferred_id">['intact', 'uniparc']</data>
+      <data key="label_in_input">['intact_dsdna', 'uniprot_archive_dsdna']</data>
+      <data key="properties">{'ac': 'str', 'fullName': 'str', 'shortName': 'str', 'preferredName': 'str', 'sequence': 'str'}</data>
+      <data key="exclude_properties">{}</data>
+    </node>
+    <node id="PostTranslationalInteraction">
+      <data key="label">post translational interaction</data>
+      <data key="user_extension">True</data>
+      <data key="is_a">pairwise molecular interaction</data>
+      <data key="represented_as">node</data>
+      <data key="label_as_edge">INTERACTS_POST_TRANSLATIONAL</data>
+      <data key="label_in_input">post_translational</data>
+      <data key="preferred_id">id</data>
+    </node>
+    <node id="Phosphorylation">
+      <data key="label">phosphorylation</data>
+      <data key="user_extension">True</data>
+      <data key="is_a">post translational interaction</data>
+      <data key="represented_as">edge</data>
+      <data key="label_in_input">phosphorylation</data>
+      <data key="preferred_id">id</data>
+    </node>
+    <node id="GenotypeToTissueAssociation">
+      <data key="label">genotype to tissue association</data>
+      <data key="user_extension">True</data>
+    </node>
+    <node id="MutationToTissueAssociation">
+      <data key="label">mutation to tissue association</data>
+      <data key="user_extension">True</data>
+      <data key="is_a">['genotype to tissue association', 'entity to tissue association', 'association']</data>
+      <data key="represented_as">edge</data>
+      <data key="label_as_edge">Is_Mutated_In</data>
+      <data key="label_in_input">Gene_Is_Mutated_In_Cell_Tissue</data>
+      <data key="preferred_id">id</data>
+    </node>
+    <node id="EntityToTissueAssociation">
+      <data key="label">entity to tissue association</data>
+      <data key="user_extension">True</data>
+    </node>
+    <node id="Reactome.pathway">
+      <data key="label">reactome.pathway</data>
+      <data key="user_extension">True</data>
+      <data key="preferred_id">reactome</data>
+      <data key="input_label">reactome</data>
+      <data key="represented_as">node</data>
+      <data key="virtual">True</data>
+      <data key="is_a">pathway</data>
+    </node>
+    <node id="Wikipathways.pathway">
+      <data key="label">wikipathways.pathway</data>
+      <data key="user_extension">True</data>
+      <data key="preferred_id">wikipathways</data>
+      <data key="input_label">wikipathways</data>
+      <data key="represented_as">node</data>
+      <data key="virtual">True</data>
+      <data key="is_a">pathway</data>
+    </node>
+    <node id="ClinicallyRelevant.sequenceVariant">
+      <data key="label">clinically relevant.sequence variant</data>
+      <data key="user_extension">True</data>
+      <data key="preferred_id">clinically relevant</data>
+      <data key="input_label">Clinically_relevant_variant</data>
+      <data key="represented_as">node</data>
+      <data key="virtual">True</data>
+      <data key="is_a">sequence variant</data>
+      <data key="properties">{'source': 'str', 'original_source': 'str', 'effect': 'str', 'biotype': 'str'}</data>
+    </node>
+    <node id="Known.sequenceVariant">
+      <data key="label">known.sequence variant</data>
+      <data key="user_extension">True</data>
+      <data key="preferred_id">known</data>
+      <data key="input_label">Known_variant</data>
+      <data key="represented_as">node</data>
+      <data key="virtual">True</data>
+      <data key="is_a">sequence variant</data>
+      <data key="properties">{'source': 'str', 'original_source': 'str', 'effect': 'str', 'biotype': 'str'}</data>
+    </node>
+    <node id="Somatic.sequenceVariant">
+      <data key="label">somatic.sequence variant</data>
+      <data key="user_extension">True</data>
+      <data key="preferred_id">somatic</data>
+      <data key="input_label">Somatic_mutation</data>
+      <data key="represented_as">node</data>
+      <data key="virtual">True</data>
+      <data key="is_a">sequence variant</data>
+      <data key="properties">{'source': 'str', 'original_source': 'str', 'effect': 'str', 'biotype': 'str'}</data>
+    </node>
+    <node id="Intact.snRNASequence">
+      <data key="label">intact.snRNA sequence</data>
+      <data key="user_extension">True</data>
+      <data key="preferred_id">intact</data>
+      <data key="input_label">intact_snrna</data>
+      <data key="represented_as">node</data>
+      <data key="virtual">True</data>
+      <data key="is_a">['snRNA sequence', 'nucleic acid entity']</data>
+      <data key="properties">{'ac': 'str', 'fullName': 'str', 'shortName': 'str', 'preferredName': 'str'}</data>
+      <data key="exclude_properties">sequence</data>
+    </node>
+    <node id="Rnacentral.snRNASequence">
+      <data key="label">rnacentral.snRNA sequence</data>
+      <data key="user_extension">True</data>
+      <data key="preferred_id">rnacentral</data>
+      <data key="input_label">rnacentral_snrna</data>
+      <data key="represented_as">node</data>
+      <data key="virtual">True</data>
+      <data key="is_a">['snRNA sequence', 'nucleic acid entity']</data>
+      <data key="properties">{'ac': 'str', 'fullName': 'str', 'shortName': 'str', 'preferredName': 'str'}</data>
+      <data key="exclude_properties">sequence</data>
+    </node>
+    <node id="Intact.dsDNASequence">
+      <data key="label">intact.dsDNA sequence</data>
+      <data key="user_extension">True</data>
+      <data key="preferred_id">intact</data>
+      <data key="input_label">intact_dsdna</data>
+      <data key="represented_as">node</data>
+      <data key="virtual">True</data>
+      <data key="is_a">['dsDNA sequence', 'DNA sequence', 'nucleic acid entity']</data>
+      <data key="inherit_properties">True</data>
+      <data key="properties">{'ac': 'str', 'fullName': 'str', 'shortName': 'str', 'preferredName': 'str', 'sequence': 'str'}</data>
+      <data key="exclude_properties">{}</data>
+    </node>
+    <node id="Uniparc.dsDNASequence">
+      <data key="label">uniparc.dsDNA sequence</data>
+      <data key="user_extension">True</data>
+      <data key="preferred_id">uniparc</data>
+      <data key="input_label">uniprot_archive_dsdna</data>
+      <data key="represented_as">node</data>
+      <data key="virtual">True</data>
+      <data key="is_a">['dsDNA sequence', 'DNA sequence', 'nucleic acid entity']</data>
+      <data key="inherit_properties">True</data>
+      <data key="properties">{'ac': 'str', 'fullName': 'str', 'shortName': 'str', 'preferredName': 'str', 'sequence': 'str'}</data>
+      <data key="exclude_properties">{}</data>
+    </node>
+    <node id="Known.sequenceVariant.variantToGeneAssociation">
+      <data key="label">known.sequence variant.variant to gene association</data>
+      <data key="user_extension">True</data>
+      <data key="source">known.sequence variant</data>
+      <data key="input_label">VARIANT_FOUND_IN_GENE_Known_variant_Gene</data>
+      <data key="represented_as">edge</data>
+      <data key="virtual">True</data>
+      <data key="is_a">variant to gene association</data>
+      <data key="target">gene</data>
+      <data key="preferred_id">id</data>
+    </node>
+    <node id="Somatic.sequenceVariant.variantToGeneAssociation">
+      <data key="label">somatic.sequence variant.variant to gene association</data>
+      <data key="user_extension">True</data>
+      <data key="source">somatic.sequence variant</data>
+      <data key="input_label">VARIANT_FOUND_IN_GENE_Somatic_mutation_Gene</data>
+      <data key="represented_as">edge</data>
+      <data key="virtual">True</data>
+      <data key="is_a">variant to gene association</data>
+      <data key="target">gene</data>
+      <data key="preferred_id">id</data>
+    </node>
+    <edge source="Association" target="Entity" />
+    <edge source="BehaviorToBehavioralFeatureAssociation" target="Association" />
+    <edge source="BehaviorToBehavioralFeatureAssociation" target="EntityToPhenotypicFeatureAssociationMixin" />
+    <edge source="EntityToPhenotypicFeatureAssociationMixin" target="EntityToFeatureOrDiseaseQualifiersMixin" />
+    <edge source="EntityToPhenotypicFeatureAssociationMixin" target="FrequencyQuantifier" />
+    <edge source="EntityToFeatureOrDiseaseQualifiersMixin" target="FrequencyQualifierMixin" />
+    <edge source="FrequencyQuantifier" target="RelationshipQuantifier" />
+    <edge source="CaseToPhenotypicFeatureAssociation" target="Association" />
+    <edge source="CaseToPhenotypicFeatureAssociation" target="CaseToEntityAssociationMixin" />
+    <edge source="ChemicalAffectsGeneAssociation" target="Association" />
+    <edge source="ChemicalEntityAssessesNamedThingAssociation" target="Association" />
+    <edge source="ChemicalEntityOrGeneOrGeneProductRegulatesGeneAssociation" target="Association" />
+    <edge source="ChemicalGeneInteractionAssociation" target="Association" />
+    <edge source="ChemicalGeneInteractionAssociation" target="ChemicalToEntityAssociationMixin" />
+    <edge source="ChemicalToEntityAssociationMixin" target="ChemicalEntityToEntityAssociationMixin" />
+    <edge source="ChemicalToDiseaseOrPhenotypicFeatureAssociation" target="Association" />
+    <edge source="ChemicalToDiseaseOrPhenotypicFeatureAssociation" target="EntityToDiseaseOrPhenotypicFeatureAssociationMixin" />
+    <edge source="ChemicalToPathwayAssociation" target="Association" />
+    <edge source="ContributorAssociation" target="Association" />
+    <edge source="DiseaseOrPhenotypicFeatureToGeneticInheritanceAssociation" target="Association" />
+    <edge source="DiseaseOrPhenotypicFeatureToGeneticInheritanceAssociation" target="DiseaseOrPhenotypicFeatureToEntityAssociationMixin" />
+    <edge source="DiseaseOrPhenotypicFeatureToLocationAssociation" target="Association" />
+    <edge source="DiseaseToExposureEventAssociation" target="Association" />
+    <edge source="DiseaseToExposureEventAssociation" target="DiseaseToEntityAssociationMixin" />
+    <edge source="DiseaseToExposureEventAssociation" target="EntityToExposureEventAssociationMixin" />
+    <edge source="DiseaseToPhenotypicFeatureAssociation" target="Association" />
+    <edge source="DrugToGeneAssociation" target="Association" />
+    <edge source="DrugToGeneAssociation" target="DrugToEntityAssociationMixin" />
+    <edge source="EntityToDiseaseAssociation" target="Association" />
+    <edge source="EntityToPhenotypicFeatureAssociation" target="Association" />
+    <edge source="ExposureEventToOutcomeAssociation" target="Association" />
+    <edge source="ExposureEventToOutcomeAssociation" target="EntityToOutcomeAssociationMixin" />
+    <edge source="ExposureEventToPhenotypicFeatureAssociation" target="Association" />
+    <edge source="GeneToExpressionSiteAssociation" target="Association" />
+    <edge source="GeneToGeneFamilyAssociation" target="Association" />
+    <edge source="GeneToPathwayAssociation" target="Association" />
+    <edge source="GeneToPathwayAssociation" target="GeneToEntityAssociationMixin" />
+    <edge source="GeneToPhenotypicFeatureAssociation" target="Association" />
+    <edge source="GenotypeToGeneAssociation" target="Association" />
+    <edge source="GenotypeToGenotypePartAssociation" target="Association" />
+    <edge source="GenotypeToPhenotypicFeatureAssociation" target="Association" />
+    <edge source="GenotypeToPhenotypicFeatureAssociation" target="GenotypeToEntityAssociationMixin" />
+    <edge source="GenotypeToVariantAssociation" target="Association" />
+    <edge source="InformationContentEntityToNamedThingAssociation" target="Association" />
+    <edge source="MaterialSampleDerivationAssociation" target="Association" />
+    <edge source="MaterialSampleToDiseaseOrPhenotypicFeatureAssociation" target="Association" />
+    <edge source="MaterialSampleToDiseaseOrPhenotypicFeatureAssociation" target="MaterialSampleToEntityAssociationMixin" />
+    <edge source="MolecularActivityToChemicalEntityAssociation" target="Association" />
+    <edge source="MolecularActivityToMolecularActivityAssociation" target="Association" />
+    <edge source="MolecularActivityToPathwayAssociation" target="Association" />
+    <edge source="NamedThingAssociatedWithLikelihoodOfNamedThingAssociation" target="Association" />
+    <edge source="OrganismTaxonToEnvironmentAssociation" target="Association" />
+    <edge source="OrganismTaxonToEnvironmentAssociation" target="OrganismTaxonToEntityAssociation" />
+    <edge source="OrganismToOrganismAssociation" target="Association" />
+    <edge source="OrganismalEntityAsAModelOfDiseaseAssociation" target="Association" />
+    <edge source="OrganismalEntityAsAModelOfDiseaseAssociation" target="EntityToDiseaseAssociationMixin" />
+    <edge source="OrganismalEntityAsAModelOfDiseaseAssociation" target="ModelToDiseaseAssociationMixin" />
+    <edge source="PopulationToPopulationAssociation" target="Association" />
+    <edge source="SequenceVariantModulatesTreatmentAssociation" target="Association" />
+    <edge source="TaxonToTaxonAssociation" target="Association" />
+    <edge source="VariantToPhenotypicFeatureAssociation" target="Association" />
+    <edge source="VariantToPhenotypicFeatureAssociation" target="VariantToEntityAssociationMixin" />
+    <edge source="VariantToPopulationAssociation" target="Association" />
+    <edge source="CellLineToDiseaseOrPhenotypicFeatureAssociation" target="Association" />
+    <edge source="CellLineToDiseaseOrPhenotypicFeatureAssociation" target="CellLineToEntityAssociationMixin" />
+    <edge source="CellLineAsAModelOfDiseaseAssociation" target="CellLineToDiseaseOrPhenotypicFeatureAssociation" />
+    <edge source="ChemicalOrDrugOrTreatmentToDiseaseOrPhenotypicFeatureAssociation" target="Association" />
+    <edge source="ChemicalOrDrugOrTreatmentSideEffectDiseaseOrPhenotypicFeatureAssociation" target="ChemicalOrDrugOrTreatmentToDiseaseOrPhenotypicFeatureAssociation" />
+    <edge source="GenotypeToDiseaseAssociation" target="Association" />
+    <edge source="GenotypeAsAModelOfDiseaseAssociation" target="GenotypeToDiseaseAssociation" />
+    <edge source="SequenceAssociation" target="Association" />
+    <edge source="GenomicSequenceLocalization" target="SequenceAssociation" />
+    <edge source="VariantToDiseaseAssociation" target="Association" />
+    <edge source="VariantAsAModelOfDiseaseAssociation" target="VariantToDiseaseAssociation" />
+    <edge source="VariantToGeneAssociation" target="Association" />
+    <edge source="VariantToGeneExpressionAssociation" target="VariantToGeneAssociation" />
+    <edge source="VariantToGeneExpressionAssociation" target="GeneExpressionMixin" />
+    <edge source="AnatomicalEntityToAnatomicalEntityAssociation" target="Association" />
+    <edge source="AnatomicalEntityToAnatomicalEntityOntogenicAssociation" target="AnatomicalEntityToAnatomicalEntityAssociation" />
+    <edge source="AnatomicalEntityToAnatomicalEntityPartOfAssociation" target="AnatomicalEntityToAnatomicalEntityAssociation" />
+    <edge source="ChemicalToChemicalAssociation" target="Association" />
+    <edge source="ChemicalToChemicalDerivationAssociation" target="ChemicalToChemicalAssociation" />
+    <edge source="ReactionToParticipantAssociation" target="ChemicalToChemicalAssociation" />
+    <edge source="ReactionToCatalystAssociation" target="ReactionToParticipantAssociation" />
+    <edge source="OrganismTaxonToOrganismTaxonAssociation" target="Association" />
+    <edge source="OrganismTaxonToOrganismTaxonInteraction" target="OrganismTaxonToOrganismTaxonAssociation" />
+    <edge source="OrganismTaxonToOrganismTaxonSpecialization" target="OrganismTaxonToOrganismTaxonAssociation" />
+    <edge source="GeneToDiseaseAssociation" target="Association" />
+    <edge source="DruggableGeneToDiseaseAssociation" target="GeneToDiseaseAssociation" />
+    <edge source="GeneAsAModelOfDiseaseAssociation" target="GeneToDiseaseAssociation" />
+    <edge source="GeneHasVariantThatContributesToDiseaseAssociation" target="GeneToDiseaseAssociation" />
+    <edge source="GeneToGeneAssociation" target="Association" />
+    <edge source="GeneToGeneCoexpressionAssociation" target="GeneToGeneAssociation" />
+    <edge source="GeneToGeneHomologyAssociation" target="GeneToGeneAssociation" />
+    <edge source="PairwiseGeneToGeneInteraction" target="GeneToGeneAssociation" />
+    <edge source="PairwiseMolecularInteraction" target="PairwiseGeneToGeneInteraction" />
+    <edge source="SequenceFeatureRelationship" target="Association" />
+    <edge source="ExonToTranscriptRelationship" target="SequenceFeatureRelationship" />
+    <edge source="GeneToGeneProductRelationship" target="SequenceFeatureRelationship" />
+    <edge source="TranscriptToGeneRelationship" target="SequenceFeatureRelationship" />
+    <edge source="FunctionalAssociation" target="Association" />
+    <edge source="GeneToGoTermAssociation" target="FunctionalAssociation" />
+    <edge source="MacromolecularMachineToBiologicalProcessAssociation" target="FunctionalAssociation" />
+    <edge source="MacromolecularMachineToBiologicalProcessAssociation" target="MacromolecularMachineToEntityAssociationMixin" />
+    <edge source="MacromolecularMachineToCellularComponentAssociation" target="FunctionalAssociation" />
+    <edge source="MacromolecularMachineToMolecularActivityAssociation" target="FunctionalAssociation" />
+    <edge source="NamedThing" target="Entity" />
+    <edge source="Activity" target="NamedThing" />
+    <edge source="Activity" target="ActivityAndBehavior" />
+    <edge source="ActivityAndBehavior" target="Occurrent" />
+    <edge source="Occurrent" target="PhysicalEssenceOrOccurrent" />
+    <edge source="Event" target="NamedThing" />
+    <edge source="Phenomenon" target="NamedThing" />
+    <edge source="AdministrativeEntity" target="NamedThing" />
+    <edge source="Agent" target="AdministrativeEntity" />
+    <edge source="Treatment" target="NamedThing" />
+    <edge source="Treatment" target="ChemicalOrDrugOrTreatment" />
+    <edge source="Treatment" target="ExposureEvent" />
+    <edge source="ExposureEvent" target="OntologyClass" />
+    <edge source="ClinicalEntity" target="NamedThing" />
+    <edge source="ClinicalTrial" target="ClinicalEntity" />
+    <edge source="ClinicalIntervention" target="ClinicalEntity" />
+    <edge source="Hospitalization" target="ClinicalIntervention" />
+    <edge source="Device" target="NamedThing" />
+    <edge source="Procedure" target="NamedThing" />
+    <edge source="PlanetaryEntity" target="NamedThing" />
+    <edge source="EnvironmentalFeature" target="PlanetaryEntity" />
+    <edge source="EnvironmentalProcess" target="PlanetaryEntity" />
+    <edge source="GeographicLocation" target="PlanetaryEntity" />
+    <edge source="GeographicLocationAtTime" target="GeographicLocation" />
+    <edge source="PhysicalEntity" target="NamedThing" />
+    <edge source="PhysicalEntity" target="PhysicalEssence" />
+    <edge source="MaterialSample" target="PhysicalEntity" />
+    <edge source="MaterialSample" target="SubjectOfInvestigation" />
+    <edge source="OrganismTaxon" target="NamedThing" />
+    <edge source="InformationContentEntity" target="NamedThing" />
+    <edge source="CommonDataElement" target="InformationContentEntity" />
+    <edge source="Study" target="InformationContentEntity" />
+    <edge source="StudyVariable" target="InformationContentEntity" />
+    <edge source="ConfidenceLevel" target="InformationContentEntity" />
+    <edge source="EvidenceType" target="InformationContentEntity" />
+    <edge source="DatasetDistribution" target="InformationContentEntity" />
+    <edge source="DatasetSummary" target="InformationContentEntity" />
+    <edge source="DatasetVersion" target="InformationContentEntity" />
+    <edge source="Dataset" target="InformationContentEntity" />
+    <edge source="StudyResult" target="InformationContentEntity" />
+    <edge source="ChiSquaredAnalysisResult" target="StudyResult" />
+    <edge source="ConceptCountAnalysisResult" target="StudyResult" />
+    <edge source="ObservedExpectedFrequencyAnalysisResult" target="StudyResult" />
+    <edge source="RelativeFrequencyAnalysisResult" target="StudyResult" />
+    <edge source="TextMiningResult" target="StudyResult" />
+    <edge source="InformationResource" target="InformationContentEntity" />
+    <edge source="Publication" target="InformationContentEntity" />
+    <edge source="Article" target="Publication" />
+    <edge source="Book" target="Publication" />
+    <edge source="Serial" target="Publication" />
+    <edge source="BookChapter" target="Publication" />
+    <edge source="BiologicalEntity" target="NamedThing" />
+    <edge source="BiologicalEntity" target="ThingWithTaxon" />
+    <edge source="Genome" target="BiologicalEntity" />
+    <edge source="Genome" target="GenomicEntity" />
+    <edge source="Haplotype" target="BiologicalEntity" />
+    <edge source="MacromolecularComplex" target="BiologicalEntity" />
+    <edge source="MacromolecularComplex" target="MacromolecularMachineMixin" />
+    <edge source="NucleicAcidSequenceMotif" target="BiologicalEntity" />
+    <edge source="NucleosomeModification" target="BiologicalEntity" />
+    <edge source="NucleosomeModification" target="EpigenomicEntity" />
+    <edge source="NucleosomeModification" target="GeneProductIsoformMixin" />
+    <edge source="GeneProductIsoformMixin" target="GeneProductMixin" />
+    <edge source="GeneProductMixin" target="GeneOrGeneProduct" />
+    <edge source="PosttranslationalModification" target="BiologicalEntity" />
+    <edge source="ProteinDomain" target="BiologicalEntity" />
+    <edge source="ProteinDomain" target="ChemicalEntityOrGeneOrGeneProduct" />
+    <edge source="ProteinDomain" target="GeneGroupingMixin" />
+    <edge source="ProteinFamily" target="BiologicalEntity" />
+    <edge source="ReagentTargetedGene" target="BiologicalEntity" />
+    <edge source="GeneFamily" target="BiologicalEntity" />
+    <edge source="Polypeptide" target="BiologicalEntity" />
+    <edge source="Polypeptide" target="ChemicalEntityOrProteinOrPolypeptide" />
+    <edge source="Protein" target="Polypeptide" />
+    <edge source="ProteinIsoform" target="Protein" />
+    <edge source="GeneticInheritance" target="BiologicalEntity" />
+    <edge source="Genotype" target="BiologicalEntity" />
+    <edge source="OrganismalEntity" target="BiologicalEntity" />
+    <edge source="CellularOrganism" target="OrganismalEntity" />
+    <edge source="Virus" target="OrganismalEntity" />
+    <edge source="CellLine" target="OrganismalEntity" />
+    <edge source="IndividualOrganism" target="OrganismalEntity" />
+    <edge source="Case" target="IndividualOrganism" />
+    <edge source="LifeStage" target="OrganismalEntity" />
+    <edge source="PopulationOfIndividualOrganisms" target="OrganismalEntity" />
+    <edge source="StudyPopulation" target="PopulationOfIndividualOrganisms" />
+    <edge source="Cohort" target="StudyPopulation" />
+    <edge source="AnatomicalEntity" target="OrganismalEntity" />
+    <edge source="Cell" target="AnatomicalEntity" />
+    <edge source="GrossAnatomicalStructure" target="AnatomicalEntity" />
+    <edge source="PathologicalAnatomicalStructure" target="AnatomicalEntity" />
+    <edge source="PathologicalAnatomicalStructure" target="PathologicalEntityMixin" />
+    <edge source="CellularComponent" target="AnatomicalEntity" />
+    <edge source="BiologicalProcessOrActivity" target="BiologicalEntity" />
+    <edge source="MolecularActivity" target="BiologicalProcessOrActivity" />
+    <edge source="BiologicalProcess" target="BiologicalProcessOrActivity" />
+    <edge source="PathologicalProcess" target="BiologicalProcess" />
+    <edge source="PhysiologicalProcess" target="BiologicalProcess" />
+    <edge source="Behavior" target="BiologicalProcess" />
+    <edge source="Pathway" target="BiologicalProcess" />
+    <edge source="SO_0001060" target="BiologicalEntity" />
+    <edge source="Snv" target="SO_0001060" />
+    <edge source="Gene" target="BiologicalEntity" />
+    <edge source="DiseaseOrPhenotypicFeature" target="BiologicalEntity" />
+    <edge source="PhenotypicFeature" target="DiseaseOrPhenotypicFeature" />
+    <edge source="ClinicalFinding" target="PhenotypicFeature" />
+    <edge source="BehavioralFeature" target="PhenotypicFeature" />
+    <edge source="MONDO_0000001" target="DiseaseOrPhenotypicFeature" />
+    <edge source="Attribute" target="NamedThing" />
+    <edge source="BehavioralExposure" target="Attribute" />
+    <edge source="BioticExposure" target="Attribute" />
+    <edge source="ComplexChemicalExposure" target="Attribute" />
+    <edge source="DiseaseOrPhenotypicFeatureExposure" target="Attribute" />
+    <edge source="GenomicBackgroundExposure" target="Attribute" />
+    <edge source="PathologicalAnatomicalExposure" target="Attribute" />
+    <edge source="PathologicalProcessExposure" target="Attribute" />
+    <edge source="SocioeconomicExposure" target="Attribute" />
+    <edge source="ChemicalExposure" target="Attribute" />
+    <edge source="DrugExposure" target="ChemicalExposure" />
+    <edge source="DrugToGeneInteractionExposure" target="DrugExposure" />
+    <edge source="EnvironmentalExposure" target="Attribute" />
+    <edge source="GeographicExposure" target="EnvironmentalExposure" />
+    <edge source="OrganismAttribute" target="Attribute" />
+    <edge source="PhenotypicQuality" target="OrganismAttribute" />
+    <edge source="ChemicalRole" target="Attribute" />
+    <edge source="SocioeconomicAttribute" target="Attribute" />
+    <edge source="Zygosity" target="Attribute" />
+    <edge source="ClinicalAttribute" target="Attribute" />
+    <edge source="ClinicalMeasurement" target="ClinicalAttribute" />
+    <edge source="ClinicalCourse" target="ClinicalAttribute" />
+    <edge source="Onset" target="ClinicalCourse" />
+    <edge source="ClinicalModifier" target="ClinicalAttribute" />
+    <edge source="BiologicalSex" target="Attribute" />
+    <edge source="GenotypicSex" target="BiologicalSex" />
+    <edge source="PhenotypicSex" target="BiologicalSex" />
+    <edge source="SeverityValue" target="Attribute" />
+    <edge source="ChemicalEntity" target="NamedThing" />
+    <edge source="EnvironmentalFoodContaminant" target="ChemicalEntity" />
+    <edge source="FoodAdditive" target="ChemicalEntity" />
+    <edge source="ChemicalMixture" target="ChemicalEntity" />
+    <edge source="ComplexMolecularMixture" target="ChemicalMixture" />
+    <edge source="Food" target="ChemicalMixture" />
+    <edge source="ProcessedMaterial" target="ChemicalMixture" />
+    <edge source="MolecularMixture" target="ChemicalMixture" />
+    <edge source="Drug" target="MolecularMixture" />
+    <edge source="MolecularEntity" target="ChemicalEntity" />
+    <edge source="SmallMolecule" target="MolecularEntity" />
+    <edge source="NucleicAcidEntity" target="MolecularEntity" />
+    <edge source="CodingSequence" target="NucleicAcidEntity" />
+    <edge source="Exon" target="NucleicAcidEntity" />
+    <edge source="Transcript" target="NucleicAcidEntity" />
+    <edge source="RNAProduct" target="Transcript" />
+    <edge source="RNAProductIsoform" target="RNAProduct" />
+    <edge source="NoncodingRNAProduct" target="RNAProduct" />
+    <edge source="MicroRNA" target="NoncodingRNAProduct" />
+    <edge source="SiRNA" target="NoncodingRNAProduct" />
+    <edge source="SO_0001536" target="SO_0001060" />
+    <edge source="SO_0002218" target="SO_0001536" />
+    <edge source="SO_0001773" target="SO_0002218" />
+    <edge source="SO_0002314" target="SO_0001536" />
+    <edge source="SO_0002316" target="SO_0002314" />
+    <edge source="MONDO_0700096" target="MONDO_0000001" />
+    <edge source="MONDO_0002025" target="MONDO_0700096" />
+    <edge source="MONDO_0024429" target="MONDO_0002025" />
+    <edge source="MONDO_0800105" target="MONDO_0002025" />
+    <edge source="MONDO_0003847" target="MONDO_0700096" />
+    <edge source="MONDO_0000429" target="MONDO_0003847" />
+    <edge source="MONDO_0006025" target="MONDO_0000429" />
+    <edge source="MONDO_0009061" target="MONDO_0006025" />
+    <edge source="SideEffect" target="PhenotypicFeature" />
+    <edge source="SnRNASequence" target="NucleicAcidEntity" />
+    <edge source="DNASequence" target="NucleicAcidEntity" />
+    <edge source="DsDNASequence" target="DNASequence" />
+    <edge source="PostTranslationalInteraction" target="PairwiseMolecularInteraction" />
+    <edge source="Phosphorylation" target="PostTranslationalInteraction" />
+    <edge source="GenotypeToTissueAssociation" target="EntityToTissueAssociation" />
+    <edge source="MutationToTissueAssociation" target="GenotypeToTissueAssociation" />
+    <edge source="EntityToTissueAssociation" target="Association" />
+    <edge source="Reactome.pathway" target="Pathway" />
+    <edge source="Wikipathways.pathway" target="Pathway" />
+    <edge source="ClinicallyRelevant.sequenceVariant" target="SO_0001060" />
+    <edge source="Known.sequenceVariant" target="SO_0001060" />
+    <edge source="Somatic.sequenceVariant" target="SO_0001060" />
+    <edge source="Intact.snRNASequence" target="SnRNASequence" />
+    <edge source="Rnacentral.snRNASequence" target="SnRNASequence" />
+    <edge source="Intact.dsDNASequence" target="DsDNASequence" />
+    <edge source="Uniparc.dsDNASequence" target="DsDNASequence" />
+    <edge source="Known.sequenceVariant.variantToGeneAssociation" target="VariantToGeneAssociation" />
+    <edge source="Somatic.sequenceVariant.variantToGeneAssociation" target="VariantToGeneAssociation" />
+  </graph>
+</graphml>
diff --git a/poetry.lock b/poetry.lock
index 11bbc21b..20b53801 100644
--- a/poetry.lock
+++ b/poetry.lock
@@ -199,15 +199,15 @@ tests = ["asttokens", "littleutils", "pytest", "rich"]
 
 [[package]]
 name = "filelock"
-version = "3.9.0"
+version = "3.9.1"
 description = "A platform independent file lock."
 category = "dev"
 optional = false
 python-versions = ">=3.7"
 
 [package.extras]
-docs = ["furo (>=2022.12.7)", "sphinx (>=5.3)", "sphinx-autodoc-typehints (>=1.19.5)"]
-testing = ["covdefaults (>=2.2.2)", "coverage (>=7.0.1)", "pytest (>=7.2)", "pytest-cov (>=4)", "pytest-timeout (>=2.1)"]
+docs = ["furo (>=2022.12.7)", "sphinx (>=6.1.3)", "sphinx-autodoc-typehints (>=1.22,!=1.23.4)"]
+testing = ["covdefaults (>=2.3)", "coverage (>=7.2.1)", "pytest (>=7.2.2)", "pytest-cov (>=4)", "pytest-timeout (>=2.1)"]
 
 [[package]]
 name = "future"
@@ -939,14 +939,14 @@ test = ["html5lib", "pytest"]
 
 [[package]]
 name = "sphinxcontrib-jquery"
-version = "2.0.0"
+version = "4.1"
 description = "Extension to include jQuery on newer Sphinx releases"
 category = "dev"
 optional = false
 python-versions = ">=2.7"
 
 [package.dependencies]
-setuptools = "*"
+Sphinx = ">=1.8"
 
 [[package]]
 name = "sphinxcontrib-jsmath"
@@ -1349,8 +1349,8 @@ executing = [
     {file = "executing-1.2.0.tar.gz", hash = "sha256:19da64c18d2d851112f09c287f8d3dbbdf725ab0e569077efb6cdcbd3497c107"},
 ]
 filelock = [
-    {file = "filelock-3.9.0-py3-none-any.whl", hash = "sha256:f58d535af89bb9ad5cd4df046f741f8553a418c01a7856bf0d173bbc9f6bd16d"},
-    {file = "filelock-3.9.0.tar.gz", hash = "sha256:7b319f24340b51f55a2bf7a12ac0755a9b03e718311dac567a0f4f7fabd2f5de"},
+    {file = "filelock-3.9.1-py3-none-any.whl", hash = "sha256:4427cdda14a1c68e264845142842d6de2d0fa2c15ba31571a3d9c9a1ec9d191c"},
+    {file = "filelock-3.9.1.tar.gz", hash = "sha256:e393782f76abea324dee598d2ea145b857a20df0e0ee4f80fcf35e72a341d2c7"},
 ]
 future = [
     {file = "future-0.18.3.tar.gz", hash = "sha256:34a17436ed1e96697a86f9de3d15a3b0be01d8bc8de9c1dffd59fb8234ed5307"},
@@ -1653,8 +1653,8 @@ sphinxcontrib-htmlhelp = [
     {file = "sphinxcontrib_htmlhelp-2.0.1-py3-none-any.whl", hash = "sha256:c38cb46dccf316c79de6e5515e1770414b797162b23cd3d06e67020e1d2a6903"},
 ]
 sphinxcontrib-jquery = [
-    {file = "sphinxcontrib-jquery-2.0.0.tar.gz", hash = "sha256:8fb65f6dba84bf7bcd1aea1f02ab3955ac34611d838bcc95d4983b805b234daa"},
-    {file = "sphinxcontrib_jquery-2.0.0-py3-none-any.whl", hash = "sha256:ed47fa425c338ffebe3c37e1cdb56e30eb806116b85f01055b158c7057fdb995"},
+    {file = "sphinxcontrib-jquery-4.1.tar.gz", hash = "sha256:1620739f04e36a2c779f1a131a2dfd49b2fd07351bf1968ced074365933abc7a"},
+    {file = "sphinxcontrib_jquery-4.1-py2.py3-none-any.whl", hash = "sha256:f936030d7d0147dd026a4f2b5a57343d233f1fc7b363f68b3d4f1cb0993878ae"},
 ]
 sphinxcontrib-jsmath = [
     {file = "sphinxcontrib-jsmath-1.0.1.tar.gz", hash = "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8"},
diff --git a/pyproject.toml b/pyproject.toml
index 792c6289..4951a73e 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,6 +1,6 @@
 [tool.poetry]
 name = "biocypher"
-version = "0.4.5"
+version = "0.5.4"
 description = "A unifying framework for biomedical research knowledge graphs"
 authors = [
     "Sebastian Lobentanzer <sebastian.lobentanzer@gmail.com>",
@@ -59,6 +59,14 @@ build-backend = "poetry.core.masonry.api"
 [tool.poetry.urls]
 "Bug Tracker" = "https://github.com/saezlab/biocypher/issues"
 
+[tool.pytest.ini_options]
+log_cli = true
+log_level = "INFO"
+markers = [
+  "inject_driver_args(driver_args): Arguments for the Driver",
+  "requires_neo4j: Requires connection to a Neo4j server"
+]
+
 [tool.black]
 line-length = 80
 target-version = ['py310']
diff --git a/tutorial/01_basic_import.py b/tutorial/01__basic_import.py
similarity index 61%
rename from tutorial/01_basic_import.py
rename to tutorial/01__basic_import.py
index f9405d8e..7bfdb0ec 100644
--- a/tutorial/01_basic_import.py
+++ b/tutorial/01__basic_import.py
@@ -1,7 +1,5 @@
+from biocypher import BioCypher
 from tutorial.data_generator import Protein
-import biocypher
-
-__all__ = ['main']
 
 
 def main():
@@ -18,16 +16,15 @@ def node_generator():
             )
 
     # Create BioCypher driver
-    driver = biocypher.Driver(
-        offline=True,  # start without connecting to Neo4j instance
-        db_name='basicimport',  # name of database for import call
-        user_schema_config_path='tutorial/01_schema_config.yaml',
+    bc = BioCypher(
+        biocypher_config_path='tutorial/01_biocypher_config.yaml',
+        schema_config_path='tutorial/01_schema_config.yaml',
     )
     # Run the import
-    driver.write_nodes(node_generator())
+    bc.write_nodes(node_generator())
 
     # Write command line call
-    driver.write_import_call()
+    bc.write_import_call()
 
 
 if __name__ == '__main__':
diff --git a/tutorial/01_biocypher_config.yaml b/tutorial/01_biocypher_config.yaml
new file mode 100644
index 00000000..3d79396a
--- /dev/null
+++ b/tutorial/01_biocypher_config.yaml
@@ -0,0 +1,5 @@
+biocypher:
+  offline: true
+
+neo4j:
+  database_name: basicimport
diff --git a/tutorial/01_schema_config.yaml b/tutorial/01_schema_config.yaml
index 1599b665..d48138ce 100644
--- a/tutorial/01_schema_config.yaml
+++ b/tutorial/01_schema_config.yaml
@@ -1,4 +1,4 @@
 protein:
     represented_as: node
     preferred_id: uniprot
-    label_in_input: uniprot_protein
+    input_label: uniprot_protein
diff --git a/tutorial/02_merge.py b/tutorial/02__merge.py
similarity index 67%
rename from tutorial/02_merge.py
rename to tutorial/02__merge.py
index 78f22e9d..245be65f 100644
--- a/tutorial/02_merge.py
+++ b/tutorial/02__merge.py
@@ -1,7 +1,5 @@
+from biocypher import BioCypher
 from tutorial.data_generator import Protein, EntrezProtein
-import biocypher
-
-__all__ = ['main']
 
 
 def main():
@@ -23,16 +21,15 @@ def node_generator():
             )
 
     # Create BioCypher driver
-    driver = biocypher.Driver(
-        offline=True,  # start without connecting to Neo4j instance
-        db_name='merge',  # name of database for import call
-        user_schema_config_path='tutorial/02_schema_config.yaml',
+    bc = BioCypher(
+        biocypher_config_path='tutorial/02_biocypher_config.yaml',
+        schema_config_path='tutorial/02_schema_config.yaml',
     )
     # Run the import
-    driver.write_nodes(node_generator())
+    bc.write_nodes(node_generator())
 
     # Write command line call
-    driver.write_import_call()
+    bc.write_import_call()
 
 
 if __name__ == '__main__':
diff --git a/tutorial/02_biocypher_config.yaml b/tutorial/02_biocypher_config.yaml
new file mode 100644
index 00000000..13355f60
--- /dev/null
+++ b/tutorial/02_biocypher_config.yaml
@@ -0,0 +1,5 @@
+biocypher:
+  offline: true
+
+neo4j:
+  database_name: merge
diff --git a/tutorial/02_schema_config.yaml b/tutorial/02_schema_config.yaml
index a9a0def7..bddf7d19 100644
--- a/tutorial/02_schema_config.yaml
+++ b/tutorial/02_schema_config.yaml
@@ -1,4 +1,4 @@
 protein:
     represented_as: node
     preferred_id: uniprot
-    label_in_input: [uniprot_protein, entrez_protein]
+    input_label: [uniprot_protein, entrez_protein]
diff --git a/tutorial/03_implicit_subclass.py b/tutorial/03__implicit_subclass.py
similarity index 66%
rename from tutorial/03_implicit_subclass.py
rename to tutorial/03__implicit_subclass.py
index b8c6b92b..7ba277be 100644
--- a/tutorial/03_implicit_subclass.py
+++ b/tutorial/03__implicit_subclass.py
@@ -1,7 +1,5 @@
+from biocypher import BioCypher
 from tutorial.data_generator import Protein, EntrezProtein
-import biocypher
-
-__all__ = ['main']
 
 
 def main():
@@ -23,16 +21,15 @@ def node_generator():
             )
 
     # Create BioCypher driver
-    driver = biocypher.Driver(
-        offline=True,  # start without connecting to Neo4j instance
-        db_name='implicitsubclass',  # name of database for import call
-        user_schema_config_path='tutorial/03_schema_config.yaml',
+    bc = BioCypher(
+        biocypher_config_path='tutorial/03_biocypher_config.yaml',
+        schema_config_path='tutorial/03_schema_config.yaml',
     )
     # Run the import
-    driver.write_nodes(node_generator())
+    bc.write_nodes(node_generator())
 
     # Write command line call
-    driver.write_import_call()
+    bc.write_import_call()
 
 
 if __name__ == '__main__':
diff --git a/tutorial/03_biocypher_config.yaml b/tutorial/03_biocypher_config.yaml
new file mode 100644
index 00000000..3bb6ac4d
--- /dev/null
+++ b/tutorial/03_biocypher_config.yaml
@@ -0,0 +1,5 @@
+biocypher:
+  offline: true
+
+neo4j:
+  database_name: implicitsubclass
diff --git a/tutorial/03_schema_config.yaml b/tutorial/03_schema_config.yaml
index fa4d1459..1d855060 100644
--- a/tutorial/03_schema_config.yaml
+++ b/tutorial/03_schema_config.yaml
@@ -1,4 +1,4 @@
 protein:
     represented_as: node
     preferred_id: [uniprot, entrez]
-    label_in_input: [uniprot_protein, entrez_protein]
+    input_label: [uniprot_protein, entrez_protein]
diff --git a/tutorial/04_properties.py b/tutorial/04__properties.py
similarity index 67%
rename from tutorial/04_properties.py
rename to tutorial/04__properties.py
index fb2ef008..24a268be 100644
--- a/tutorial/04_properties.py
+++ b/tutorial/04__properties.py
@@ -1,7 +1,5 @@
+from biocypher import BioCypher
 from tutorial.data_generator import EntrezProtein, RandomPropertyProtein
-import biocypher
-
-__all__ = ['main']
 
 
 def main():
@@ -23,16 +21,15 @@ def node_generator():
             )
 
     # Create BioCypher driver
-    driver = biocypher.Driver(
-        offline=True,  # start without connecting to Neo4j instance
-        db_name='properties',  # name of database for import call
-        user_schema_config_path='tutorial/04_schema_config.yaml',
+    bc = BioCypher(
+        biocypher_config_path='tutorial/04_biocypher_config.yaml',
+        schema_config_path='tutorial/04_schema_config.yaml',
     )
     # Run the import
-    driver.write_nodes(node_generator())
+    bc.write_nodes(node_generator())
 
     # Write command line call
-    driver.write_import_call()
+    bc.write_import_call()
 
 
 if __name__ == '__main__':
diff --git a/tutorial/04_biocypher_config.yaml b/tutorial/04_biocypher_config.yaml
new file mode 100644
index 00000000..98a84e57
--- /dev/null
+++ b/tutorial/04_biocypher_config.yaml
@@ -0,0 +1,5 @@
+biocypher:
+  offline: true
+
+neo4j:
+  database_name: properties
diff --git a/tutorial/04_schema_config.yaml b/tutorial/04_schema_config.yaml
index 123f294d..e7649f71 100644
--- a/tutorial/04_schema_config.yaml
+++ b/tutorial/04_schema_config.yaml
@@ -1,7 +1,7 @@
 protein:
     represented_as: node
     preferred_id: [uniprot, entrez]
-    label_in_input: [uniprot_protein, entrez_protein]
+    input_label: [uniprot_protein, entrez_protein]
     properties:
         sequence: str
         description: str
diff --git a/tutorial/05_property_inheritance.py b/tutorial/05__property_inheritance.py
similarity index 70%
rename from tutorial/05_property_inheritance.py
rename to tutorial/05__property_inheritance.py
index ebde8874..4baadbf0 100644
--- a/tutorial/05_property_inheritance.py
+++ b/tutorial/05__property_inheritance.py
@@ -1,11 +1,9 @@
+from biocypher import BioCypher
 from tutorial.data_generator import (
     EntrezProtein,
     RandomPropertyProtein,
     RandomPropertyProteinIsoform,
 )
-import biocypher
-
-__all__ = ['main']
 
 
 def main():
@@ -28,16 +26,15 @@ def node_generator():
             )
 
     # Create BioCypher driver
-    driver = biocypher.Driver(
-        offline=True,  # start without connecting to Neo4j instance
-        db_name='propertyinheritance',  # name of database for import call
-        user_schema_config_path='tutorial/05_schema_config.yaml',
+    bc = BioCypher(
+        biocypher_config_path='tutorial/05_biocypher_config.yaml',
+        schema_config_path='tutorial/05_schema_config.yaml',
     )
     # Run the import
-    driver.write_nodes(node_generator())
+    bc.write_nodes(node_generator())
 
     # Write command line call
-    driver.write_import_call()
+    bc.write_import_call()
 
 
 if __name__ == '__main__':
diff --git a/tutorial/05_biocypher_config.yaml b/tutorial/05_biocypher_config.yaml
new file mode 100644
index 00000000..e6c386d2
--- /dev/null
+++ b/tutorial/05_biocypher_config.yaml
@@ -0,0 +1,5 @@
+biocypher:
+  offline: true
+
+neo4j:
+  database_name: propertyinheritance
diff --git a/tutorial/05_schema_config.yaml b/tutorial/05_schema_config.yaml
index e3270d35..9f6f0732 100644
--- a/tutorial/05_schema_config.yaml
+++ b/tutorial/05_schema_config.yaml
@@ -1,7 +1,7 @@
 protein:
     represented_as: node
     preferred_id: [uniprot, entrez]
-    label_in_input: [uniprot_protein, entrez_protein]
+    input_label: [uniprot_protein, entrez_protein]
     properties:
         sequence: str
         description: str
@@ -13,4 +13,4 @@ protein isoform:
     inherit_properties: true
     represented_as: node
     preferred_id: uniprot
-    label_in_input: uniprot_isoform
+    input_label: uniprot_isoform
diff --git a/tutorial/06_relationships.py b/tutorial/06__relationships.py
similarity index 77%
rename from tutorial/06_relationships.py
rename to tutorial/06__relationships.py
index 781a7d17..364377bc 100644
--- a/tutorial/06_relationships.py
+++ b/tutorial/06__relationships.py
@@ -1,12 +1,10 @@
+from biocypher import BioCypher
 from tutorial.data_generator import (
     EntrezProtein,
     InteractionGenerator,
     RandomPropertyProtein,
     RandomPropertyProteinIsoform,
 )
-import biocypher
-
-__all__ = ['main']
 
 
 def main():
@@ -46,20 +44,19 @@ def edge_generator():
             )
 
     # Create BioCypher driver
-    driver = biocypher.Driver(
-        offline=True,  # start without connecting to Neo4j instance
-        db_name='relationships',  # name of database for import call
-        user_schema_config_path='tutorial/06_schema_config.yaml',
+    bc = BioCypher(
+        biocypher_config_path='tutorial/06_biocypher_config.yaml',
+        schema_config_path='tutorial/06_schema_config.yaml',
     )
     # Run the import
-    driver.write_nodes(node_generator())
-    driver.write_edges(edge_generator())
+    bc.write_nodes(node_generator())
+    bc.write_edges(edge_generator())
 
     # Write command line call
-    driver.write_import_call()
+    bc.write_import_call()
 
     # Visualise ontology schema
-    driver.show_ontology_structure()
+    bc.show_ontology_structure()
 
 
 if __name__ == '__main__':
diff --git a/tutorial/06_biocypher_config.yaml b/tutorial/06_biocypher_config.yaml
new file mode 100644
index 00000000..94ffaf45
--- /dev/null
+++ b/tutorial/06_biocypher_config.yaml
@@ -0,0 +1,5 @@
+biocypher:
+  offline: true
+
+neo4j:
+  database_name: relationships
diff --git a/tutorial/06_schema_config.yaml b/tutorial/06_schema_config.yaml
index 1abefd83..80dc6b14 100644
--- a/tutorial/06_schema_config.yaml
+++ b/tutorial/06_schema_config.yaml
@@ -1,7 +1,7 @@
 protein:
     represented_as: node
     preferred_id: [uniprot, entrez]
-    label_in_input: [uniprot_protein, entrez_protein]
+    input_label: [uniprot_protein, entrez_protein]
     properties:
         sequence: str
         description: str
@@ -13,13 +13,13 @@ protein isoform:
     inherit_properties: true
     represented_as: node
     preferred_id: uniprot
-    label_in_input: uniprot_isoform
+    input_label: uniprot_isoform
 
 protein protein interaction:
     is_a: pairwise molecular interaction
     represented_as: node
     preferred_id: intact
-    label_in_input: interacts_with
+    input_label: interacts_with
     properties:
         method: str
         source: str
diff --git a/tutorial/07_synonyms.py b/tutorial/07__synonyms.py
similarity index 78%
rename from tutorial/07_synonyms.py
rename to tutorial/07__synonyms.py
index 8c5767c0..a48082f4 100644
--- a/tutorial/07_synonyms.py
+++ b/tutorial/07__synonyms.py
@@ -1,3 +1,4 @@
+from biocypher import BioCypher
 from tutorial.data_generator import (
     Complex,
     EntrezProtein,
@@ -5,9 +6,6 @@
     RandomPropertyProtein,
     RandomPropertyProteinIsoform,
 )
-import biocypher
-
-__all__ = ['main']
 
 
 def main():
@@ -48,20 +46,19 @@ def edge_generator():
             )
 
     # Create BioCypher driver
-    driver = biocypher.Driver(
-        offline=True,  # start without connecting to Neo4j instance
-        db_name='synonyms',  # name of database for import call
-        user_schema_config_path='tutorial/07_schema_config.yaml',
+    bc = BioCypher(
+        biocypher_config_path='tutorial/07_biocypher_config.yaml',
+        schema_config_path='tutorial/07_schema_config.yaml',
     )
     # Run the import
-    driver.write_nodes(node_generator())
-    driver.write_edges(edge_generator())
+    bc.write_nodes(node_generator())
+    bc.write_edges(edge_generator())
 
     # Write command line call
-    driver.write_import_call()
+    bc.write_import_call()
 
     # Visualise ontology schema
-    driver.show_ontology_structure()
+    bc.show_ontology_structure()
 
 
 if __name__ == '__main__':
diff --git a/tutorial/07_biocypher_config.yaml b/tutorial/07_biocypher_config.yaml
new file mode 100644
index 00000000..ebc19236
--- /dev/null
+++ b/tutorial/07_biocypher_config.yaml
@@ -0,0 +1,6 @@
+biocypher:
+  offline: true
+
+neo4j:
+  database_name: synonyms
+  delimiter: '\t'
diff --git a/tutorial/07_schema_config.yaml b/tutorial/07_schema_config.yaml
index ba3a93f6..71a8a5d8 100644
--- a/tutorial/07_schema_config.yaml
+++ b/tutorial/07_schema_config.yaml
@@ -1,7 +1,7 @@
 protein:
     represented_as: node
     preferred_id: [uniprot, entrez]
-    label_in_input: [uniprot_protein, entrez_protein]
+    input_label: [uniprot_protein, entrez_protein]
     properties:
         sequence: str
         description: str
@@ -13,13 +13,13 @@ protein isoform:
     inherit_properties: true
     represented_as: node
     preferred_id: uniprot
-    label_in_input: uniprot_isoform
+    input_label: uniprot_isoform
 
 protein protein interaction:
     is_a: pairwise molecular interaction
     represented_as: node
     preferred_id: intact
-    label_in_input: interacts_with
+    input_label: interacts_with
     properties:
         method: str
         source: str
@@ -28,4 +28,4 @@ complex:
     synonym_for: macromolecular complex
     represented_as: node
     preferred_id: complexportal
-    label_in_input: complex
+    input_label: complex


Test patch:
diff --git a/biocypher/_config/test-biolink-model.yaml b/biocypher/_config/test-biolink-model.yaml
deleted file mode 100644
index 5b79da55..00000000
--- a/biocypher/_config/test-biolink-model.yaml
+++ /dev/null
@@ -1,10686 +0,0 @@
-id: https://w3id.org/biolink/biolink-model
-name: Biolink-Model
-description: Entity and association taxonomy and datamodel for life-sciences data
-license: https://creativecommons.org/publicdomain/zero/1.0/
-
-# Version should be kept in sync with primary Git repository release tag
-
-version: 2.2.12
-
-## ------------
-## PREFIXES
-## ------------
-
-#
-# CURIE namespaces (prefixes/base URI's) mappings of prefixes used in the body of the Biolink Model specification
-# are resolved using a specific precedence order, for use in the generation of the Biolink Model context.jsonld
-# mappings to namespaces. Any prefixes encountered in the Biolink Model but not resolved by the following
-# precedence sources, are anonymously declared by linkml as http://example.org/UNKNOWN/ rooted base URI's
-# which should ideally be repaired in one of the precedence lists.
-#
-# 1. The following 'prefixes:' delimited list has first precedence in resolution.
-#
-prefixes:
-  alliancegenome: 'https://www.alliancegenome.org/'
-  apollo: 'https://github.com/GMOD/Apollo'
-  biolink: 'https://w3id.org/biolink/vocab/'
-  bioschemas: 'https://bioschemas.org/'
-  linkml: 'https://w3id.org/linkml/'
-  CAID: 'http://reg.clinicalgenome.org/redmine/projects/registry/genboree_registry/by_caid?caid='
-  # Placeholder: just points to GMOD Chado wiki
-  CHADO: 'http://gmod.org/wiki/Chado/'
-  # Placeholders: not sure how 'chembio'and CHEMBL.MECHANISM really resolve
-  ChemBank: 'http://chembank.broadinstitute.org/chemistry/viewMolecule.htm?cbid='
-  CHEMBL.MECHANISM: 'https://www.ebi.ac.uk/chembl/mechanism/inspect/'
-  CID: 'http://pubchem.ncbi.nlm.nih.gov/compound/'
-  CLINVAR: 'http://identifiers.org/clinvar'
-  COAR_RESOURCE: 'http://purl.org/coar/resource_type/'
-  COG: 'https://www.ncbi.nlm.nih.gov/research/cog-project/'
-  CPT: 'https://www.ama-assn.org/practice-management/cpt/'
-  CTD.CHEMICAL: 'http://ctdbase.org/detail.go?type=chem&acc='
-  CTD.DISEASE: 'http://ctdbase.org/detail.go?type=disease&db=MESH&acc='
-  CTD.GENE: 'http://ctdbase.org/detail.go?type=gene&acc='
-  CTD: 'http://ctdbase.org/'
-  DGIdb: 'https://www.dgidb.org/interaction_types'
-  dcat: 'http://www.w3.org/ns/dcat#'
-  dct: 'http://purl.org/dc/terms/'
-  dcid: 'https://datacommons.org/browser/'
-  doi: 'https://doi.org/'
-  DOID-PROPERTY: 'http://purl.obolibrary.org/obo/doid#'
-  DrugCentral: 'http://drugcentral.org/drugcard/'
-  ECTO: 'http://purl.obolibrary.org/obo/ECTO_'
-  EDAM-DATA: 'http://edamontology.org/data_'
-  EDAM-FORMAT: 'http://edamontology.org/format_'
-  EDAM-OPERATION: 'http://edamontology.org/operation_'
-  EDAM-TOPIC: 'http://edamontology.org/topic_'
-  EFO: 'http://www.ebi.ac.uk/efo/EFO_'
-  ExO: 'http://purl.obolibrary.org/obo/ExO_'
-  fabio: 'http://purl.org/spar/fabio/'
-  foaf: 'http://xmlns.com/foaf/0.1/'
-  foodb.compound: 'http://foodb.ca/compounds/'
-  FYPO: 'http://purl.obolibrary.org/obo/FYPO_'  # Fission Yeast Phenotype Ontology
-  GAMMA: 'http://translator.renci.org/GAMMA_'
-  gff3: 'https://github.com/The-Sequence-Ontology/Specifications/blob/master/gff3.md#'
-  GOREL: 'http://purl.obolibrary.org/obo/GOREL_'
-  # GOP: Gene Ontology Property (not really a GO term but an associated metadatum)
-  GOP: 'http://purl.obolibrary.org/obo/go#'
-  gpi: 'https://github.com/geneontology/go-annotation/blob/master/specs/gpad-gpi-2-0.md#'
-  GSID: 'https://scholar.google.com/citations?user='
-  GTEx: 'https://www.gtexportal.org/home/gene/'
-  GTOPDB: 'https://www.guidetopharmacology.org/GRAC/LigandDisplayForward?ligandId='
-  gtpo: 'https://rdf.guidetopharmacology.org/ns/gtpo#'
-  HANCESTRO: 'http://www.ebi.ac.uk/ancestro/ancestro_'
-  HCPCS: 'http://purl.bioontology.org/ontology/HCPCS/'
-  HsapDv: 'http://purl.obolibrary.org/obo/HsapDv_'
-  ICD10: 'https://icd.codes/icd9cm/'
-  ICD9: 'http://translator.ncats.nih.gov/ICD9_'
-  interpro: 'https://www.ebi.ac.uk/interpro/entry/'
-  INO: 'http://purl.obolibrary.org/obo/INO_'
-  isbn: 'https://www.isbn-international.org/identifier/' # note: a resolvable base URI not available from isbn-international
-  isni: 'https://isni.org/isni/'
-  issn: 'https://portal.issn.org/resource/ISSN/'
-  KEGG.BRITE: 'http://www.kegg.jp/entry/'
-  KEGG.DGROUP: 'http://www.kegg.jp/entry/'
-  KEGG.ENZYME: 'http://www.kegg.jp/entry/'
-  KEGG.GENE: 'http://www.kegg.jp/entry/'
-  KEGG.PATHWAY: 'https://www.kegg.jp/entry/'
-  KEGG.RCLASS: 'http://www.kegg.jp/entry/'
-  LOINC: 'http://loinc.org/rdf/'
-  MAXO: 'http://purl.obolibrary.org/obo/MAXO_'
-  medgen: 'https://www.ncbi.nlm.nih.gov/medgen/'
-  metacyc.reaction: 'https://identifiers.org/metacyc.reaction:'
-  METANETX.REACTION: 'https://www.metanetx.org/equa_info/'
-  MESH: 'http://id.nlm.nih.gov/mesh/'
-  MI: 'http://purl.obolibrary.org/obo/MI_'
-  mirbase: 'http://identifiers.org/mirbase'
-  MSigDB: 'https://www.gsea-msigdb.org/gsea/msigdb/'
-  NBO-PROPERTY: 'http://purl.obolibrary.org/obo/nbo#'
-  NCBIGene: 'http://identifiers.org/ncbigene/'
-  NCIT-OBO: 'http://purl.obolibrary.org/obo/ncit#'
-  NDDF: 'http://purl.bioontology.org/ontology/NDDF/'
-  NLMID: 'https://www.ncbi.nlm.nih.gov/nlmcatalog/?term='
-  OBAN: 'http://purl.org/oban/'
-  oboformat: 'http://www.geneontology.org/formats/oboInOwl#'
-  OBOREL: 'http://purl.obolibrary.org/obo/RO_'
-  ORCID: 'https://orcid.org/'
-  ORPHA: 'http://www.orpha.net/ORDO/Orphanet_'
-  os: 'https://github.com/cmungall/owlstar/blob/master/owlstar.ttl'
-  PANTHER.FAMILY: 'http://www.pantherdb.org/panther/family.do?clsAccession='
-  PathWhiz: 'http://smpdb.ca/pathways/#'  # See also https://smpdb.ca/pathwhiz/
-  pav: 'http://purl.org/pav/'
-  PHAROS: 'http://pharos.nih.gov'
-  prov: 'http://www.w3.org/ns/prov#'
-  qud: 'http://qudt.org/1.1/schema/qudt#'
-  REPODB: 'http://apps.chiragjpgroup.org/repoDB/'
-  ResearchID: 'https://publons.com/researcher/'
-  RO: 'http://purl.obolibrary.org/obo/RO_'
-  RXNORM: 'http://purl.bioontology.org/ontology/RXNORM/'
-  RXCUI: 'https://mor.nlm.nih.gov/RxNav/search?searchBy=RXCUI&searchTerm='
-  schema: 'http://schema.org/'
-  ScopusID: 'https://www.scopus.com/authid/detail.uri?authorId='
-  SEED.REACTION: 'https://modelseed.org/biochem/reactions/'
-  SEMMEDDB: 'https://skr3.nlm.nih.gov/SemMedDB'
-  SIO: 'http://semanticscience.org/resource/SIO_'
-  SNOMED: 'http://www.snomedbrowser.com/Codes/Details/'
-  SNOMEDCT: 'http://www.snomedbrowser.com/Codes/Details/'
-  UBERGRAPH: 'http://translator.renci.org/ubergraph-axioms.ofn#'
-  UBERON_CORE: 'http://purl.obolibrary.org/obo/uberon/core#'
-  UBERON_NONAMESPACE: 'http://purl.obolibrary.org/obo/core#'
-  # The UMLS Semantic types and groups namespaces don't have a directly
-  # resolvable Base URI, but we point to a pair of sensible web documents
-  STY: 'http://purl.bioontology.org/ontology/STY/'
-  UMLSSG: 'https://lhncbc.nlm.nih.gov/semanticnetwork/download/sg_archive/SemGroups-v04.txt'
-  VANDF: 'https://www.nlm.nih.gov/research/umls/sourcereleasedocs/current/VANDF/'
-  UO-PROPERTY: 'http://purl.obolibrary.org/obo/uo#'
-  # The "Variation Modelling Collaboration" (VMC) is not (yet) a conventional namespace so we point to its Github repo
-  # See also: https://www.ga4gh.org/work_stream/genomic-knowledge-standards/#existing-standards and
-  # https://www.ncbi.nlm.nih.gov/pmc/articles/PMC7153148/
-  VMC: 'https://github.com/ga4gh/vr-spec/'
-  WBVocab: 'http://bio2rdf.org/wormbase_vocabulary'
-  WIKIDATA: 'https://www.wikidata.org/wiki/'            # Wikidata Entity
-  WIKIDATA_PROPERTY: 'https://www.wikidata.org/wiki/Property:'  # Wikidata Property - not a conventional namespace prefix
-  wgs: 'http://www.w3.org/2003/01/geo/wgs84_pos'
-  XPO: 'http://purl.obolibrary.org/obo/XPO_'  # Xenopus Phenotype Ontology
-  Xenbase: 'http://www.xenbase.org/gene/showgene.do?method=display&geneId='
-
-default_prefix: biolink
-default_range: string
-
-# 2. The following prefix maps are retrieved from the
-#    specified contexts defined at https://prefixcommons.org/
-default_curi_maps:
-  - obo_context
-  - idot_context
-  - monarch_context
-  - semweb_context
-
-# The following 'standard' prefixes are also used.
-emit_prefixes:
-  - rdf
-  - rdfs
-  - xsd
-  - skos
-  - OIO
-  - BIOGRID
-  - SO
-
-## ------------
-## SUBSETS
-## ------------
-enums:
-  logical_interpretation_enum:
-    permissible_values:
-      SomeSome:
-        description: >-
-          A modifier on a triple that causes the triple to be interpreted as a some-some statement
-        meaning: os:SomeSomeInterpretation
-      AllSome:
-        description: >-
-          A modifier on a triple that causes the triple to be interpreted as an all-some statement.
-        meaning: os:AllSomeInterpretation
-      InverseAllSome:
-
-  reaction_direction_enum:
-    permissible_values:
-      left_to_right:
-      right_to_left:
-      bidirectional:
-      neutral:
-
-  reaction_side_enum:
-    permissible_values:
-      left:
-      right:
-
-  phase_enum:
-    description: phase
-    permissible_values:
-      0:
-      1:
-      2:
-
-  strand_enum:
-    description: strand
-    permissible_values:
-      "+":
-        description: Positive
-      "-":
-        description: Negative
-      ".":
-        description: Unstranded
-      "?":
-        description: Unknown
-
-  sequence_enum:
-    description: type of sequence
-    permissible_values:
-      "NA":
-        description: nucleic acid
-      "AA":
-        description: amino acid
-
-  predicate_qualifier_enum:
-    description: >-
-      constrained list of qualifying terms that soften or expand the definition of the predicate used.
-      can be used to constrain or qualify any predicate (any child of related_to).
-    permissible_values:
-      "predicted":
-      "possibly":
-      "hypothesized":
-      "validated":
-      "supported by real-world evidence":
-      "supported by clinical evidence":
-
-  drug_availability_enum:
-    description: >-
-    permissible_values:
-      "over the counter":
-        description: >-
-          chemical entity is available over the counter without a prescription.
-      "prescription":
-        description:
-          chemical entity is available by prescription.
-
-  FDA_approval_status_enum:
-    description: >-
-    permissible_values:
-      "Discovery & Development Phase":
-        description: >-
-          Discovery & Development Phase. Discovery involves researchers finding new possibilities
-          for medication through testing molecular compounds, noting unexpected effects from existing treatments,
-          or the creation of new technology that allows novel ways of targeting medical products to sites in the body.
-          Drug development occurs after researchers identify potential compounds for experiments.
-      "Preclinical Research Phase":
-        description: >-
-          Preclinical Research Phase.  Once researchers have examined the possibilities a new drug may contain,
-          they must do preliminary research to determine its potential for harm (toxicity).
-          This is categorized as preclinical research and can be one of two types: in vitro or in vivo.
-      "FDA Clinical Research Phase":
-        description: >-
-          Clinical Research Phase. Clinical research involves trials of the drug on people,
-          and it is one of the most involved stages in the drug development and approval process.
-          Clinical trials must answer specific questions and follow a protocol determined by
-          the drug researcher or manufacturer.
-      "FDA Review Phase 4":
-        description: >-
-          FDA Review
-      "FDA Post-Market Safety Monitoring":
-        description: >-
-          FDA Post-Market Safety Monitoring.  The last phase of drug approval is an ongoing one
-          while the drug is on the marketplace. If a developer wants to change anything about the
-          drug formulation or approve it for a new use, they must apply with the FDA. The FDA also
-          frequently reviews the drug’s advertising and its manufacturing facility to make sure
-          everything involved in its creation and marketing is in compliance with regulations.
-      "FDA Clinical Research Phase 1":
-        description: >-
-          In the FDA Clinical Research Phase, the Clinical Research Phase 1 involves 20 – 100 study participants and
-          lasts several months. This phase is used to determine the safety and dosage of the drug,
-          and about 70% of these drugs move on to the next clinical research phase.
-      "FDA Clinical Research Phase 2":
-        description: >-
-          In the FDA Clinical Research Phase, the Clinical Research Phase 2 involves up to several hundred people,
-          who must have the disease or condition the drug supposes to treat. This phase can last
-          from a few months to two years, and its purpose is to monitor the efficacy of the drug,
-          as well as note side effects that may occur.
-      "FDA Clinical Research Phase 3":
-        description: >-
-          In the FDA Clinical Research Phase, the Clinical Research Phase 3 involves 300 – 3000 volunteers
-          and can last up to four years. It is used to continue monitoring the efficacy of
-          the drug, as well as exploring any longer-term adverse reactions.
-      "FDA Clinical Research Phase 4":
-        description: >-
-          In the FDA Clinical Research Phase, the Clinical Research Phase 4 involves several thousands of
-          volunteers who have the disease or condition and continues to monitor safety and efficacy.
-          If a drug passes this phase, it goes on to FDA review.
-      "FDA Fast Track":
-        description: >-
-          Fast track is a process designed to facilitate the development, and expedite the
-          review of drugs to treat serious conditions and fill an unmet medical need.
-          The purpose is to get important new drugs to the patient earlier. Fast Track
-          addresses a broad range of serious conditions. For more information https://www.fda.gov/patients/fast-track-breakthrough-therapy-accelerated-approval-priority-review/fast-track
-      "FDA Breakthrough Therapy":
-        description: >-
-          Breakthrough Therapy designation is a process designed to expedite the
-          development and review of drugs that are intended to treat a serious
-          condition and preliminary clinical evidence indicates that the drug may
-          demonstrate substantial improvement over available therapy on a clinically significant endpoint(s).
-          For more information https://www.fda.gov/patients/fast-track-breakthrough-therapy-accelerated-approval-priority-review/breakthrough-therapy
-      "FDA Accelerated Approval":
-        description: >-
-          When studying a new drug, it can sometimes take many years to learn whether a drug actually
-          provides a real effect on how a patient survives, feels, or functions. A positive therapeutic
-          effect that is clinically meaningful in the context of a given disease is known as “clinical benefit”.
-          Mindful of the fact that it may take an extended period of time to measure a drug’s intended clinical
-          benefit, in 1992 FDA instituted the Accelerated Approval regulations. These regulations allowed drugs
-          for serious conditions that filled an unmet medical need to be approved based on a surrogate endpoint.
-          Using a surrogate endpoint enabled the FDA to approve these drugs faster.
-          For more information https://www.fda.gov/patients/fast-track-breakthrough-therapy-accelerated-approval-priority-review/accelerated-approval
-      "FDA Priority Review":
-        description: >-
-          Prior to approval, each drug marketed in the United States must go through a detailed FDA review process.
-          In 1992, under the Prescription Drug User Act (PDUFA), FDA agreed to specific goals for improving
-          the drug review time and created a two-tiered system of review times – Standard Review and Priority
-          Review. A Priority Review designation means FDA’s goal is to take action on an application
-          within 6 months (compared to 10 months under standard review).
-          For more information https://www.fda.gov/patients/fast-track-breakthrough-therapy-accelerated-approval-priority-review/priority-review
-      "Regular FDA Approval":
-      "Post-Approval Withdrawal":
-
-subsets:
-
-  model_organism_database:
-    description: >-
-      Subset that is relevant for a typical Model Organism Database (MOD)
-
-  translator_minimal:
-    description: >-
-      Minimum subset of translator work
-
-  samples:
-    description: >-
-      Sample/biosample datamodel
-
-  testing:
-    description: >-
-      TBD
-
-
-## ------------
-## TYPES
-## ------------
-
-imports:
-  - linkml:types
-
-types:
-
-  chemical formula value:
-    uri: xsd:string
-    base: str
-    description: A chemical formula
-    notes:
-      - Should be implemented as a stronger type
-
-  category type:
-    typeof: uriorcurie
-    description: >-
-      A primitive type in which the value denotes a class within the biolink model.
-      The value must be a URI or a CURIE. In a Neo4j representation, the value should
-      be the CURIE for the biolink class, for example biolink:Gene. For an RDF representation,
-      the value should be a URI such as https://w3id.org/biolink/vocab/Gene
-
-  iri type:
-    typeof: uriorcurie
-    description: >-
-      An IRI
-
-  label type:
-    typeof: string
-    description: >-
-      A string that provides a human-readable name for an entity
-
-  predicate type:
-    typeof: uriorcurie
-    description: >-
-      A CURIE from the biolink related_to hierarchy.
-      For example, biolink:related_to, biolink:causes, biolink:treats.
-
-  narrative text:
-    typeof: string
-    description: >-
-      A string that provides a human-readable description of something
-
-  symbol type:
-    typeof: string
-
-  frequency value:
-    typeof: string
-    uri: UO:0000105
-
-  percentage frequency value:
-    typeof: double
-    uri: UO:0000187
-
-  quotient:
-    aliases: ['ratio']
-    typeof: double
-    uri: UO:0010006
-
-  unit:
-    typeof: string
-    uri: UO:0000000
-    id_prefixes:
-      - UO
-    exact_mappings:
-      - qud:Unit
-
-  time type:
-    typeof: time
-
-  biological sequence:
-    typeof: string
-
-## ------------
-## SLOTS
-## ------------
-
-slots:
-
-## ---------------
-## ATTRIBUTE SLOTS
-## ---------------
-
-  has attribute:
-    description: >-
-      connects any entity to an attribute
-    domain: entity
-    range: attribute
-    multivalued: true
-    in_subset:
-      - samples
-    close_mappings:
-      # RTX term meaning 'specifies value of' tagged as inverse of 'biolink:has attribute'
-      - OBI:0001927
-    exact_mappings:
-      - SIO:000008
-    narrow_mappings:
-      # if 'has attribute' annotates a NamedThing as subject or
-      # object of an association, these OBAN mappings may apply
-      - OBAN:association_has_subject_property
-      - OBAN:association_has_object_property
-      - CPT:has_possibly_included_panel_element
-      - DRUGBANK:category
-      # RTX contributed terms. Could perhaps review for more semantically precise mappings?
-      - EFO:is_executed_in
-      - HANCESTRO:0301
-      - LOINC:has_action_guidance
-      - LOINC:has_adjustment
-      - LOINC:has_aggregation_view
-      - LOINC:has_approach_guidance
-      - LOINC:has_divisor
-      - LOINC:has_exam
-      - LOINC:has_method
-      - LOINC:has_modality_subtype
-      - LOINC:has_object_guidance
-      - LOINC:has_scale
-      - LOINC:has_suffix
-      - LOINC:has_time_aspect
-      - LOINC:has_time_modifier
-      - LOINC:has_timing_of
-      # disease is stage
-      - NCIT:R88
-      - NCIT:eo_disease_has_property_or_attribute
-      - NCIT:has_data_element
-      - NCIT:has_pharmaceutical_administration_method
-      - NCIT:has_pharmaceutical_basic_dose_form
-      - NCIT:has_pharmaceutical_intended_site
-      - NCIT:has_pharmaceutical_release_characteristics
-      - NCIT:has_pharmaceutical_state_of_matter
-      - NCIT:has_pharmaceutical_transformation
-      - NCIT:is_qualified_by
-      - NCIT:qualifier_applies_to
-      - NCIT:role_has_domain
-      - NCIT:role_has_range
-      - INO:0000154
-      - HANCESTRO:0308
-      - OMIM:has_inheritance_type
-      - ORPHA:C016
-      - ORPHA:C017
-      - RO:0000053
-      # RTX tagged a few RO terms as 'biolink:related_to' but semantics suggest a better mapping here
-      - RO:0000086
-      - RO:0000087
-      - SNOMED:has_access
-      - SNOMED:has_clinical_course
-      - SNOMED:has_count_of_base_of_active_ingredient
-      - SNOMED:has_dose_form_administration_method
-      - SNOMED:has_dose_form_release_characteristic
-      - SNOMED:has_dose_form_transformation
-      - SNOMED:has_finding_context
-      - SNOMED:has_finding_informer
-      - SNOMED:has_inherent_attribute
-      - SNOMED:has_intent
-      - SNOMED:has_interpretation
-      - SNOMED:has_laterality
-      - SNOMED:has_measurement_method
-      - SNOMED:has_method
-      - SNOMED:has_priority
-      - SNOMED:has_procedure_context
-      - SNOMED:has_process_duration
-      - SNOMED:has_property
-      - SNOMED:has_revision_status
-      - SNOMED:has_scale_type
-      - SNOMED:has_severity
-      - SNOMED:has_specimen
-      - SNOMED:has_state_of_matter
-      - SNOMED:has_subject_relationship_context
-      - SNOMED:has_surgical_approach
-      - SNOMED:has_technique
-      - SNOMED:has_temporal_context
-      - SNOMED:has_time_aspect
-      - SNOMED:has_units
-      - UMLS:has_structural_class
-      - UMLS:has_supported_concept_property
-      - UMLS:has_supported_concept_relationship
-      - UMLS:may_be_qualified_by
-
-  has attribute type:
-    description: >-
-      connects an attribute to a class that describes it
-    domain: attribute
-    range: ontology class
-    multivalued: false
-    required: true
-    in_subset:
-      - samples
-    narrow_mappings:
-      - LOINC:has_modality_type
-      - LOINC:has_view_type
-
-  # TRAPI Attribute schema alignment:
-  # value: NamedThing.name
-  # value_type: NamedThing.category
-  # value_type_name: quantity_value.NamedThing.name
-  has qualitative value:
-    description: >-
-      connects an attribute to a value
-    domain: attribute
-    range: named thing
-    multivalued: false
-    in_subset:
-      - samples
-
-  # TRAPI Attribute schema alignment:
-  # value: quantity_value.has_numeric_value[double] - may be a vector?
-  # value_type: quantity_value.has_unit.unit.uri
-  # value_type_name: quantity_value.has_unit.unit.name[string]
-  has quantitative value:
-    description: >-
-      connects an attribute to a value
-    domain: attribute
-    range: quantity value
-    multivalued: true
-    exact_mappings:
-      - qud:quantityValue
-    narrow_mappings:
-      - SNOMED:has_concentration_strength_numerator_value
-      - SNOMED:has_presentation_strength_denominator_value
-      - SNOMED:has_presentation_strength_numerator_value
-    in_subset:
-      - samples
-
-  has numeric value:
-    description: >-
-      connects a quantity value to a number
-    domain: quantity value
-    range: double
-    multivalued: false
-    exact_mappings:
-      - qud:quantityValue
-    in_subset:
-      - samples
-
-  has unit:
-    description: >-
-      connects a quantity value to a unit
-    domain: quantity value
-    range: unit
-    multivalued: false
-    close_mappings:
-      # These RTX contributed terms mean "is unit of" which is the semantic inverse of this biolink:has_unit term
-      - EFO:0001697
-      - UO-PROPERTY:is_unit_of
-    exact_mappings:
-      - qud:unit
-      - IAO:0000039
-    narrow_mappings:
-      - SNOMED:has_concentration_strength_denominator_unit
-      - SNOMED:has_concentration_strength_numerator_unit
-      - SNOMED:has_presentation_strength_denominator_unit
-      - SNOMED:has_presentation_strength_numerator_unit
-      - SNOMED:has_unit_of_presentation
-    in_subset:
-      - samples
-
-  base coordinate:
-    is_a: sequence localization attribute
-    aliases: [ 'one-based', 'fully-closed' ]
-    description: >-
-      A position in the base coordinate system.  Base coordinates start at position 1 instead of position 0.
-    range: integer
-
-## --------------------
-## NODE PROPERTY SLOTS
-## --------------------
-
-  node property:
-    description: >-
-      A grouping for any property that holds between a node and a value
-    domain: named thing
-
-  id:
-    identifier: true
-    description: >-
-      A unique identifier for an entity.
-      Must be either a CURIE shorthand for a URI or a complete URI
-    in_subset:
-      - translator_minimal
-    required: true
-    exact_mappings:
-      - alliancegenome:primaryId
-      - gff3:ID
-      - gpi:DB_Object_ID
-
-  iri:
-    description: >-
-      An IRI for an entity. This is determined by the id using expansion rules.
-    range: iri type
-    in_subset:
-      - translator_minimal
-      - samples
-    exact_mappings:
-      - WIKIDATA_PROPERTY:P854
-
-  type:
-    slot_uri: rdf:type
-    exact_mappings:
-      - alliancegenome:soTermId
-      - gff3:type
-      - gpi:DB_Object_Type
-
-  category:
-    is_a: type
-    domain: entity
-    range: category type
-    designates_type: true
-    description: >-
-      Name of the high level ontology class in which this entity is categorized. Corresponds to the label for the
-      biolink entity type class.
-       * In a neo4j database this MAY correspond to the neo4j label tag.
-       * In an RDF database it should be a biolink model class URI.
-      This field is multi-valued. It should include values for ancestors of the biolink class; for example,
-      a protein such as Shh would have category values `biolink:Protein`, `biolink:GeneProduct`, `biolink:MolecularEntity`, ...
-
-      In an RDF database, nodes will typically have an rdf:type triples. This can be to the most specific biolink
-      class, or potentially to a class more specific than something in biolink. For example, a sequence feature `f`
-      may have a rdf:type assertion to a SO class such as TF_binding_site,
-      which is more specific than anything in biolink. Here we would have categories {biolink:GenomicEntity,
-      biolink:MolecularEntity, biolink:NamedThing}
-    is_class_field: true
-    multivalued: true
-    in_subset:
-      - translator_minimal
-
-  name:
-    aliases: [ 'label', 'display name', 'title' ]
-    description: >-
-      A human-readable name for an attribute or entity.
-    range: label type
-    in_subset:
-      - translator_minimal
-      - samples
-    #
-    # linkML doesn't like this name slot to be "required: true".
-    # Besides, some entity nodes/attributes may not have names?
-    # required: true
-    slot_uri: rdfs:label
-    exact_mappings:
-      - gff3:Name
-      - gpi:DB_Object_Name
-    narrow_mappings:
-      - dct:title
-      - WIKIDATA_PROPERTY:P1476
-
-  source:
-    description: >-
-      a lightweight analog to the association class 'has provider' slot, which is the string name, or
-      the authoritative (i.e. database) namespace, designating the origin of the entity to which the slot belongs.
-    range: label type
-    in_subset:
-      - translator_minimal
-
-  stoichiometry:
-    description: >-
-      the relationship between the relative quantities of substances taking part in a reaction or
-      forming a compound, typically a ratio of whole integers.
-    is_a: association slot
-    range: integer
-
-  reaction direction:
-    description: >-
-      the direction of a reaction as constrained by the direction_enum (ie: left_to_right, neutral, etc.)
-    is_a: association slot
-    range: reaction_direction_enum
-    narrow_mappings:
-      - NCIT:C42677
-
-  reaction balanced:
-    is_a: association slot
-    range: boolean
-
-  reaction side:
-    description: >-
-      the side of a reaction being modeled (ie: left or right)
-    is_a: association slot
-    range: reaction_side_enum
-
-  symbol:
-    is_a: node property
-    domain: named thing
-    description: >-
-      Symbol for a particular thing
-    exact_mappings:
-      - alliancegenome:symbol
-      - gpi:DB_Object_Symbol
-
-  synonym:
-    is_a: node property
-    aliases: ['alias']
-    domain: named thing
-    range: label type
-    description: >-
-      Alternate human-readable names for a thing
-    multivalued: true
-    in_subset:
-      - translator_minimal
-    narrow_mappings:
-      # there is an interesting debate here: are these terms "narrower" a.k.a. more specialized instances of
-      # 'biolink:synonym' or should they be binned into their respective namesake class of mappings?
-      # namely, is 'oboInOwl:hasExactSynonym' an instance 'exact_mappings', etc.
-      - skos:altLabel
-      - gff3:Alias
-      - alliancegenome:synonyms
-      - gpi:DB_Object_Synonyms
-      - oboInOwl:hasExactSynonym
-      - oboInOwl:hasNarrowSynonym
-      - oboInOwl:hasBroadSynonym
-      - oboInOwl:hasRelatedSynonym
-      # TODO: RTX contributed terms mapped here... May need review?
-      - HANCESTRO:0330
-      - IAO:0000136
-      - RXNORM:has_tradename
-
-  has topic:
-    aliases: ['topic', 'descriptors']
-    is_a: node property
-    range: ontology class
-    exact_mappings:
-      - foaf:topic
-    description: >-
-      Connects a node to a vocabulary term or ontology class that describes some aspect of the entity. In general specific characterization is preferred.
-      See https://github.com/biolink/biolink-model/issues/238
-
-  xref:
-    is_a: node property
-    aliases: ['dbxref', 'Dbxref', 'DbXref']
-    domain: named thing
-    range: uriorcurie
-    description: >-
-      Alternate CURIEs for a thing
-    multivalued: true
-    in_subset:
-      - translator_minimal
-    narrow_mappings:
-      - gff3:Dbxref
-      - gpi:DB_Xrefs
-
-  full name:
-    is_a: node property
-    domain: named thing
-    range: label type
-    description: >-
-      a long-form human readable name for a thing
-
-  description:
-    aliases: ['definition']
-    range: narrative text
-    description: >-
-      a human-readable description of an entity
-    in_subset:
-      - translator_minimal
-    slot_uri: dct:description
-    exact_mappings:
-      - IAO:0000115
-      - skos:definitions
-    narrow_mappings:
-      - gff3:Description
-
-  systematic synonym:
-    is_a: node property
-    domain: named thing
-    range: label type
-    multivalued: true
-    slot_uri: GOP:systematic_synonym
-    description: >-
-      more commonly used for gene symbols in yeast
-
-  affiliation:
-    is_a: node property
-    description: >-
-      a professional relationship between one provider (often a person) within another provider (often an organization).
-      Target provider identity should be specified by a CURIE. Providers may have multiple affiliations.
-    domain: agent
-    range: uriorcurie
-    multivalued: true
-
-  address:
-    is_a: node property
-    description: >-
-      the particulars of the place where someone or an organization is situated.  For now, this slot is a
-      simple text "blob" containing all relevant details of the given location for fitness of purpose.
-      For the moment, this "address" can include other contact details such as email and phone number(?).
-
-  ## Space
-
-  latitude:
-    is_a: node property
-    range: float
-    description: >-
-      latitude
-    exact_mappings:
-      - wgs:lat
-
-  longitude:
-    is_a: node property
-    range: float
-    description: >-
-      longitude
-    exact_mappings:
-      - wgs:long
-
-  ## Time
-
-  timepoint:
-    is_a: node property
-    range: time type
-    description: >-
-      a point in time
-
-  creation date:
-    is_a: node property
-    aliases: ['publication date']
-    range: date
-    description: >-
-      date on which an entity was created. This can be applied to nodes or edges
-    exact_mappings:
-      - dct:createdOn
-      - WIKIDATA_PROPERTY:P577
-
-  update date:
-    is_a: node property
-    range: date
-    description: >-
-      date on which an entity was updated. This can be applied to nodes or edges
-
-  ## Statistics
-
-  aggregate statistic:
-    is_a: node property
-    abstract: true
-
-  has count:
-    description: >-
-      number of things with a particular property
-    is_a: aggregate statistic
-    range: integer
-    exact_mappings:
-      - LOINC:has_count
-
-  has total:
-    description: >-
-      total number of things in a particular reference set
-    is_a: aggregate statistic
-    range: integer
-
-  has quotient:
-    is_a: aggregate statistic
-    range: double
-
-  has percentage:
-    description: >-
-      equivalent to has quotient multiplied by 100
-    is_a: aggregate statistic
-    range: double
-
-  ## Properties for Information Content Entity and Publication Nodes
-
-  has dataset:
-    is_a: node property
-    domain: dataset version
-    range: dataset
-    slot_uri: dct:source
-
-  source web page:
-    is_a: node property
-    domain: dataset summary
-    broad_mappings:
-      - dct:source
-
-  source logo:
-    is_a: node property
-    domain: dataset summary
-    slot_uri: schema:logo
-
-  retrieved on:
-    is_a: node property
-    domain: dataset
-    range: date
-    exact_mappings:
-      - pav:retrievedOn
-
-  version of:
-    is_a: node property
-    domain: dataset version
-    range: dataset summary
-    exact_mappings:
-      - dct:isVersionOf
-
-  version:
-    is_a: node property
-    domain: dataset
-    broad_mappings:
-      - pav:version
-      - owl:versionInfo
-
-  license:
-    is_a: node property
-    domain: information content entity
-    exact_mappings:
-      - dct:license
-    narrow_mappings:
-      - WIKIDATA_PROPERTY:P275
-
-  rights:
-    is_a: node property
-    domain: information content entity
-    exact_mappings:
-      - dct:rights
-
-  format:
-    is_a: node property
-    domain: information content entity
-    exact_mappings:
-      - dct:format
-      - WIKIDATA_PROPERTY:P2701
-
-  created_with:
-    is_a: node property
-    domain: dataset
-    exact_mappings:
-      - pav:createdWith
-
-  download url:
-    is_a: node property
-    domain: information content entity
-    slot_uri: dcat:downloadURL
-
-  dataset download url:
-    is_a: node property
-    domain: dataset
-    slot_uri: dcat:downloadURL
-
-  distribution download url:
-    is_a: node property
-    domain: dataset distribution
-    exact_mappings:
-      - dcat:downloadURL
-
-  ingest date:
-    is_a: node property
-    domain: dataset version
-    slot_uri: pav:version
-
-  has distribution:
-    is_a: node property
-    domain: dataset version
-    range: dataset distribution
-    slot_uri: dct:distribution
-
-  published in:
-    is_a: node property
-    description: >-
-      CURIE identifier of a broader publication context within which the publication may be placed,
-      e.g. a specified book or journal.
-    domain: publication
-    range: uriorcurie
-    values_from:
-      - NLMID
-      - issn
-      - isbn
-    exact_mappings:
-      - WIKIDATA_PROPERTY:P1433
-
-  iso abbreviation:
-    is_a: node property
-    description: >-
-      Standard abbreviation for periodicals in the International Organization for Standardization (ISO) 4 system
-      See https://www.issn.org/services/online-services/access-to-the-ltwa/. If the 'published in' property is set,
-      then the iso abbreviation pertains to the broader publication context (the journal) within which the given
-      publication node is embedded, not the publication itself.
-    domain: publication
-    exact_mappings:
-      - WIKIDATA_PROPERTY:P1160
-
-  authors:
-    is_a: node property
-    singular_name: author
-    description: >-
-      connects an publication to the list of authors who contributed to the publication.
-      This property should be a comma-delimited list of author names. It is recommended that an author's name
-      be formatted as "surname, firstname initial.".   Note that this property is a node annotation expressing
-      the citation list of authorship which might typically otherwise be more completely documented in
-      biolink:PublicationToProviderAssociation defined edges which point to full details about an author
-      and possibly, some qualifiers which clarify the specific status of a given author in the publication.
-    multivalued: true
-    domain: publication
-
-  volume:
-    is_a: node property
-    description: >-
-      volume of a book or music release in a collection/series or a published collection of journal issues in a serial publication
-    domain: publication
-    exact_mappings:
-      - WIKIDATA_PROPERTY:P478
-
-  chapter:
-    is_a: node property
-    description: >-
-      chapter of a book
-    domain: book chapter
-    exact_mappings:
-      - WIKIDATA:Q1980247
-
-  issue:
-    is_a: node property
-    description: >-
-      issue of a newspaper, a scientific journal or magazine for reference purpose
-    domain: publication
-    exact_mappings:
-      - WIKIDATA_PROPERTY:P433
-
-  pages:
-    is_a: node property
-    description: >-
-      page number of source referenced for statement or publication
-    domain: publication
-    multivalued: true
-    exact_mappings:
-      - WIKIDATA_PROPERTY:P304
-
-  summary:
-    is_a: node property
-    # since 'abstract' is a linkML keyword denoting a non-instantiable class or slot,
-    # it is generally recommended that knowledge graphs use 'summary' instead to tag a Publication 'abstract'
-    aliases: ['abstract']
-    description: >-
-      executive  summary of a publication
-    domain: publication
-    exact_mappings:
-      - dct:abstract
-      - WIKIDATA:Q333291
-
-  keywords:
-    is_a: node property
-    description: >-
-      keywords tagging a publication
-    domain: publication
-    multivalued: true
-
-  mesh terms:
-    is_a: node property
-    description: >-
-      mesh terms tagging a publication
-    domain: publication
-    range: uriorcurie
-    values_from:
-      - MESH
-    multivalued: true
-    exact_mappings:
-      - dcid:MeSHTerm
-
-  ## Biology
-
-  has biological sequence:
-    is_a: node property
-    description: >-
-      connects a genomic feature to its sequence
-    range: biological sequence
-
-  has gene or gene product:
-    is_a: node property
-    description: >-
-      connects an entity with one or more gene or gene products
-    range: gene
-    multivalued: true
-
-  has gene:
-    is_a: has gene or gene product
-    description: >-
-      connects an entity associated with one or more genes
-    range: gene
-    multivalued: true
-
-  has zygosity:
-    is_a: node property
-    domain: nucleic acid entity
-    range: zygosity
-
-  ## Chemistry, drugs and food
-
-  has chemical formula:
-    is_a: node property
-    range: chemical formula value
-    description: >-
-      description of chemical compound based on element symbols
-    exact_mappings:
-      - WIKIDATA_PROPERTY:P274
-
-  is metabolite:
-    is_a: node property
-    domain: molecular entity
-    range: boolean
-    description: >-
-      indicates whether a molecular entity is a metabolite
-    exact_mappings:
-      - CHEBI:25212
-
-  has constituent:
-    description: >-
-      one or more molecular entities within a chemical mixture
-    is_a: node property
-    range: molecular entity
-    multivalued: true
-
-  has drug:
-    is_a: node property
-    description: >-
-      connects an entity to one or more drugs
-    range: drug
-    multivalued: true
-
-  has device:
-    is_a: node property
-    description: >-
-      connects an entity to one or more (medical) devices
-    range: device
-    multivalued: true
-
-  has procedure:
-    is_a: node property
-    description: >-
-      connects an entity to one or more (medical) procedures
-    range: procedure
-    multivalued: true
-
-  ## Clinical exposures
-
-  has receptor:
-    is_a: node property
-    domain: exposure event
-    range: organismal entity
-    description: >-
-      the organism or organism part being exposed
-    exact_mappings:
-      - ExO:0000001
-
-  has stressor:
-    is_a: node property
-    domain: exposure event
-    aliases: ['has stimulus']
-    description: >-
-      the process or entity that the receptor is being exposed to
-    exact_mappings:
-      - ExO:0000000
-
-  has route:
-    is_a: node property
-    domain: exposure event
-    description: >-
-      the process that results in the stressor coming into direct contact with the receptor
-    exact_mappings:
-      - ExO:0000055
-    narrow_mappings:
-      - LOINC:has_pharmaceutical_route
-      - SNOMED:has_dose_form_intended_site
-      - SNOMED:has_route_of_administration
-
-  has population context:
-    description: >-
-      a biological population (general, study, cohort, etc.) with a specific
-      set of characteristics to constrain an association.
-    is_a: association slot
-    range: population of individual organisms
-
-  has temporal context:
-    description: >-
-      a constraint of time placed upon the truth value of an association.
-    is_a: association slot
-    # this resolves to the 'time' datatype, but not sure
-    # if this also represents an interval of time.
-    range: time type
-
-  is supplement:
-    description: >-
-    is_a: node property
-    range: chemical mixture
-
-  trade name:
-    description: >-
-    is_a: node property
-    range: chemical entity
-
-  available from:
-    description: >-
-    is_a: node property
-    multivalued: true
-    range: drug_availability_enum
-
-  is toxic:
-    description: >-
-    is_a: node property
-    multivalued: false
-    range: boolean
-
-  max tolerated dose:
-    description: >-
-      The highest dose of a drug or treatment that does not cause unacceptable side effects.
-      The maximum tolerated dose is determined in clinical trials by testing increasing doses
-      on different groups of people until the highest dose with acceptable side effects is
-      found. Also called MTD.
-    is_a: node property
-    multivalued: false
-    range: string
-
-  animal model available from:
-    description: >-
-    is_a: node property
-    multivalued: true
-    range: disease or phenotypic feature
-
-  highest FDA approval status:
-    description: >-
-      Should be the highest level of FDA approval this chemical entity or device has, regardless of which
-      disease, condition or phenotype it is currently being reviewed to treat.  For specific levels of FDA
-      approval for a specific condition, disease, phenotype, etc., see the association slot, 'FDA approval status.'
-
-  drug regulatory status world wide:
-    aliases: ['max phase']
-    description: >-
-      An agglomeration of drug regulatory status worldwide. Not specific to FDA.
-
-## --------------------
-## PREDICATES/RELATIONS
-## --------------------
-
-  related to:
-    description: >-
-      A relationship that is asserted between two named things
-    domain: named thing
-    range: named thing
-    multivalued: true
-    inherited: true
-    symmetric: true
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    exact_mappings:
-      - skos:relatedMatch
-      - UMLS:related_to
-    broad_mappings:
-      - owl:topObjectProperty
-    narrow_mappings:
-      - SEMMEDDB:compared_with
-      - SEMMEDDB:higher_than
-      - SEMMEDDB:lower_than
-      - BFO:0000054
-      - UBERON_CORE:protects
-      - GOREL:0002005
-      - GOREL:0012006
-      # several of the following terms mapped here by RTX could merit upgrade to new Biolink terms
-      - BTO:related_to
-      - CHEBI:is_conjugate_acid_of
-      - CHEBI:is_conjugate_base_of
-      - CPT:has_add_on_code
-      - CPT:mapped_to
-      - EFO:0006351
-      - FMA:connected_to
-      - FMA:continuous_with
-      - FMA:homonym_of
-      - FMA:related_developmental_entity_of
-      - RO:0002093
-      - RO:0002092
-      - RO:0002084
-      - GOREL:0002005
-      - GOREL:0012006
-      - HCPCS:mapped_to
-      # RTX contributed terms, perhaps belong somewhere else with more precise semantics?
-      - HMDB:disease
-      - HMDB:has_protein_association
-      - IAO:0000136
-      - LOINC:has_answer
-      - LOINC:has_challenge
-      - LOINC:has_evaluation
-      - LOINC:mapped_to
-      - LOINC:mth_has_expanded_form
-      - MESH:RO
-      - MESH:has_mapping_qualifier
-      - MESH:mapped_to
-      - MONDO:disease_shares_features_of
-      - NCIT:disease_may_have_associated_disease
-      - NCIT:human_disease_maps_to_eo_disease
-      - NCIT:is_abnormal_cell_of_disease
-      - NCIT:is_related_to_endogenous_product
-      - UBERON_NONAMESPACE:connected_to
-      - UBERON_NONAMESPACE:innervated_by
-      - NBO-PROPERTY:is_about
-      - RO:0000053 # bearer_of
-      - PATO:reciprocal_of
-      - RO:0000052
-      - RO:0002001
-      - RO:0002002
-      - RO:0002003
-      - RO:0002008
-      - RO:0002134
-      - RO:0002150
-      - RO:0002159
-      - RO:0002176
-      - RO:0002177
-      - RO:0002178
-      - RO:0002179
-      - RO:0002314
-      - RO:0002322
-      # functionally related to
-      - RO:0002328
-      - RO:0002332
-      - RO:0002338
-      - RO:0002339
-      - RO:0002341
-      - RO:0002342
-      - RO:0002344
-      - RO:0002348
-      - RO:0002349
-      - RO:0002356
-      - RO:0002371
-      - RO:0002372
-      - RO:0002373
-      - RO:0002374
-      - RO:0002385
-      - RO:0002387
-      - RO:0002451
-      - RO:0002494
-      - RO:0002495
-      - RO:0002568
-      - RO:0002573
-      - RO:0004026
-      - RO:0004027
-      - RO:0009001
-      - RO:0009004
-      - RXNORM:has_form
-      - RXNORM:reformulated_to
-      - SNOMED:has_associated_morphology
-      - SNOMED:has_associated_procedure
-      - SNOMED:has_direct_morphology
-      - SNOMED:has_disposition
-      - SNOMED:has_indirect_morphology
-      - SNOMED:has_modification
-      - SNOMED:has_procedure_morphology
-      - SNOMED:has_specimen_source_morphology
-      - SNOMED:inheres_in
-      - SNOMED:is_interpreted_by
-      - SNOMED:relative_to_part_of
-      - UBERON:synapsed_by
-      - UMLS:RO
-      - UMLS:RQ
-      - UMLS:class_code_classified_by
-      - UMLS:exhibited_by
-      - UMLS:has_context_binding
-      - UMLS:has_form
-      - UMLS:has_mapping_qualifier
-      - UMLS:larger_than
-      - UMLS:mapped_to
-      - UMLS:owning_section_of
-
-  related to at concept level:
-    is_a: related to
-    description: >-
-      Represents a relationship held between terminology components that describe the conceptual model of a domain.
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    symmetric: true
-
-  related to at instance level:
-    is_a: related to
-    description: >-
-      Represents a relationship held between two instances of a data classes.  Much like an assertion component,
-      in an ABox, these represent facts associated with the conceptual model.
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    symmetric: true
-
-  associated with:
-    is_a: related to at instance level
-    description: >-
-      Expresses a relationship between two named things where the relationship is typically generated statistically
-      (though not in all cases), and is weaker than its child, 'correlated with', but stronger than its parent,
-      'related to'.
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    symmetric: true
-    domain: named thing
-    range: named thing
-    narrow_mappings:
-      - RO:0004029
-      - SNOMEDCT:47429007
-
-  superclass of:
-    is_a: related to at concept level
-    description: >-
-      holds between two classes where the domain class is a super class of the range class
-    domain: ontology class
-    range: ontology class
-    multivalued: True
-    inverse: subclass of
-    in_subset:
-      - translator_minimal
-    exact_mappings:
-      - WIKIDATA:Q66088480
-      - CHEMBL.MECHANISM:superset_of
-      - GO:inverse_isa
-      - MESH:inverse_isa
-      - RXNORM:inverse_isa
-      - VANDF:inverse_isa
-    narrow_mappings:
-      - NCIT:cdrh_parent_of
-      - NCIT:ctcae_5_parent_of
-      - NCIT:subset_includes_concept
-      - OMIM:has_manifestation
-      - SNOMED:has_basic_dose_form
-      - UMLS:RB
-
-  subclass of:
-    is_a: related to at concept level
-    description: >-
-      holds between two classes where the domain class is a specialization of the range class
-    domain: ontology class
-    range: ontology class
-    multivalued: True
-    in_subset:
-      - translator_minimal
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    close_mappings:
-      # RTX
-      - LOINC:class_of
-      - LOINC:has_class
-    exact_mappings:
-      - rdfs:subClassOf
-      - SEMMEDDB:IS_A
-      - SEMMEDDB:isa
-      - WIKIDATA_PROPERTY:P279
-      - CHEMBL.MECHANISM:subset_of
-      - GO:isa
-      - MESH:isa
-      - RXNORM:isa
-      - VANDF:isa
-    narrow_mappings:
-      - CHEBI:has_parent_hydride
-      - LOINC:has_archetype
-      - LOINC:has_parent_group
-      - LOINC:is_presence_guidance_for
-      - NCIT:gene_product_has_chemical_classification
-      # RTX mapped terms classes for biomarkers
-      - NCIT:R36
-      - NCIT:R42
-      - NCIT:A16
-      - NCIT:A11
-      - NCIT:A14
-      - NCIT:A3
-      - NDDF:has_dose_form
-      - RXNORM:has_dose_form
-      - RXNORM:has_doseformgroup
-      - SNOMED:entire_anatomy_structure_of
-      - SNOMED:has_dose_form
-      # RTX mapping
-      - rdfs:subPropertyOf
-
-  same as:
-    is_a: exact match
-    description: >-
-      holds between two entities that are considered equivalent to each other
-    in_subset:
-      - translator_minimal
-    symmetric: true
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    close_mappings:
-      # identical class extension with identical sets of individuals
-      - owl:equivalentClass
-    exact_mappings:
-      # identical individual, or identical class concept/meaning
-      - owl:sameAs
-      - skos:exactMatch
-      # Semantic Medline definition: "comparative predicate" where the equivalence could simply be functional
-      # RTX suggests mapping this to proposed new "biolink:close_match" predicate instead
-      #- SEMMEDDB:SAME_AS
-      - WIKIDATA_PROPERTY:P2888
-      - CHEMBL.MECHANISM:equivalent_to
-      - MONDO:equivalentTo
-    narrow_mappings:
-      - DRUGBANK:external-identifier
-
-  close match:
-    is_a: related to at concept level
-    description: >-
-      a list of terms from different schemas or terminology systems that have
-      a semantically similar but not strictly equivalent, broader, or narrower
-      meaning. Such terms often describe the same general concept from
-      different ontological perspectives (e.g. drug as a type of chemical
-      entity versus drug as a type of role borne by a chemical entity).
-    in_subset:
-      - translator_minimal
-    symmetric: true
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    exact_mappings:
-      - skos:closeMatch
-      # Semantic Medline definition: "comparative predicate" where the equivalence could simply be functional
-      - SEMMEDDB:SAME_AS
-      - SEMMEDDB:same_as
-    narrow_mappings:
-      - CHEBI:is_enantiomer_of
-      - CHEBI:is_tautomer_of
-      - MEDDRA:classified_as
-      - OIO:hasDbXref
-      - oboformat:xref
-      - RXNORM:has_quantified_form
-      - UMLS:SY
-
-  exact match:
-    is_a: close match
-    description: >-
-      holds between two entities that have strictly equivalent
-      meanings, with a high degree of confidence
-    in_subset:
-      - translator_minimal
-    symmetric: true
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    exact_mappings:
-      - skos:exactMatch
-      - WIKIDATA:Q39893449
-      - WIKIDATA:P2888
-
-  broad match:
-    description: >-
-      a list of terms from different schemas or terminology systems
-      that have a broader, more general meaning. Broader terms are
-      typically shown as parents in a hierarchy or tree.
-    is_a: related to at concept level
-    in_subset:
-      - translator_minimal
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    exact_mappings:
-      - skos:broadMatch
-      - WIKIDATA:Q39894595
-
-  narrow match:
-    description: >-
-      a list of terms from different schemas or terminology systems
-      that have a narrower, more specific meaning. Narrower terms are
-      typically shown as children in a hierarchy or tree.
-    is_a: related to at concept level
-    inverse: broad match
-    in_subset:
-      - translator_minimal
-    exact_mappings:
-      - skos:narrowMatch
-      - WIKIDATA:Q39893967
-
-  opposite of:
-    description: >-
-      x is the opposite of y if there exists some distance metric M, and there exists
-      no z such as M(x,z) <= M(x,y) or M(y,z) <= M(y,x). (This description is from RO. Needs to be rephrased).
-    is_a: related to at instance level
-    symmetric: true
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    exact_mappings:
-      - RO:0002604
-    see_also:
-      - https://doi.org/10.1101/108977
-      - https://github.com/biolink/biolink-model/issues/657
-
-  has real world evidence of association with:
-    is_a: related to at instance level
-    description: >-
-      this means that the assertion was derived by applying statistical and machine learning models to
-      clinical data such as EHR data, survey data, etc
-    in_subset:
-      - translator_minimal
-    symmetric: true
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-
-  active in:
-    is_a: related to at instance level
-    domain: gene or gene product
-    range: cellular component
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    exact_mappings:
-      - RO:0002432
-
-  acts upstream of:
-    is_a: related to at instance level
-    domain: gene or gene product
-    range: biological process
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    exact_mappings:
-      - RO:0002263
-
-  has upstream actor:
-    is_a: related to at instance level
-    inverse: acts upstream of
-    domain: biological process
-    range: gene or gene product
-
-  acts upstream of positive effect:
-    is_a: acts upstream of
-    domain: gene or gene product
-    range: biological process
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    exact_mappings:
-      - RO:0004034
-
-  has positive upstream actor:
-    is_a: has upstream actor
-    inverse: acts upstream of positive effect
-    domain: biological process
-    range: gene or gene product
-
-  acts upstream of negative effect:
-    is_a: acts upstream of
-    domain: gene or gene product
-    range: biological process
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    exact_mappings:
-      - RO:0004035
-
-  has negative upstream actor:
-    is_a: has upstream actor
-    inverse: acts upstream of negative effect
-    domain: biological process
-    range: gene or gene product
-
-  acts upstream of or within:
-    is_a: acts upstream of
-    domain: gene or gene product
-    range: biological process
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    exact_mappings:
-      - RO:0004032
-
-  has upstream or within actor:
-    is_a: has upstream actor
-    inverse: acts upstream of or within
-    domain: biological process
-    range: gene or gene product
-
-  acts upstream of or within positive effect:
-    is_a: acts upstream of
-    domain: gene or gene product
-    range: biological process
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    exact_mappings:
-      - RO:0002264
-
-  has positive upstream or within actor:
-    is_a: has upstream or within actor
-    inverse: acts upstream of or within positive effect
-    domain: biological process
-    range: gene or gene product
-
-  acts upstream of or within negative effect:
-    is_a: acts upstream of
-    domain: gene or gene product
-    range: biological process
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    exact_mappings:
-      - RO:0004033
-
-  has negative upstream or within actor:
-    is_a: has upstream or within actor
-    inverse: acts upstream of or within negative effect
-    domain: biological process
-    range: gene or gene product
-
-    ## Publication related predicates
-  mentions:
-    description: >-
-      refers to is a relation between one information content entity and the named thing
-      that it makes reference to.
-    is_a: related to at instance level
-    exact_mappings:
-      - IAO:0000142
-    narrow_mappings:
-      - SIO:000628
-
-  mentioned by:
-    description: >-
-      refers to is a relation between one named thing and the information content entity
-      that it makes reference to.
-    is_a: related to at instance level
-    inverse: mentions
-
-  ## Publication related predicates
-
-  contributor:
-    is_a: related to at instance level
-    domain: information content entity
-    range: agent
-    comments:
-      - This is a grouping for predicates relating entities to their associated contributors realizing them
-    abstract: true
-    exact_mappings:
-      - dct:contributor
-
-  provider:
-    is_a: contributor
-    description: >-
-      person, group, organization or project that provides a piece of information (e.g. a knowledge association).
-
-  publisher:
-    is_a: contributor
-    domain: publication
-    description: >-
-      organization or person responsible for publishing books, periodicals, podcasts, games or software.
-      Note that in the case of publications which have a containing "published in" node property, the publisher
-      association may not be attached directly to the embedded child publication, but only made in between the
-      parent's publication node and the publisher agent of the encompassing publication
-      (e.g. only from the Journal referenced by the 'published_in' property of an journal article Publication node).
-    exact_mappings:
-      - dct:publisher
-      - WIKIDATA_PROPERTY:P123
-
-  editor:
-    is_a: contributor
-    domain: publication
-    description: >-
-      editor of a compiled work such as a book or a periodical (newspaper or an academic journal).
-      Note that in the case of publications which have a containing "published in" node property, the editor
-      association may not be attached directly to the embedded child publication, but only made in between the
-      parent's publication node and the editorial agent of the encompassing publication
-      (e.g. only from the Book referenced by the 'published_in' property of a book chapter Publication node).
-    exact_mappings:
-      - WIKIDATA_PROPERTY:P98
-
-  author:
-    is_a: contributor
-    domain: publication
-    description: >-
-      an instance of one (co-)creator primarily responsible for a written work
-    exact_mappings:
-      - dct:creator
-      - WIKIDATA_PROPERTY:P50
-
-  ## end of Publication related predicates
-
-  interacts with:
-    domain: named thing
-    range: named thing
-    description: >-
-      holds between any two entities that directly or indirectly interact with each other
-    is_a: related to at instance level
-    in_subset:
-      - translator_minimal
-    symmetric: true
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    exact_mappings:
-      - RO:0002434
-    narrow_mappings:
-      # RO terms RTX mapped to 'biolink:related_to' but which imply a chemical interaction
-      - RO:0002103
-      - RO:0002120
-      - RO:0002130
-      - SEMMEDDB:complicates
-
-  physically interacts with:
-    is_a: interacts with
-    description: >-
-      holds between two entities that make physical contact as part of some interaction
-    in_subset:
-      - translator_minimal
-    symmetric: true
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    exact_mappings:
-      - WIKIDATA_PROPERTY:P129
-    close_mappings:
-      # Agents of some interaction but not the relationship of interaction
-      # These RTX mapped terms may need to be reclassified to more meaningful terms (perhaps not yet created)
-      - CHEMBL.MECHANISM:binding_agent
-      - CHEMBL.MECHANISM:chelating_agent
-      - CHEMBL.MECHANISM:cross-linking_agent
-      - CHEMBL.MECHANISM:oxidative_enzyme
-      - CHEMBL.MECHANISM:sequestering_agent
-      - CHEMBL.MECHANISM:substrate
-      - DRUGBANK:target
-    narrow_mappings:
-      # Defined more narrowly as "substance interaction", thus specific applies to a subclass entities?
-      - SEMMEDDB:INTERACTS_WITH
-      - SEMMEDDB:interacts_with
-      - DRUGBANK:drug-interaction
-      - FMA:adheres_to
-      - NCIT:A7
-      - PR:non-covalently_bound_to
-
-  chemically interacts with:
-    is_a: physically interacts with
-    domain: chemical entity
-    range: chemical entity
-    in_subset:
-      - translator_minimal
-    symmetric: true
-
-  molecularly interacts with:
-    is_a: physically interacts with
-    aliases: ['targets']
-    domain: molecular entity
-    range: molecular entity
-    in_subset:
-      - translator_minimal
-    symmetric: true
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    related_mappings:
-      - DGIdb:antibody
-    exact_mappings:
-      - RO:0002436
-
-  genetically interacts with:
-    is_a: interacts with
-    description: >-
-      holds between two genes whose phenotypic effects are dependent on each
-      other in some way - such that their combined phenotypic effects are the
-      result of some interaction between the activity of their gene products.
-      Examples include epistasis and synthetic lethality.
-    domain: gene
-    range: gene
-    in_subset:
-      - translator_minimal
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    symmetric: true
-    exact_mappings:
-      - RO:0002435
-
-  affects:
-    is_a: related to at instance level
-    description: >-
-      describes an entity that has a direct affect on the state or quality
-      of another existing entity. Use of the 'affects' predicate implies that
-      the affected entity already exists, unlike predicates such as
-      'affects risk for' and 'prevents, where the outcome is something
-      that may or may not come to be.
-    in_subset:
-      - translator_minimal
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    related_mappings:
-      # Contributed by RTX. Seems possible that a new predicate "biolink:in_pathway" could be justified?
-      - DRUGBANK:pathway
-    exact_mappings:
-      - SEMMEDDB:AFFECTS
-      - SEMMEDDB:affects
-      - DGIdb:affects
-    narrow_mappings:
-      - SEMMEDDB:administered_to
-      - CTD:prediction_hypothesis
-      - GOREL:0001006
-      - CTD:inferred
-      - UPHENO:0000001
-      - RO:0002263
-      - RO:0002264
-      - NCIT:R158
-      - NCIT:R160
-      - NCIT:R30
-      - NCIT:R150
-      - NCIT:R72
-      - NCIT:R146
-      - NCIT:R124
-      - NCIT:R173
-      - NCIT:R100
-      - NCIT:R102
-      - NCIT:R101
-      - NCIT:R113
-      - NCIT:R23
-      - NCIT:R25
-      - NCIT:gene_mapped_to_disease
-      - NCIT:R133
-      - RO:0002343
-      - RO:0002355
-      - RO:0002591
-      - RO:0002592
-      - RO:0012003
-      - SNOMED:has_pathological_process
-
-  affected by:
-    is_a: related to at instance level
-    description: >-
-      describes an entity of which the state or quality is affected by
-      another existing entity.
-    inverse: affects
-
-  associated with sensitivity to:
-    is_a: associated with
-    description: >-
-      A relation that holds between a named thing and a chemical
-      that specifies that the change in the named
-      thing is found to be associated with the degree of sensitivity to treatment by the chemical.
-    domain: named thing
-    range: chemical entity
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    broad_mappings:
-      - PATO:0000085 # sensitivity toward
-    narrow_mappings:
-      - SNOMEDCT:418038007 # propensity to adverse reaction
-
-  sensitivity associated with:
-    is_a: associated with
-    inverse: associated with sensitivity to
-    range: named thing
-    domain: chemical entity
-
-  associated with resistance to:
-    is_a: associated with
-    description: >-
-      A relation that holds between a named thing and a chemical
-      that specifies that the change in the named
-      thing is found to be associated with the degree of resistance to treatment by the chemical.
-    domain: named thing
-    range: chemical entity
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-
-  resistance associated with:
-    is_a: associated with
-    inverse: associated with resistance to
-    range: named thing
-    domain: chemical entity
-
-  diagnoses:
-    is_a: related to at instance level
-    description: >-
-      a relationship that identifies the nature of (an illness or other problem) by examination of the symptoms.
-    domain: chemical or drug or treatment
-    range: disease or phenotypic feature
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    close_mappings:
-      - NCIT:C15220 # diagnosis
-      - SIO:001331 # diagnosis
-    exact_mappings:
-      - DrugCentral:5271
-
-  is diagnosed by:
-    is_a: related to at instance level
-    inverse: diagnoses
-    range: chemical or drug or treatment
-    domain: disease or phenotypic feature
-
-  increases amount or activity of:
-    is_a: related to at instance level
-    mixin: true
-    description: >-
-      A grouping mixin to help with searching for all the predicates that increase the amount
-      or activity of the object.
-
-  decreases amount or activity of:
-    is_a: related to at instance level
-    mixin: true
-    description: >-
-      A grouping mixin to help with searching for all the predicates that decrease the amount
-      or activity of the object.
-
-  ## role mixins for use in tagging corresponding role predicates
-
-  chemical role mixin:
-    description: >-
-      A role played by the chemical entity or part thereof within a chemical context.
-    mixin: true
-    exact_mappings:
-      - CHEBI:51086
-
-  biological role mixin:
-    description: >-
-      A role played by the chemical entity or part thereof within a biological context.
-    mixin: true
-    narrow_mappings:
-      - CHEBI:24432
-
-  affects abundance of:
-    description: >-
-      holds between two chemical or gene/gene product entities where the action or effect of one changes the amount of the
-      other within a system of interest
-    is_a: affects
-    in_subset:
-      - translator_minimal
-    domain: chemical entity or gene or gene product
-    range: chemical entity or gene or gene product
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-
-  abundance affected by:
-    is_a: affected by
-    inverse: affects abundance of
-    domain: chemical entity or gene or gene product
-    range: chemical entity or gene or gene product
-
-  increases abundance of:
-    description: >-
-      holds between two chemical or gene/gene product entities where the action or effect of one increases the amount of the other within a system of interest
-    is_a: affects abundance of
-    in_subset:
-      - translator_minimal
-    mixins:
-      - increases amount or activity of
-    domain: chemical entity or gene or gene product
-    range: chemical entity or gene or gene product
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    related_mappings:
-      - UBERGRAPH:is_increase_of
-
-  abundance increased by:
-    is_a: abundance affected by
-    inverse: increases abundance of
-    domain: chemical entity or gene or gene product
-    range: chemical entity or gene or gene product
-
-  decreases abundance of:
-    description: >-
-      holds between two chemical or gene/gene product where the action or effect of one
-      decreases the amount of the other within a system of interest
-    is_a: affects abundance of
-    in_subset:
-      - translator_minimal
-    domain: chemical entity or gene or gene product
-    range: chemical entity or gene or gene product
-    mixins:
-      - decreases amount or activity of
-    annotations:
-      - tag: biolink:canonical_predicate
-        value: true
-    related_mappings:
-      - UBERGRAPH:is_decrease_of
-
-  abundance decreased by:
-    is_a: abundance affected by
-    inverse: decreases abundance of
-    domain: chemical entity or gene or gene product
-    range: chemical entity or gene or gene product
-
-  increases activity of:
-    description: >-
-      holds between two chemical or gene/gene product where the action or effect of one
-      increases the activity of the other within a system of interest
-    is_a: affects activity of
-    in_subset:
-      - translator_minimal
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    domain: chemical entity or gene or gene product
-    range: chemical entity or gene or gene product
-    mixins:
-      - increases amount or activity of
-    related_mappings:
-      - GAMMA:ec50
-      - GAMMA:ac50
-    narrow_mappings:
-      - GAMMA:activator
-      - GAMMA:partial_agonist
-      - GAMMA:agonist
-      - GAMMA:opener
-      - GAMMA:positive_allosteric_modulator
-      - GAMMA:positive_modulator
-      - GAMMA:inducer
-      - GAMMA:potentiator
-      - GAMMA:stimulator
-      - CHEMBL.MECHANISM:agonist
-      - CHEMBL.MECHANISM:opener
-      - CHEMBL.MECHANISM:partial_agonist
-      - CHEMBL.MECHANISM:positive_allosteric_modulator
-      - CHEMBL.MECHANISM:positive_modulator
-      - DGIdb:agonist
-      - DGIdb:partial_agonist
-      - DGIdb:inducer
-      - DGIdb:positive_allosteric_modulator
-      - DGIdb:stimulator
-
-  affects activity of:
-    description: >-
-      holds between two chemical or gene/gene product where the action or effect of one changes the activity of the
-      other within a system of interest
-    is_a: affects
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    in_subset:
-      - translator_minimal
-    domain: chemical entity or gene or gene product
-    range: chemical entity or gene or gene product
-    narrow_mappings:
-      - GAMMA:allosteric_modulator
-      - GAMMA:modulator
-      - GAMMA:regulator
-      - DGIdb:modulator
-      - DGIdb:allosteric_modulator
-
-  activity affected by:
-    description: >-
-      holds between two chemical or gene/gene product where the action or effect of one is changed by the
-      activity of the other within a system of interest
-    is_a: affected by
-    domain: chemical entity or gene or gene product
-    range: chemical entity or gene or gene product
-    inverse: affects activity of
-
-  activity increased by:
-    is_a: activity affected by
-    in_subset:
-      - translator_minimal
-    domain: chemical entity or gene or gene product
-    range: chemical entity or gene or gene product
-    inverse: increases activity of
-
-  decreases activity of:
-    description: >-
-      holds between two chemical or gene/gene product where the action or effect of one decreases the
-      activity of the other within a system of interest
-    is_a: affects activity of
-    in_subset:
-      - translator_minimal
-    domain: chemical entity or gene or gene product
-    range: chemical entity or gene or gene product
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    mixins:
-      - decreases amount or activity of
-    related_mappings:
-      - GAMMA:ic50
-      - GAMMA:ki
-      - DGIdb:vaccine
-    narrow_mappings:
-      - GAMMA:allosteric_antagonist
-      - GAMMA:partial_antagonist
-      - GAMMA:antagonist
-      - GAMMA:weak_inhibitor
-      - GAMMA:inhibitor
-      - GAMMA:channel_blocker
-      - GAMMA:gating_inhibitor
-      - GAMMA:blocker
-      - GAMMA:inverse_agonist
-      - GAMMA:inactivator
-      - GAMMA:downregulator
-      - GAMMA:negative_modulator
-      - GAMMA:negative_allosteric_modulator
-      - GAMMA:inhibitory_allosteric_modulator
-      - GAMMA:aggregation_inhibitor
-      - GAMMA:conversion_inhibitor
-      - GAMMA:suppressor
-      - CHEMBL.MECHANISM:antagonist
-      - CHEMBL.MECHANISM:allosteric_antagonist
-      - CHEMBL.MECHANISM:inverse_agonist
-      - DGIdb:antagonist
-      - DGIdb:blocker
-      - DGIdb:channel_blocker
-      - DGIdb:gating_inhibitor
-      - DGIdb:inhibitor
-      - DGIdb:negative_modulator
-      - DGIdb:inhibitory_allosteric_modulator
-      - DGIdb:inverse_agonist
-
-  activity decreased by:
-    is_a: activity affected by
-    in_subset:
-      - translator_minimal
-    domain: chemical entity or gene or gene product
-    range: chemical entity or gene or gene product
-    inverse: decreases activity of
-
-
-  affects expression of:
-    description: >-
-      holds between a named thing (most often a chemical or gene/gene product, but can also be used to link an
-      environmental affect on expression) and a nucleic acid entity where the action or effect of one changes the
-      level of expression of the other within a system of interest
-    is_a: affects
-    in_subset:
-      - translator_minimal
-    domain: named thing
-    range: nucleic acid entity
-
-  expression affected by:
-    is_a: affected by
-    in_subset:
-      - translator_minimal
-    domain: nucleic acid entity
-    range: named thing
-    inverse: affects expression of
-
-  increases expression of:
-    description: >-
-      holds between a chemical or gene/gene product entity and a nucleic acid entity
-      where the action or effect of one increases the level of expression of the
-      other within a system of interest
-    is_a: affects expression of
-    in_subset:
-      - translator_minimal
-    domain: named thing
-    range: nucleic acid entity
-    mixins:
-      - increases amount or activity of
-    close_mappings:
-      # Agent of the action or effect, not the relationship itself
-      - CHEMBL.MECHANISM:releasing_agent
-    exact_mappings:
-      - RO:0003003
-
-  expression increased by:
-    is_a: expression affected by
-    in_subset:
-      - translator_minimal
-    domain: nucleic acid entity
-    range: named thing
-    inverse: increases expression of
-
-  decreases expression of:
-    description: >-
-      holds between a chemical or gene/gene product entity and a nucleic acid entity where the action or effect of one decreases the level of expression of the
-      other within a system of interest
-    is_a: affects expression of
-    in_subset:
-      - translator_minimal
-    domain: named thing
-    range: nucleic acid entity
-    mixins:
-      - decreases amount or activity of
-    related_mappings:
-      - DGIdb:antisense
-      - DGIdb:antisense_oligonucleotide
-    exact_mappings:
-      - RO:0003002
-    narrow_mappings:
-      - CHEMBL.MECHANISM:antisense_inhibitor
-
-  expression decreased by:
-    is_a: expression affected by
-    in_subset:
-      - translator_minimal
-    domain: nucleic acid entity
-    range: named thing
-    inverse: decreases expression of
-
-  affects folding of:
-    description: >-
-      holds between a chemical or gene/gene product entity and a nucleic acid entity where the action or effect of one changes the rate
-      or quality of folding of the other
-    is_a: affects
-    in_subset:
-      - translator_minimal
-    domain: chemical entity or gene or gene product
-    range: nucleic acid entity
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-
-  folding affected by:
-    is_a: affected by
-    inverse: affects folding of
-    domain: nucleic acid entity
-    range: chemical entity or gene or gene product
-
-  increases folding of:
-    description: >-
-      holds between a chemical or gene/gene product entity and a nucleic acid entity where the action or effect of one
-      increases the rate or quality of folding of the other
-    is_a: affects folding of
-    in_subset:
-      - translator_minimal
-    domain: chemical entity or gene or gene product
-    range: nucleic acid entity
-    mixins:
-      - increases amount or activity of
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-
-  folding increased by:
-    is_a: folding affected by
-    inverse: increases folding of
-    domain: nucleic acid entity
-    range: chemical entity or gene or gene product
-
-  decreases folding of:
-    description: >-
-      holds between a chemical or gene or gene product entity and a
-      nucleic acid entity where the action or effect of one
-      decreases the rate or quality of folding of the other
-    is_a: affects folding of
-    in_subset:
-      - translator_minimal
-    domain: chemical entity or gene or gene product
-    range: nucleic acid entity
-    mixins:
-      - decreases amount or activity of
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-
-  folding decreased by:
-    is_a: folding affected by
-    inverse: decreases folding of
-    domain: nucleic acid entity
-    range: chemical entity or gene or gene product
-
-  affects localization of:
-    description: >-
-      holds between two chemical or gene/gene product entities where the action or effect of one changes the
-      localization of the other within a system of interest
-    is_a: affects
-    in_subset:
-      - translator_minimal
-    domain: chemical entity or gene or gene product
-    range: chemical entity or gene or gene product
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    related_mappings:
-      - GAMMA:storage
-    exact_mappings:
-      - GOREL:0002003
-
-  localization affected by:
-    is_a: affected by
-    in_subset:
-      - translator_minimal
-    domain: chemical entity or gene or gene product
-    range: chemical entity or gene or gene product
-    inverse: affects localization of
-
-  increases localization of:
-    description: >-
-      holds between two chemical or gene/gene product entities where the action or effect of one increases the proper
-      localization of the other within a system of interest
-    is_a: affects localization of
-    in_subset:
-      - translator_minimal
-    domain: chemical entity or gene or gene product
-    range: chemical entity or gene or gene product
-    mixins:
-      - increases amount or activity of
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-
-  localization increased by:
-    is_a: localization affected by
-    in_subset:
-      - translator_minimal
-    domain: chemical entity or gene or gene product
-    range: chemical entity or gene or gene product
-    inverse: increases localization of
-
-  decreases localization of:
-    description: >-
-      holds between two chemical or gene/gene product entities where the action or effect of one decreases the proper localization of the other within a system of interest
-    is_a: affects localization of
-    in_subset:
-      - translator_minimal
-    domain: chemical entity or gene or gene product
-    range: chemical entity or gene or gene product
-    mixins:
-      - decreases amount or activity of
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-
-  localization decreased by:
-    is_a: localization affected by
-    in_subset:
-      - translator_minimal
-    domain: chemical entity or gene or gene product
-    range: chemical entity or gene or gene product
-    inverse: decreases localization of
-
-  affects metabolic processing of:
-    description: >-
-      holds between two chemical or gene/gene product entities  where the action or effect of one impacts the
-      metabolic processing of the other within a system of interest
-    is_a: affects
-    domain: chemical entity or gene or gene product
-    range: chemical entity or gene or gene product
-    in_subset:
-      - translator_minimal
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    related_mappings:
-      - GAMMA:catalytic_activity
-
-  metabolic processing affected by:
-    is_a: affected by
-    in_subset:
-      - translator_minimal
-    domain: chemical entity or gene or gene product
-    range: chemical entity or gene or gene product
-    inverse: affects metabolic processing of
-
-  increases metabolic processing of:
-    description: >-
-      holds between two chemical or gene/gene product entities  where the action or effect of one increases the rate of
-      metabolic processing of the other within a system of interest
-    is_a: affects metabolic processing of
-    in_subset:
-      - translator_minimal
-    domain: chemical entity or gene or gene product
-    range: chemical entity or gene or gene product
-    mixins:
-      - increases amount or activity of
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    narrow_mappings:
-      - NCIT:enzyme_metabolizes_chemical_or_drug
-
-  metabolic processing increased by:
-    is_a: metabolic processing affected by
-    in_subset:
-      - translator_minimal
-    domain: chemical entity or gene or gene product
-    range: chemical entity or gene or gene product
-    inverse: increases metabolic processing of
-
-  decreases metabolic processing of:
-    description: >-
-      holds between two chemical or gene/gene product entities  where the action or effect of one decreases the rate of
-      metabolic processing of the other within a system of interest
-    is_a: affects metabolic processing of
-    in_subset:
-      - translator_minimal
-    domain: chemical entity or gene or gene product
-    range: chemical entity or gene or gene product
-    mixins:
-      - decreases amount or activity of
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-
-  metabolic processing decreased by:
-    is_a: metabolic processing affected by
-    in_subset:
-      - translator_minimal
-    domain: chemical entity or gene or gene product
-    range: chemical entity or gene or gene product
-    inverse: decreases metabolic processing of
-
-  affects molecular modification of:
-    description: >-
-      holds between two chemical or gene/gene product entities  where the action or effect of one leads changes in the molecular
-      modification(s) of the other (e.g. via post-translational modifications of proteins such as the addition of
-      phosphoryl group, or via redox reaction that adds or subtracts electrons)
-    is_a: affects
-    in_subset:
-      - translator_minimal
-    domain: chemical entity or gene or gene product
-    range: chemical entity or gene or gene product
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    narrow_mappings:
-      - CTD:affects_acetylation
-      - CTD:affects_acylation
-      - CTD:affects_alkylation
-      - CTD:affects_amination
-      - CTD:affects_carbamoylation
-      - CTD:affects_ethylation
-      - CTD:affects_glutathionylation
-      - CTD:affects_glycation
-      - CTD:affects_glycosylation
-      - CTD:affects_glucuronidation
-      - CTD:affects_N-linked_glycosylation
-      - CTD:affects_O-linked_glycosylation
-      - CTD:affects_hydroxylation
-      - CTD:affects_lipidation
-      - CTD:affects_farnesylation
-      - CTD:affects_geranoylation
-      - CTD:affects_myristoylation
-      - CTD:affects_palmitoylation
-      - CTD:affects_prenylation
-      - CTD:affects_methylation
-      - CTD:affects_nitrosation
-      - CTD:affects_nucleotidylation
-      - CTD:affects_phosphorylation
-      - CTD:affects_ribosylation
-      - CTD:affects_ADP-ribosylation
-      - CTD:affects_sulfation
-      - CTD:affects_sumoylation
-      - CTD:affects_ubiquitination
-      - CTD:affects_oxidation
-      - CTD:affects_reduction
-      - CTD:affects_carboxylation
-
-  molecular modification affected by:
-    is_a: affected by
-    in_subset:
-      - translator_minimal
-    domain: chemical entity or gene or gene product
-    range: chemical entity or gene or gene product
-    inverse: affects molecular modification of
-
-  increases molecular modification of:
-    description: >-
-      holds between two chemical or gene/gene product entities  where the action or effect of one leads to
-      increased molecular modification(s) of the other (e.g. via post-translational modifications of
-      proteins such as the addition of phosphoryl group, or via redox reaction that adds or subtracts electrons)
-    is_a: affects molecular modification of
-    in_subset:
-      - translator_minimal
-    domain: chemical entity or gene or gene product
-    range: chemical entity or gene or gene product
-    mixins:
-      - increases amount or activity of
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    narrow_mappings:
-      - CTD:increases_acetylation
-      - CTD:increases_acylation
-      - CTD:increases_alkylation
-      - CTD:increases_amination
-      - CTD:increases_carbamoylation
-      - CTD:increases_ethylation
-      - CTD:increases_glutathionylation
-      - CTD:increases_glycation
-      - CTD:increases_glycosylation
-      - CTD:increases_glucuronidation
-      - CTD:increases_N-linked_glycosylation
-      - CTD:increases_O-linked_glycosylation
-      - CTD:increases_hydroxylation
-      - CTD:increases_lipidation
-      - CTD:increases_farnesylation
-      - CTD:increases_geranoylation
-      - CTD:increases_myristoylation
-      - CTD:increases_palmitoylation
-      - CTD:increases_prenylation
-      - CTD:increases_methylation
-      - CTD:increases_nitrosation
-      - CTD:increases_nucleotidylation
-      - CTD:increases_phosphorylation
-      - CTD:increases_ribosylation
-      - CTD:increases_ADP-ribosylation
-      - CTD:increases_sulfation
-      - CTD:increases_sumoylation
-      - CTD:increases_ubiquitination
-      - CTD:increases_oxidation
-      - CTD:increases_reduction
-      - CTD:increases_carboxylation
-      - GAMMA:acetylation
-      - GAMMA:oxidizer
-
-  molecular modification increased by:
-    is_a: molecular modification affected by
-    in_subset:
-      - translator_minimal
-    domain: chemical entity or gene or gene product
-    range: chemical entity or gene or gene product
-    inverse: increases molecular modification of
-
-  decreases molecular modification of:
-    description: >-
-      holds between two chemical entities  where the action or effect of one leads to
-      decreased molecular modification(s) of the other (e.g. via post-translational modifications of
-      proteins such as the addition of phosphoryl group, or via redox reaction that adds or subtracts electrons)
-    is_a: affects molecular modification of
-    in_subset:
-      - translator_minimal
-    domain: chemical entity or gene or gene product
-    range: chemical entity or gene or gene product
-    mixins:
-      - decreases amount or activity of
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    narrow_mappings:
-      - CTD:decreases_acetylation
-      - CTD:decreases_acylation
-      - CTD:decreases_alkylation
-      - CTD:decreases_amination
-      - CTD:decreases_carbamoylation
-      - CTD:decreases_ethylation
-      - CTD:decreases_glutathionylation
-      - CTD:decreases_glycation
-      - CTD:decreases_glycosylation
-      - CTD:decreases_glucuronidation
-      - CTD:decreases_N-linked_glycosylation
-      - CTD:decreases_O-linked_glycosylation
-      - CTD:decreases_hydroxylation
-      - CTD:decreases_lipidation
-      - CTD:decreases_farnesylation
-      - CTD:decreases_geranoylation
-      - CTD:decreases_myristoylation
-      - CTD:decreases_palmitoylation
-      - CTD:decreases_prenylation
-      - CTD:decreases_methylation
-      - CTD:decreases_nitrosation
-      - CTD:decreases_nucleotidylation
-      - CTD:decreases_phosphorylation
-      - CTD:decreases_ribosylation
-      - CTD:decreases_ADP-ribosylation
-      - CTD:decreases_sulfation
-      - CTD:decreases_sumoylation
-      - CTD:decreases_ubiquitination
-      - CTD:decreases_oxidation
-      - CTD:decreases_reduction
-      - CTD:decreases_carboxylation
-      - GAMMA:deoxidizer
-
-  molecular modification decreased by:
-    is_a: molecular modification affected by
-    in_subset:
-      - translator_minimal
-    domain: chemical entity or gene or gene product
-    range: chemical entity or gene or gene product
-    inverse: decreases molecular modification of
-
-  affects synthesis of:
-    description: >-
-      holds between two chemical entities where the action or effect
-      of one impacts the rate of chemical synthesis of the other
-    is_a: affects
-    domain: chemical entity or gene or gene product
-    range: chemical entity or gene or gene product
-    in_subset:
-      - translator_minimal
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-
-  synthesis affected by:
-    is_a: affected by
-    domain: chemical entity or gene or gene product
-    range: chemical entity or gene or gene product
-    inverse: affects synthesis of
-    in_subset:
-      - translator_minimal
-
-  increases synthesis of:
-    description: >-
-      holds between two chemical entities where the action or effect
-      of one increases the rate of chemical synthesis of the other
-    is_a: affects synthesis of
-    in_subset:
-      - translator_minimal
-    domain: chemical entity or gene or gene product
-    range: chemical entity or gene or gene product
-    mixins:
-      - increases amount or activity of
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-
-  synthesis increased by:
-    is_a: synthesis affected by
-    in_subset:
-      - translator_minimal
-    domain: chemical entity or gene or gene product
-    range: chemical entity or gene or gene product
-    inverse: increases synthesis of
-
-  decreases synthesis of:
-    description: >-
-      holds between two chemical entities where the action or effect
-      of one decreases the rate of chemical synthesis of the other
-    is_a: affects synthesis of
-    domain: chemical entity or gene or gene product
-    range: chemical entity or gene or gene product
-    mixins:
-      - decreases amount or activity of
-    in_subset:
-      - translator_minimal
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    exact_mappings:
-      - GAMMA:inhibition_of_synthesis
-
-  synthesis decreased by:
-    is_a: synthesis affected by
-    in_subset:
-      - translator_minimal
-    domain: chemical entity or gene or gene product
-    range: chemical entity or gene or gene product
-    inverse: decreases synthesis of
-
-  affects degradation of:
-    description: >-
-      holds between two chemical entities where the action or effect of one
-      impacts the rate of degradation of the other within a system of interest,
-      where chemical degradation is defined act or process of simplifying or breaking
-      down a molecule into smaller parts, either naturally or artificially
-      (Oxford English Dictionary, UK, 1995)
-    is_a: affects
-    domain: chemical entity or gene or gene product
-    range: chemical entity or gene or gene product
-    in_subset:
-      - translator_minimal
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    narrow_mappings:
-      - CTD:affects_cleavage
-      - CTD:affects_hydrolysis
-
-  degradation affected by:
-    is_a: affected by
-    in_subset:
-      - translator_minimal
-    domain: chemical entity or gene or gene product
-    range: chemical entity or gene or gene product
-    inverse: affects degradation of
-
-  increases degradation of:
-    description: >-
-      holds between two chemical entities where the action or effect of one
-      increases the rate of degradation of the other within a system of interest
-    is_a: affects degradation of
-    in_subset:
-      - translator_minimal
-    domain: chemical entity or gene or gene product
-    range: chemical entity or gene or gene product
-    mixins:
-      - decreases amount or activity of
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    close_mappings:
-      # terms refer less to the action or effect than the agent of that action or effect
-      - CHEMBL.MECHANISM:degrader
-    narrow_mappings:
-      - CTD:increases_cleavage
-      - CTD:increases_hydrolysis
-      - GOREL:0002004
-
-  degradation increased by:
-    is_a: degradation affected by
-    in_subset:
-      - translator_minimal
-    domain: chemical entity or gene or gene product
-    range: chemical entity or gene or gene product
-    inverse: increases degradation of
-
-  decreases degradation of:
-    description: >-
-      holds between two chemical entities where the action or effect of one
-      decreases the rate of degradation of the other within a system of interest
-    is_a: affects degradation of
-    in_subset:
-      - translator_minimal
-    domain: chemical entity or gene or gene product
-    range: chemical entity or gene or gene product
-    mixins:
-      - increases amount or activity of
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    narrow_mappings:
-      - CTD:decreases_cleavage
-      - CTD:decreases_hydrolysis
-
-  degradation decreased by:
-    is_a: degradation affected by
-    in_subset:
-      - translator_minimal
-    domain: chemical entity or gene or gene product
-    range: chemical entity or gene or gene product
-    inverse: decreases degradation of
-
-  affects mutation rate of:
-    description: >-
-      holds between a chemical entity and a nucleic acid entity where the action or effect of the
-      chemical entity impacts the rate of mutation of the nucleic acid entity within a system of interest
-    is_a: affects
-    domain: chemical entity or gene or gene product
-    range: nucleic acid entity
-    broad_mappings:
-      # Term 'mutagenesis' generally speaks generally of the process of
-      # 'production of genetic mutations':  this term says it is affected
-      # but not specifically how
-    in_subset:
-      - translator_minimal
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-
-  mutation rate affected by:
-    is_a: affected by
-    in_subset:
-      - translator_minimal
-    domain: nucleic acid entity
-    range: chemical entity or gene or gene product
-    inverse: affects mutation rate of
-
-  increases mutation rate of:
-    description: >-
-      holds between a chemical entity and a nucleic acid entity where the action or effect of the
-      chemical entity increases the rate of mutation of the nucleic acid entity within a system of interest
-    is_a: affects mutation rate of
-    in_subset:
-      - translator_minimal
-    domain: chemical entity
-    range: nucleic acid entity
-    mixins:
-      - increases amount or activity of
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    broad_mappings:
-      # See 'affects mutation rate of' above
-      - CTD:increases_mutagenesis
-
-  mutation rate increased by:
-    is_a: mutation rate affected by
-    in_subset:
-      - translator_minimal
-    domain: nucleic acid entity
-    range: chemical entity
-    inverse: increases mutation rate of
-
-  decreases mutation rate of:
-    description: >-
-      holds between a chemical entity and a nucleic acid entity where the action or effect of the
-      chemical entity decreases the rate of mutation of the nucleic acid entity within a system of interest
-    is_a: affects mutation rate of
-    in_subset:
-      - translator_minimal
-    domain: chemical entity
-    range: nucleic acid entity
-    mixins:
-      - decreases amount or activity of
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    broad_mappings:
-      # See 'affects mutation rate of' above
-      - CTD:decreases_mutagenesis
-
-  mutation rate decreased by:
-    is_a: mutation rate affected by
-    in_subset:
-      - translator_minimal
-    domain: nucleic acid entity
-    range: chemical entity
-    inverse: decreases mutation rate of
-
-  # original definition of this predicate used molecular entity which was a
-  affects response to:
-    is_a: affects
-    in_subset:
-      - translator_minimal
-    domain: chemical entity or gene or gene product
-    range: chemical entity or gene or gene product
-    inverse: response affected by
-
-  response affected by:
-    description: >-
-      holds between two chemical entities where the susceptibility of a biological entity or system
-      (e.g. an organism, cell, cellular component, macromolecular machine mixin,
-      biological or pathological process) of one is affected by the action of the other.
-    is_a: affected by
-    in_subset:
-      - translator_minimal
-    domain: chemical entity or gene or gene product
-    range: chemical entity or gene or gene product
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-
-  increases response to:
-    description: >-
-      holds between two chemical entities where the action or effect of one
-      increases the susceptibility of a biological entity or system (e.g. an
-      organism, cell, cellular component, macromolecular machine mixin, biological
-      or pathological process) to the other
-    is_a: affects response to
-    in_subset:
-      - translator_minimal
-    domain: chemical entity or gene or gene product
-    range: chemical entity or gene or gene product
-    mixins:
-      - increases amount or activity of
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-
-  response increased by:
-    is_a: response affected by
-    in_subset:
-      - translator_minimal
-    domain: chemical entity or gene or gene product
-    range: chemical entity or gene or gene product
-    inverse: increases response to
-
-  decreases response to:
-    description: >-
-      holds between two chemical entities where the action or effect of one
-      decreases the susceptibility of a biological entity or system (e.g. an
-      organism, cell, cellular component, macromolecular machine mixin, biological
-      or pathological process) to the other
-    is_a: affects response to
-    in_subset:
-      - translator_minimal
-    domain: chemical entity or gene or gene product
-    range: chemical entity or gene or gene product
-    mixins:
-      - decreases amount or activity of
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    narrow_mappings:
-      - CTD:decreases_response_to_substance
-      - GAMMA:desensitize_the_target
-
-  response decreased by:
-    is_a: response affected by
-    in_subset:
-      - translator_minimal
-    domain: chemical entity or gene or gene product
-    range: chemical entity or gene or gene product
-    inverse: decreases response to
-
-  affects splicing of:
-    description: >-
-      holds between a chemical entity and an mRNA where the action or effect
-      of the chemical entity impacts the splicing of the mRNA
-    is_a: affects
-    in_subset:
-      - translator_minimal
-    domain: chemical entity or gene or gene product
-    range: transcript
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    broad_mappings:
-      - CTD:affects_splicing_of
-
-  splicing affected by:
-    is_a: affected by
-    in_subset:
-      - translator_minimal
-    domain: transcript
-    range: chemical entity or gene or gene product
-    inverse: affects splicing of
-
-  increases splicing of:
-    description: >-
-      holds between a chemical entity and an mRNA where the action or effect
-      of the chemical entity increases the proper splicing of the mRNA
-    is_a: affects splicing of
-    in_subset:
-      - translator_minimal
-    domain: chemical entity or gene or gene product
-    range: transcript
-    mixins:
-      - increases amount or activity of
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    broad_mappings:
-      - CTD:increases_splicing_of
-
-  splicing increased by:
-    is_a: splicing affected by
-    in_subset:
-      - translator_minimal
-    domain: transcript
-    range: chemical entity or gene or gene product
-    inverse: increases splicing of
-
-  decreases splicing of:
-    description: >-
-      holds between a chemical entity and an mRNA where the action or
-      effect of the chemical entity decreases the proper splicing of the mRNA
-    is_a: affects splicing of
-    in_subset:
-      - translator_minimal
-    domain: chemical entity or gene or gene product
-    range: transcript
-    mixins:
-      - decreases amount or activity of
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    broad_mappings:
-      - CTD:decreases_splicing_of
-
-  splicing decreased by:
-    is_a: splicing affected by
-    in_subset:
-      - translator_minimal
-    domain: transcript
-    range: chemical entity or gene or gene product
-    inverse: decreases splicing of
-
-  affects stability of:
-    description: >-
-      holds between two entities where the action or effect of one impacts
-      the stability of the other within a system of interest
-    is_a: affects
-    in_subset:
-      - translator_minimal
-    domain: chemical entity or gene or gene product
-    range: chemical entity or gene or gene product
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    close_mappings:
-      - GAMMA:stabilization
-
-  stability affected by:
-    is_a: affected by
-    in_subset:
-      - translator_minimal
-    domain: chemical entity or gene or gene product
-    range: chemical entity or gene or gene product
-    inverse: affects stability of
-
-  increases stability of:
-    description: >-
-      holds between two chemical or gene/gene product entities  where the action or effect of one
-      increases the stability of the other within a system of interest
-    is_a: affects stability of
-    in_subset:
-      - translator_minimal
-    domain: chemical entity or gene or gene product
-    range: chemical entity or gene or gene product
-    mixins:
-      - increases amount or activity of
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    close_mappings:
-      # agent of the action or effect, not the relationship
-      - CHEMBL.MECHANISM:stabiliser
-
-  stability increased by:
-    is_a: stability affected by
-    in_subset:
-      - translator_minimal
-    domain: chemical entity or gene or gene product
-    range: chemical entity or gene or gene product
-    inverse: increases stability of
-
-  decreases stability of:
-    description: >-
-      holds between two chemical or gene/gene product entities  where the action or effect of one decreases
-      the stability of the other within a system of interest
-    is_a: affects stability of
-    domain: chemical entity or gene or gene product
-    range: chemical entity or gene or gene product
-    mixins:
-      - decreases amount or activity of
-    in_subset:
-      - translator_minimal
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-
-  stability decreased by:
-    is_a: stability affected by
-    in_subset:
-      - translator_minimal
-    domain: chemical entity or gene or gene product
-    range: chemical entity or gene or gene product
-    inverse: decreases stability of
-
-  affects transport of:
-    description: >-
-      holds between two chemical or gene/gene product entities  where the action or effect of one impacts
-      the rate of transport of the other across some boundary in a system of interest
-    is_a: affects
-    in_subset:
-      - translator_minimal
-    domain: chemical entity or gene or gene product
-    range: chemical entity or gene or gene product
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    narrow_mappings:
-      - RO:0002313
-      - RO:0002340
-      - RO:0002345
-
-  transport affected by:
-    is_a: affected by
-    in_subset:
-      - translator_minimal
-    domain: chemical entity or gene or gene product
-    range: chemical entity or gene or gene product
-    inverse: affects transport of
-
-  increases transport of:
-    description: >-
-      holds between two chemical or gene/gene product entities  where the action or effect of one
-      increases the rate of transport of the other across some boundary in a system of interest
-    is_a: affects transport of
-    in_subset:
-      - translator_minimal
-    domain: chemical entity or gene or gene product
-    range: chemical entity or gene or gene product
-    mixins:
-      - increases amount or activity of
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    close_mappings:
-      - GAMMA:carrier
-      - GAMMA:transporter
-
-  transport increased by:
-    is_a: transport affected by
-    in_subset:
-      - translator_minimal
-    domain: chemical entity or gene or gene product
-    range: chemical entity or gene or gene product
-    inverse: increases transport of
-
-  decreases transport of:
-    description: >-
-      holds between two chemical or gene/gene product entities  where the action or effect of one
-      decreases the rate of transport of the other across some boundary in a system of interest
-    is_a: affects transport of
-    in_subset:
-      - translator_minimal
-    domain: chemical entity or gene or gene product
-    range: chemical entity or gene or gene product
-    mixins:
-      - decreases amount or activity of
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-
-  transport decreased by:
-    is_a: transport affected by
-    in_subset:
-      - translator_minimal
-    domain: chemical entity or gene or gene product
-    range: chemical entity or gene or gene product
-    inverse: decreases transport of
-
-  affects secretion of:
-    description: >-
-      holds between two chemical or gene/gene product entities  where the action or effect of one impacts the
-      rate of secretion of the other out of a cell, gland, or organ
-    is_a: affects
-    in_subset:
-      - translator_minimal
-    domain: chemical entity or gene or gene product
-    range: chemical entity or gene or gene product
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    broad_mappings:
-      # 'export' more general than 'secretion'
-      - CTD:affects_export
-
-  secretion affected by:
-    is_a: affected by
-    in_subset:
-      - translator_minimal
-    domain: chemical entity or gene or gene product
-    range: chemical entity or gene or gene product
-    inverse: affects secretion of
-
-  increases secretion of:
-    description: >-
-      holds between two chemical or gene/gene product entities  where the action or effect of one increases the
-      rate of secretion of the other out of a cell, gland, or organ
-    is_a: affects secretion of
-    in_subset:
-      - translator_minimal
-    domain: chemical entity or gene or gene product
-    range: chemical entity or gene or gene product
-    mixins:
-      - increases amount or activity of
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    broad_mappings:
-      # 'export' more general than 'secretion'
-      - CTD:increases_export
-
-  secretion increased by:
-    is_a: secretion affected by
-    in_subset:
-      - translator_minimal
-    domain: chemical entity or gene or gene product
-    range: chemical entity or gene or gene product
-    inverse: increases secretion of
-
-  decreases secretion of:
-    description: >-
-      holds between two chemical or gene/gene product entities  where the action or effect of one decreases the
-      rate of secretion of the other out of a cell, gland, or organ
-    is_a: affects secretion of
-    in_subset:
-      - translator_minimal
-    domain: chemical entity or gene or gene product
-    range: chemical entity or gene or gene product
-    mixins:
-      - decreases amount or activity of
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    broad_mappings:
-      # 'export' more general than 'secretion'
-      - CTD:decreases_export
-
-  secretion decreased by:
-    is_a: secretion affected by
-    in_subset:
-      - translator_minimal
-    domain: chemical entity or gene or gene product
-    range: chemical entity or gene or gene product
-    inverse: decreases secretion of
-
-  affects uptake of:
-    description: >-
-      holds between two chemical or gene/gene product entities  where the action or effect of one impacts the rate of
-      uptake of the other into of a cell, gland, or organ
-    is_a: affects
-    in_subset:
-      - translator_minimal
-    domain: chemical entity or gene or gene product
-    range: chemical entity or gene or gene product
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    broad_mappings:
-      # 'import' more general than 'uptake'
-      - CTD:affects_import
-
-  uptake affected by:
-    is_a: affected by
-    in_subset:
-      - translator_minimal
-    domain: chemical entity or gene or gene product
-    range: chemical entity or gene or gene product
-    inverse: affects uptake of
-
-  increases uptake of:
-    description: >-
-      holds between two chemical or gene/gene product entities  where the action or effect of one increases the rate of
-      uptake of the other into of a cell, gland, or organ
-    is_a: affects uptake of
-    in_subset:
-      - translator_minimal
-    domain: chemical entity or gene or gene product
-    range: chemical entity or gene or gene product
-    mixins:
-      - increases amount or activity of
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    broad_mappings:
-      # 'import' more general than 'uptake'
-      - CTD:increases_import
-
-  uptake increased by:
-    is_a: uptake affected by
-    in_subset:
-      - translator_minimal
-    domain: chemical entity or gene or gene product
-    range: chemical entity or gene or gene product
-    inverse: increases uptake of
-
-  decreases uptake of:
-    description: >-
-      holds between two chemical or gene/gene product entities  where the action or effect
-      of one decreases the rate of uptake of the other into of a cell, gland, or organ
-    is_a: affects uptake of
-    in_subset:
-      - translator_minimal
-    domain: chemical entity or gene or gene product
-    range: chemical entity or gene or gene product
-    mixins:
-      - decreases amount or activity of
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    broad_mappings:
-      # 'import' more general than 'uptake'
-      - CTD:decreases_import
-
-  uptake decreased by:
-    is_a: uptake affected by
-    in_subset:
-      - translator_minimal
-    domain: chemical entity or gene or gene product
-    range: chemical entity or gene or gene product
-    inverse: decreases uptake of
-
-  regulates:
-    # direct is_a inheritance from a non-mixin class is not allowed
-    # we defer this inheritance to the classes which this mixin in its mixins
-    # is_a: affects
-    aliases: ['regulates activity of', 'regulates expression of']
-    comments:
-      - This is a grouping for process-process and entity-entity regulation.
-    mixin: true
-    domain: physical essence or occurrent
-    range: physical essence or occurrent
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    close_mappings:
-      - RO:0002334
-    exact_mappings:
-      - RO:0002211
-    narrow_mappings:
-      # https://www.wikidata.org/wiki/Property:P128 - regulates (molecular biology)
-      - WIKIDATA_PROPERTY:P128
-      - CHEMBL.MECHANISM:modulator
-      - RO:0002295
-      - RO:0002332
-      - RO:0002578
-
-  regulated by:
-    domain: physical essence or occurrent
-    range: physical essence or occurrent
-    mixin: true
-    inverse: regulates
-
-  positively regulates:
-    comments:
-      - This is a grouping for positive process-process and entity-entity regulation.
-    is_a: regulates
-    mixin: true
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    close_mappings:
-      # This RTX contributed term is tagged as a inverse of this Biolink predicate
-      - RO:0002336
-    exact_mappings:
-      - RO:0002213
-    narrow_mappings:
-      - CHEMBL.MECHANISM:activator
-      - DGIdb:activator
-      - RO:0004032
-      - RO:0004034
-      - RO:0002629
-      - SEMMEDDB:augments
-
-  positively regulated by:
-    is_a: regulated by
-    mixin: true
-    inverse: positively regulates
-
-  negatively regulates:
-    comments:
-      - This is a grouping for negative process-process and entity-entity regulation.
-    is_a: regulates
-    mixin: true
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    close_mappings:
-      # This RTX contributed term is tagged as a inverse of this Biolink predicate
-      - RO:0002335
-    exact_mappings:
-      # Strict interpretation here is that entity A causally affects levels of B
-      - RO:0004035
-      - RO:0002212
-    broad_mappings:
-      # This term is slightly broader in that it includes that A acts within B as well
-      - RO:0004033
-    narrow_mappings:
-      - CHEMBL.MECHANISM:blocker
-      - CHEMBL.MECHANISM:inhibitor
-      - CHEMBL.MECHANISM:negative_allosteric_modulator
-      - CHEMBL.MECHANISM:negative_modulator
-      - RO:0002630
-
-  negatively regulated by:
-    is_a: regulated by
-    mixin: true
-    inverse: negatively regulates
-
-  process regulates process:
-    is_a: affects
-    mixins:
-      - regulates
-    domain: occurrent
-    range: occurrent
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-
-  process regulated by process:
-    is_a: affected by
-    domain: occurrent
-    range: occurrent
-    inverse: process regulates process
-
-  process positively regulates process:
-    is_a: process regulates process
-    mixins:
-      - positively regulates
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    exact_mappings:
-      - RO:0002213
-
-  process positively regulated by process:
-    is_a: process regulated by process
-    inverse: process positively regulates process
-
-  process negatively regulates process:
-    is_a: process regulates process
-    mixins:
-      - negatively regulates
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    exact_mappings:
-      - RO:0002212
-
-  process negatively regulated by process:
-    is_a: process regulated by process
-    inverse: process negatively regulates process
-
-  entity regulates entity:
-    aliases: ['activity directly regulates activity of']
-    is_a: affects
-    mixins:
-      - regulates
-    domain: chemical entity or gene or gene product
-    range: chemical entity or gene or gene product
-    inverse: entity regulated by entity
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    local_names:
-      translator: regulates
-      ro: activity directly regulates activity of
-    in_subset:
-      - translator_minimal
-    exact_mappings:
-      - RO:0002448
-    narrow_mappings:
-      # Wikidata mapping copied over from 'regulates' above;
-      # considered a slightly narrower term since it applies to
-      # protein and RNA as subject regulator whereas molecular_entity
-      # may also be another class of chemical_substance?
-      - WIKIDATA_PROPERTY:P128
-
-  entity regulated by entity:
-    is_a: affected by
-    domain: chemical entity or gene or gene product
-    range: chemical entity or gene or gene product
-    inverse: entity regulates entity
-
-  entity positively regulates entity:
-    aliases: ['activity directly positively regulates activity of', 'anatomy upregulates gene', 'disease upregulates gene']
-    is_a: entity regulates entity
-    mixins:
-      - positively regulates
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    local_names:
-      translator: positively regulates
-      ro: activity directly positively regulates activity of
-    in_subset:
-      - translator_minimal
-    exact_mappings:
-      - RO:0002450
-    broad_mappings:
-      # causally positive effect of A over B but not specific to nature of B
-      - RO:0004034
-    narrow_mappings:
-      # Defined more narrowly as increasing, facilitating the
-      # action or function of a "substance interaction", where "substance" is deemed a subclass of possible entity
-      - SEMMEDDB:STIMULATES
-      - SEMMEDDB:stimulates
-
-  entity positively regulated by entity:
-    is_a: entity regulated by entity
-    inverse: entity positively regulates entity
-
-  entity negatively regulates entity:
-    aliases: ['activity directly negatively regulates activity of', 'anatomy downregulates gene', 'disease downregulates gene']
-    is_a: entity regulates entity
-    mixins:
-      - negatively regulates
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    local_names:
-      translator: negatively regulates
-      ro: activity directly negatively regulates activity of
-    in_subset:
-      - translator_minimal
-    exact_mappings:
-      - RO:0002449
-    narrow_mappings:
-      # SemMedDb definition focuses on (chemical?) "substance interactions" which is a bit narrower?
-      - SEMMEDDB:INHIBITS
-      - SEMMEDDB:inhibits
-
-  entity negatively regulated by entity:
-    is_a: entity regulated by entity
-    inverse: entity negatively regulates entity
-
-  disrupts:
-    is_a: affects
-    aliases: ['disease causes disruption of']
-    description: >-
-      describes a relationship where one entity degrades or interferes
-      with the structure, function, or occurrence of another.
-    in_subset:
-      - translator_minimal
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    exact_mappings:
-      - SEMMEDDB:DISRUPTS
-      - SEMMEDDB:disrupts
-      - CHEMBL.MECHANISM:disrupting_agent
-    narrow_mappings:
-      - RO:0004024
-      - RO:0004025
-
-  disrupted by:
-    is_a: affected by
-    description: >-
-      describes a relationship where the structure, function, or occurrence
-      of one entity is degraded or interfered with by another.
-    inverse: disrupts
-
-  gene product of:
-    is_a: related to at instance level
-    description: >-
-      definition x has gene product of y if and only if y is a gene (SO:0000704)
-      that participates in some gene expression process (GO:0010467) where the output of thatf
-      process is either y or something that is ribosomally translated from x
-    exact_mappings:
-      - RO:0002204
-    domain: gene product mixin
-    range: gene
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    inverse: has gene product
-    in_subset:
-      - translator_minimal
-
-  has gene product:
-    is_a: related to at instance level
-    description: >-
-      holds between a gene and a transcribed and/or
-      translated product generated from it
-    domain: gene
-    range: gene product mixin
-    inverse: gene product of
-    in_subset:
-      - translator_minimal
-    close_mappings:
-      # RTX term tagged as inverse mapping
-      - PR:has_gene_template
-    exact_mappings:
-      - RO:0002205
-      - WIKIDATA_PROPERTY:P688
-      - NCIT:gene_encodes_gene_product
-    narrow_mappings:
-      - NCIT:R178
-
-  transcribed to:
-    is_a: related to at instance level
-    domain: gene
-    range: transcript
-    description: >-
-      inverse of transcribed from
-    inverse: transcribed from
-    exact_mappings:
-      - RO:0002511
-      - SIO:010080
-
-  transcribed from:
-    is_a: related to at instance level
-    domain: transcript
-    range: gene
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    description: >-
-      x is transcribed from y if and only if x is synthesized from template y
-    exact_mappings:
-      - RO:0002510
-      - SIO:010081
-
-  translates to:
-    is_a: related to at instance level
-    domain: transcript
-    range: protein
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    description: >-
-      x (amino acid chain/polypeptide) is the ribosomal translation of y (transcript) if and only if a ribosome
-      reads y (transcript) through a series of triplet codon-amino acid adaptor activities (GO:0030533)
-      and produces x (amino acid chain/polypeptide)
-    close_mappings:
-      - RO:0002513
-      - SIO:010082
-
-  translation of:
-    is_a: related to at instance level
-    domain: protein
-    range: transcript
-    description: >-
-      inverse of translates to
-    inverse: translates to
-    close_mappings:
-      - RO:0002512
-      - SIO:010083
-
-  homologous to:
-    is_a: similar to
-    aliases: ['in homology relationship with']
-    description: >-
-      holds between two biological entities that have common evolutionary origin
-    comments:
-      - typically used to describe homology relationships between genes or gene products
-    in_subset:
-      - translator_minimal
-    symmetric: true
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    exact_mappings:
-      - RO:HOM0000001
-      - SIO:010302
-    narrow_mappings:
-      # This is a tricky one to place; seems narrower than the RO mapping but that mapping, RO:0002158
-      - UBERON_CORE:sexually_homologous_to
-
-  paralogous to:
-    is_a: homologous to
-    description: >-
-      a homology relationship that holds between entities (typically genes) that diverged after a duplication event.
-    in_subset:
-      - translator_minimal
-    symmetric: true
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    exact_mappings:
-      - RO:HOM0000011
-
-  orthologous to:
-    is_a: homologous to
-    description: >-
-      a homology relationship between entities (typically genes) that diverged after a speciation event.
-    in_subset:
-      - translator_minimal
-    symmetric: true
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    exact_mappings:
-      - RO:HOM0000017
-      - WIKIDATA_PROPERTY:P684
-
-  xenologous to:
-    is_a: homologous to
-    description: >-
-      a homology relationship characterized by an interspecies (horizontal) transfer since the common ancestor.
-    in_subset:
-      - translator_minimal
-    symmetric: true
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    exact_mappings:
-      - RO:HOM0000018
-
-  coexists with:
-    is_a: related to at instance level
-    description: >-
-      holds between two entities that are co-located in the same aggregate object, process, or spatio-temporal region
-    in_subset:
-      - translator_minimal
-    symmetric: true
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    exact_mappings:
-      - SEMMEDDB:COEXISTS_WITH
-      - SEMMEDDB:coexists_with
-    narrow_mappings:
-      - BSPO:0000096
-      - BSPO:0000097
-      - BSPO:0000098
-      - BSPO:0000099
-      - BSPO:0000100
-      - BSPO:0000102
-      - BSPO:0000104
-      - BSPO:0000110
-      - BSPO:0000113
-      - BSPO:0015001
-      - BSPO:0015002
-      - BSPO:0015003
-      - BSPO:0015005
-      - BSPO:0015006
-      - BSPO:0015007
-      - BSPO:0015008
-      - BSPO:0015009
-      - BSPO:0015012
-      - BSPO:0015014
-      - BSPO:parallel_to
-      - UBERON_CORE:anastomoses_with
-      - UBERON_CORE:anteriorly_connected_to
-      - UBERON_CORE:posteriorly_connected_to
-      - UBERON_CORE:channel_for
-      - UBERON_CORE:channels_from
-      - UBERON_CORE:channels_into
-      - UBERON_CORE:conduit_for
-      - UBERON_CORE:distally_connected_to
-      - UBERON_CORE:extends_fibers_into
-      - UBERON_CORE:filtered_through
-      - UBERON_CORE:indirectly_supplies
-      - UBERON_CORE:proximally_connected_to
-      - UBERON_CORE:synapsed_by
-      - UBERON_CORE:transitively_anteriorly_connected_to
-      - UBERON_CORE:transitively_connected_to
-      - UBERON_CORE:transitively_distally_connected_to
-      - UBERON_CORE:transitively_proximally_connected_to
-      # RTX contributed Environmental Ontology term meaning "partially surrounded by"
-      - ENVO:01001307
-      - FMA:adjacent_to
-      - FMA:afferent_to
-      - FMA:anterior_to
-      - FMA:anteroinferior_to
-      - FMA:anterolateral_to
-      - FMA:anteromedial_to
-      - FMA:anterosuperior_to
-      # RTX contributed terms (also inverses to one another?) might better be mapped to another term with more precise functional semantics?
-      # Some of these terms also seem to be semantic inverses of one another, thus, perhaps not simple narrow_mappings to Biolink
-      - FMA:arterial_supply_of
-      - FMA:has_arterial_supply
-      - FMA:articulates_with
-      - FMA:attaches_to
-      - FMA:bounded_by
-      - FMA:bounds
-      - FMA:branch_of
-      - FMA:connection_type_of
-      - FMA:continuation_branch_of
-      - FMA:continuous_distally_with
-      - FMA:continuous_proximally_with
-      - FMA:corresponds_to
-      - FMA:development_type_of
-      - FMA:developmental_stage_of
-      - FMA:direct_cell_shape_of
-      - FMA:direct_left_of
-      - FMA:direct_right_of
-      - FMA:distal_to
-      - FMA:drains_into
-      - FMA:efferent_to
-      - FMA:external_to
-      - FMA:formed_by
-      - FMA:forms
-      # these next two RTX mapped terms also seem to be inverses of one another
-      - FMA:full_grown_phenotype_of
-      - FMA:has_full_grown_phenotype
-      # these next two RTX mapped terms also seem to be inverses of one another
-      - FMA:fuses_with
-      - FMA:fusion_of
-      - FMA:has_fusion
-      - FMA:germ_origin_of
-      - FMA:has_germ_origin
-      - FMA:has_adherent
-      - FMA:has_branch
-      - FMA:has_connection_type
-      - FMA:has_continuation_branch
-      - FMA:has_development_type
-      - FMA:has_developmental_stage
-      - FMA:has_direct_cell_shape
-      - FMA:has_inherent_3d_shape
-      - FMA:has_insertion
-      - FMA:has_lymphatic_drainage
-      - FMA:has_nerve_supply
-      - FMA:has_observed_anatomical_entity
-      - FMA:has_origin
-      - FMA:has_primary_segmental_supply
-      - FMA:has_projection
-      - FMA:has_regional_part
-      - FMA:has_related_developmental_entity
-      - FMA:has_secondary_segmental_supply
-      - FMA:has_segmental_composition
-      - FMA:has_segmental_supply
-      - FMA:has_tributary
-      - FMA:has_venous_drainage
-      - FMA:inferior_to
-      - FMA:inferolateral_to
-      - FMA:inferomedial_to
-      - FMA:inherent_3d_shape_of
-      - FMA:insertion_of
-      - FMA:internal_to
-      - FMA:lateral_to
-      - FMA:left_lateral_to
-      - FMA:left_medial_to
-      - FMA:lymphatic_drainage_of
-      - FMA:matures_from
-      - FMA:matures_into
-      - FMA:medial_to
-      - FMA:merges_with
-      - FMA:nerve_supply_of
-      - FMA:origin_of
-      - FMA:posterior_to
-      - FMA:posteroinferior_to
-      - FMA:posterolateral_to
-      - FMA:posteromedial_to
-      - FMA:posterosuperior_to
-      - FMA:primary_segmental_supply_of
-      - FMA:projects_from
-      - FMA:projects_to
-      - FMA:proximal_to
-      - FMA:receives_attachment_from
-      - FMA:receives_drainage_from
-      - FMA:receives_input_from
-      - FMA:receives_projection
-      - FMA:related_part
-      - FMA:right_lateral_to
-      - FMA:right_medial_to
-      - FMA:secondary_segmental_supply_of
-      - FMA:segmental_composition_of
-      - FMA:segmental_supply_of
-      - FMA:sends_output_to
-      - FMA:superior_to
-      - FMA:superolateral_to
-      - FMA:superomedial_to
-      - FMA:surrounded_by
-      - FMA:surrounds
-      - FMA:tributary_of
-      - FMA:venous_drainage_of
-      # These LOINC: terms contributed by RTX were only tagged as 'biolink:has_attribute'
-      # but seem more aligned to the FMA entries in this biolink term, so I leave them here for now
-      - LOINC:has_lateral_anatomic_location
-      - LOINC:has_lateral_location_presence
-      - UBERON_NONAMESPACE:distally_connected_to
-      - UBERON_NONAMESPACE:subdivision_of
-      # These RO terms seem similar to the FMA terms above, so I place them here rather than under 'biolink:related_to'
-      - RO:0002219
-      - RO:0002220
-      - RO:0002221
-      - SO:has_origin
-      # RTX mapped these UBERON terms all here
-      - UBERON:anastomoses_with
-      - UBERON:anteriorly_connected_to
-      - UBERON:channel_for
-      - UBERON:channels_from
-      - UBERON:channels_into
-      - UBERON:conduit_for
-      - UBERON:distally_connected_to
-      - UBERON:existence_starts_and_ends_during
-      - UBERON:extends_fibers_into
-      - UBERON:filtered_through
-      - UBERON:in_central_side_of
-      - UBERON:in_innermost_side_of
-      - UBERON:in_outermost_side_of
-      - UBERON:indirectly_supplies
-      - UBERON:posteriorly_connected_to
-      - UBERON:protects
-      - UBERON:proximally_connected_to
-      - UBERON:sexually_homologous_to
-
-  in pathway with:
-    description: >-
-      holds between two genes or gene products that are part of in the same biological pathway
-    is_a: coexists with
-    domain: gene or gene product
-    range: gene or gene product
-    in_subset:
-      - translator_minimal
-    symmetric: true
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    related_mappings:
-      # generally pertains to membership of a (subject) component - gene,
-      # metabolite, etc? - in an (object) metabolic pathway
-      - SIO:010532
-
-  in complex with:
-    description: >-
-      holds between two genes or gene products that are part of (or code for
-      products that are part of) in the same macromolecular complex mixin
-    is_a: coexists with
-    domain: gene or gene product
-    range: gene or gene product
-    in_subset:
-      - translator_minimal
-    symmetric: true
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    related_mappings:
-      # generally pertains to membership of a (subject) protein in an (object) protein complex (doesn't cover RNA-Protein, Lipid-Protein, etc complexes though)
-      - SIO:010497
-    broad_mappings:
-      # generally pertains to membership of any (subject) constituent molecule in an (object) molecular complex (might also generically cover RNA-Protein, Lipid-Protein, etc complexes)
-      - SIO:010285
-
-  in cell population with:
-    description: >-
-      holds between two genes or gene products that are expressed in the same cell type or population
-    is_a: coexists with
-    domain: gene or gene product
-    range: gene or gene product
-    in_subset:
-      - translator_minimal
-    symmetric: true
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-
-  colocalizes with:
-    description: >-
-      holds between two entities that are observed to be located in the same place.
-    is_a: coexists with
-    in_subset:
-      - translator_minimal
-    symmetric: true
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    exact_mappings:
-      - RO:00002325
-
-  # Despite the name, note that this particular entity is
-  # NOT a biolink:Association but rather, a biolink:predicate
-  genetic association:
-    is_a: related to at instance level
-    symmetric: true
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    description: >-
-      Co-occurrence of a certain allele of a genetic marker and the phenotype
-      of interest in the same individuals at above-chance level
-    exact_mappings:
-      - WIKIDATA_PROPERTY:P2293
-
-  gene associated with condition:
-    is_a: genetic association
-    description: >-
-      holds between a gene and a disease or phenotypic feature that the gene or its alleles/products may influence,
-      contribute to, or correlate with
-    domain: gene
-    range: disease or phenotypic feature
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    in_subset:
-      - translator_minimal
-    broad_mappings:
-      - GENO:0000840 # broader than a single gene: 'genotype' pathogenic for condition
-      - GENO:0000841
-    narrow_mappings:
-      # narrower: just diseases, not phenotypic features as well
-      - NCIT:R38
-      - NCIT:R175
-      - NCIT:R48
-
-  condition associated with gene:
-    is_a: genetic association
-    aliases: ['disease associated with gene']
-    description: >-
-      holds between a gene and a disease or phenotypic feature that may be influenced, contribute to, or be correlated with the gene or its alleles/products
-    domain: disease or phenotypic feature
-    range: gene
-    in_subset:
-      - translator_minimal
-    inverse: gene associated with condition
-    narrow_mappings:
-      # narrower since just diseases, not phenotypic features as well
-      - NCIT:R176
-
-  affects risk for:
-    is_a: related to at instance level
-    description: >-
-      holds between two entities where exposure to one entity alters the chance of developing the other
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    in_subset:
-      - translator_minimal
-
-  risk affected by:
-    is_a: related to at instance level
-    inverse: affects risk for
-
-  predisposes:
-    is_a: affects risk for
-    description: >-
-      holds between two entities where exposure to one entity increases the chance of developing the other
-    in_subset:
-      - translator_minimal
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    exact_mappings:
-      - SEMMEDDB:PREDISPOSES
-      - SEMMEDDB:predisposes
-
-  # TODO: inverse of predisposes
-
-  contributes to:
-    is_a: related to at instance level
-    description: >-
-      holds between two entities where the occurrence, existence, or activity of one causes or contributes to the
-      occurrence or generation of the other
-    in_subset:
-      - translator_minimal
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    close_mappings:
-      # RTX contributed mapping tagged as 'inverse' of this Biolink predicate
-      - IDO:0000664
-    exact_mappings:
-      - RO:0002326
-    narrow_mappings:
-      - CTD:marker_mechanism
-      - MONDO:predisposes_towards
-      # RTX mapped this to 'biolink:related_to' but this term seems a more precise mapping
-      - RO:0002255
-      # RTX term 'contributes to condition' mapped to 'biolink:causes' seems more suitable here
-      - RO:0003304
-
-  contribution from:
-    is_a: related to at instance level
-    in_subset:
-      - translator_minimal
-    inverse: contributes to
-
-  causes:
-    description: >-
-      holds between two entities where the occurrence, existence, or activity of one causes the occurrence
-      or generation of the other
-    is_a: contributes to
-    in_subset:
-      - translator_minimal
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    exact_mappings:
-      - SEMMEDDB:CAUSES
-      - SEMMEDDB:causes
-      - WIKIDATA_PROPERTY:P1542
-      - SNOMED:cause_of
-      - RO:0003303
-    broad_mappings:
-      - RO:0002410
-      - RO:0002506
-    narrow_mappings:
-      - MONDO:disease_triggers
-      - GOREL:0000040
-      - MONDO:disease_causes_feature
-      - MONDO:disease_triggers
-      - NCIT:allele_has_abnormality
-      - NCIT:biological_process_has_result_biological_process
-      - NCIT:chemical_or_drug_has_physiologic_effect
-      # RTX mapped terms as 'biolink:part_of' but implied sequence of causality suggests 'biolink:causes'?
-      - NCIT:chemical_or_drug_initiates_biological_process
-      - NCIT:process_initiates_biological_process
-      - NCIT:chromosome_mapped_to_disease
-      - NCIT:disease_has_normal_tissue_origin
-      - NBO-PROPERTY:in_response_to
-      - ORPHA:317343
-      - ORPHA:317344
-      - ORPHA:317346
-      - ORPHA:410295
-      - ORPHA:410296
-      # RTX mapped this term to 'biolink:related_to' but this term seems a more precise mapping
-      - RO:0002256
-      - RO:0002315
-      - RO:0002507
-      - RO:0002509
-      - RO:0004001
-      - SNOMED:causative_agent_of
-      - SNOMED:has_realization
-      - UMLS:has_physiologic_effect
-
-  caused by:
-    description: >-
-      holds between two entities where the occurrence, existence,
-      or activity of one is caused by the occurrence or generation of the other
-    is_a: related to at instance level
-    aliases: ['disease caused by disruption of', 'disease has basis in dysfunction of', 'realized in response to', 'realized in response to stimulus']
-    in_subset:
-      - translator_minimal
-    inverse: causes
-    exact_mappings:
-      - WIKIDATA_PROPERTY:P828
-    narrow_mappings:
-      - RO:0001022
-      - RO:0002608
-      - RO:0004019
-      - RO:0004020
-      - RO:0004028
-      - RO:0009501
-
-  # TODO: ameliorates and exacerbates inverses.
-  ameliorates:
-    is_a: affects
-    description: >-
-      A relationship between an entity (e.g. a genotype,
-      genetic variation, chemical, or environmental exposure)
-      and a condition (a phenotype or disease), where the
-      presence of the entity reduces or eliminates some or
-      all aspects of the condition.
-    # 'biological entity' currently includes 'exposure event' which covers alot of related ground
-    domain: biological entity
-    range: disease or phenotypic feature
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    exact_mappings:
-      - RO:0003307
-
-  exacerbates:
-    is_a: affects
-    description: >-
-      A relationship between an entity (e.g. a chemical,
-      environmental exposure, or some form of genetic variation)
-      and a condition (a phenotype or disease), where the presence
-      of the entity worsens some or all aspects of the condition.
-    # 'biological entity' currently includes 'exposure event' which covers alot of related ground
-    domain: biological entity
-    range: disease or phenotypic feature
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    exact_mappings:
-      - RO:0003309
-
-  treats:
-    aliases: ['is substance that treats', 'indicated for']
-    is_a: ameliorates
-    description: >-
-      holds between a therapeutic procedure or chemical entity
-      and a disease or phenotypic feature that it is used to treat
-    domain: chemical or drug or treatment
-    range: disease or phenotypic feature
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    in_subset:
-      - translator_minimal
-    related_mappings:
-      - MONDO:disease_responds_to
-    exact_mappings:
-      - DRUGBANK:treats
-      - SEMMEDDB:TREATS
-      - SEMMEDDB:treats
-      - WIKIDATA_PROPERTY:P2175
-    narrow_mappings:
-      # "is substance that treats" constrains statements to
-      # a subset of the universe of all possible treatments
-      - RO:0002606
-      - NCIT:regimen_has_accepted_use_for_disease
-      # RTX mapped REPODB terms
-      - REPODB:clinically_tested_approved_unknown_phase
-      - REPODB:clinically_tested_suspended_phase_0
-      - REPODB:clinically_tested_suspended_phase_1
-      - REPODB:clinically_tested_suspended_phase_1_or_phase_2
-      - REPODB:clinically_tested_suspended_phase_2
-      - REPODB:clinically_tested_suspended_phase_2_or_phase_3
-      - REPODB:clinically_tested_suspended_phase_3
-      - REPODB:clinically_tested_terminated_phase_0
-      - REPODB:clinically_tested_terminated_phase_1
-      - REPODB:clinically_tested_terminated_phase_1_or_phase_2
-      - REPODB:clinically_tested_terminated_phase_2
-      - REPODB:clinically_tested_terminated_phase_2_or_phase_3
-      - REPODB:clinically_tested_terminated_phase_3
-      - REPODB:clinically_tested_withdrawn_phase_0
-      - REPODB:clinically_tested_withdrawn_phase_1
-      - REPODB:clinically_tested_withdrawn_phase_1_or_phase_2
-      - REPODB:clinically_tested_withdrawn_phase_2
-      - REPODB:clinically_tested_withdrawn_phase_2_or_phase_3
-      - REPODB:clinically_tested_withdrawn_phase_3
-      - SNOMED:plays_role
-
-  treated by:
-    is_a: related to at instance level
-    description: >-
-      holds between a disease or phenotypic feature and a therapeutic
-      process or chemical entity that is used to treat the condition
-    domain: disease or phenotypic feature
-    range: chemical or drug or treatment
-    # range: chemical or drug or treatement
-    in_subset:
-      - translator_minimal
-    inverse: treats
-    exact_mappings:
-      - WIKIDATA_PROPERTY:P2176
-      # RTX contributed term tagged as inverse of 'biolink:treats'
-      - MONDO:disease_responds_to
-    narrow_mappings:
-      # "is treated by substance" constrains statements to
-      # subset of the universe of all possible treatments
-      - RO:0002302
-
-  approved to treat:
-    description: >-
-      holds between a therapeutic procedure or chemical entity
-      and a disease or phenotypic feature for which it is approved
-      for treatment to some level of clinical trial. Note that in
-      terms of REPODB narrow mappings, terms containing 'suspended',
-      'terminated' or 'withdrawn' should be mapped onto associations
-      using this term for which 'negated: true' is asserted.
-    is_a: treats
-    domain: chemical or drug or treatment
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    exact_mappings:
-      - NCIT:C172573
-    narrow_mappings:
-      - NCIT:R172
-      - NCIT:regimen_has_accepted_use_for_disease
-      # RTX mapped REPODB terms
-      - REPODB:clinically_tested_approved_unknown_phase
-      - REPODB:clinically_tested_suspended_phase_0
-      - REPODB:clinically_tested_suspended_phase_1
-      - REPODB:clinically_tested_suspended_phase_1_or_phase_2
-      - REPODB:clinically_tested_suspended_phase_2
-      - REPODB:clinically_tested_suspended_phase_2_or_phase_3
-      - REPODB:clinically_tested_suspended_phase_3
-      - REPODB:clinically_tested_terminated_phase_0
-      - REPODB:clinically_tested_terminated_phase_1
-      - REPODB:clinically_tested_terminated_phase_1_or_phase_2
-      - REPODB:clinically_tested_terminated_phase_2
-      - REPODB:clinically_tested_terminated_phase_2_or_phase_3
-      - REPODB:clinically_tested_terminated_phase_3
-      - REPODB:clinically_tested_withdrawn_phase_0
-      - REPODB:clinically_tested_withdrawn_phase_1
-      - REPODB:clinically_tested_withdrawn_phase_1_or_phase_2
-      - REPODB:clinically_tested_withdrawn_phase_2
-      - REPODB:clinically_tested_withdrawn_phase_2_or_phase_3
-      - REPODB:clinically_tested_withdrawn_phase_3
-
-  approved for treatment by:
-    description: >-
-      holds between a disease or phenotypic feature and a therapeutic process
-      or chemical entity that is approved for treatment of the condition
-      (or not, if negated) to some level of clinical trial
-    is_a: treated by
-    range: chemical or drug or treatment
-    inverse: approved to treat
-
-  prevents :
-    is_a: affects risk for
-    description: >-
-      holds between an entity whose application or use reduces
-      the likelihood of a potential outcome. Typically used to associate
-      a chemical entity, exposure, activity, or medical intervention
-      that can prevent the onset a disease or phenotypic feature.
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    in_subset:
-      - translator_minimal
-    exact_mappings:
-      - SEMMEDDB:PREVENTS
-      - SEMMEDDB:prevents
-    narrow_mappings:
-      # more restricted case of a material entity mitigating a pathological process
-      - RO:0002599
-
-  prevented by:
-    is_a: risk affected by
-    description: >-
-      holds between a potential outcome of which the likelihood
-      was reduced by the application or use of an entity.
-    inverse: prevents
-
-  correlated with:
-    is_a: associated with
-    description: >-
-      holds between any two named thing entities. For example, correlated_with
-      holds between a disease or phenotypic feature and a measurable molecular
-      entity that is used as an indicator of the presence or state of the disease or feature.
-    domain: named thing
-    range: named thing
-    in_subset:
-      - translator_minimal
-    symmetric: true
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    exact_mappings:
-      - RO:0002610
-      - PATO:correlates_with
-
-  # proposed positive and negative semantic extensions to the general "correlated with" predicate
-
-  positively correlated with:
-    is_a: correlated with
-    description: >-
-      holds between any two named thing entities "correlated with" one another in a positive manner.
-    domain: named thing
-    range: named thing
-    in_subset:
-      - translator_minimal
-    symmetric: true
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-
-  negatively correlated with:
-    is_a: correlated with
-    description: >-
-      holds between any two named thing entities "correlated with" one another in a negative manner.
-    domain: named thing
-    range: named thing
-    in_subset:
-      - translator_minimal
-    symmetric: true
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-
-  occurs together in literature with:
-    is_a: correlated with
-    description: >-
-      holds between two entities where their co-occurrence is correlated by counts of publications
-      in which both occur, using some threshold of occurrence as defined by the edge provider.
-    domain: named thing
-    range: named thing
-    in_subset: translator_minimal
-    symmetric: true
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-
-  coexpressed with:
-    is_a: correlated with
-    description: >-
-      holds between any two genes or gene products, in which both are
-      generally expressed within a single defined experimental context.
-    domain: gene or gene product
-    range: gene or gene product
-    symmetric: true
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-
-  has biomarker:
-    is_a: correlated with
-    description: >-
-      holds between a disease or phenotypic feature and a measurable
-      chemical entity that is used as an indicator of the presence
-      or state of the disease or feature.
-      # metabolite
-    domain: disease or phenotypic feature
-    range: chemical entity or gene or gene product
-    in_subset:
-      - translator_minimal
-    inverse: biomarker for
-    narrow_mappings:
-      # some RTX terms contributed as inverses of 'biolink:biomarker_for'
-      - NCIT:disease_has_molecular_abnormality
-      - NCIT:disease_is_marked_by_gene
-
-  biomarker for:
-    is_a: correlated with
-    description: >-
-      holds between a measurable chemical entity and a disease
-      or phenotypic feature, where the entity is used as an indicator
-      of the presence or state of the disease or feature.
-    domain: chemical entity or gene or gene product
-    range: disease or phenotypic feature
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    in_subset:
-      - translator_minimal
-    exact_mappings:
-      - NCIT:R39
-    broad_mappings:
-      # Generic marker definition not specific to biomarkers per say
-      - RO:0002607
-    narrow_mappings:
-      - NCIT:R47
-      # RTX term was tagged as 'biolink:actively_involved_in' but maps better here?
-      - NCIT:genetic_biomarker_related_to
-      - NCIT:is_molecular_abnormality_of_disease
-      - ORPHA:465410
-      - SEMMEDDB:diagnoses
-
-  # It may be helpful to introduce an intermediate predicate in between 'related_to' and 'expressed in'
-  # which would have a domain of 'biological entity' and range of 'anatomical entity', to map predicates
-  # which are biological which have manifestation in an anatomical site, e.g. RO:0004026, RO:0004027 and others
-  expressed in:
-    is_a: related to at instance level
-    description: >-
-      holds between a gene or gene product and an anatomical entity in which it is expressed
-    domain: gene or gene product
-    range: anatomical entity
-    multivalued: true
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    in_subset:
-      - translator_minimal
-    exact_mappings:
-      - RO:0002206
-    narrow_mappings:
-      - NCIT:R49
-      - NCIT:R46
-
-  expresses:
-    is_a: related to at instance level
-    aliases: ['anatomy expresses gene']
-    description: >-
-      holds between an anatomical entity and gene or gene product that is expressed there
-    domain: anatomical entity
-    range: gene or gene product
-    multivalued: true
-    in_subset:
-      - translator_minimal
-    inverse: expressed in
-    exact_mappings:
-      - RO:0002292
-
-  has phenotype:
-    is_a: related to at instance level
-    aliases: ['disease presents symptom']
-    description: >-
-      holds between a biological entity and a phenotype, where a phenotype
-      is construed broadly as any kind of quality of an organism part,
-      a collection of these qualities, or a change in quality or qualities
-      (e.g. abnormally increased temperature). In SNOMEDCT, disorders with keyword 'characterized by' should
-      translate into this predicate.
-    domain: biological entity
-    range: phenotypic feature
-    multivalued: true
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    notes:
-      - check the range
-    in_subset:
-      - translator_minimal
-    exact_mappings:
-      - RO:0002200
-    broad_mappings:
-      - NCIT:R115
-      - NCIT:R108
-    narrow_mappings:
-      - NCIT:R89
-      - DOID-PROPERTY:has_symptom
-      - RO:0004022
-
-  phenotype of:
-    is_a: related to at instance level
-    description: >-
-      holds between a phenotype and a biological entity, where a phenotype
-      is construed broadly as any kind of quality of an organism part,
-      a collection of these qualities, or a change in quality or qualities
-      (e.g. abnormally increased temperature).
-    domain: phenotypic feature
-    range: biological entity
-    multivalued: true
-    inverse: has phenotype
-    notes:
-      - check the domain
-    in_subset:
-      - translator_minimal
-
-  # TODO: predicate inverse for occurs in
-  occurs in:
-    is_a: related to at instance level
-    description: >-
-      holds between a process and a material entity or site within which the process occurs
-    in_subset:
-      - translator_minimal
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    close_mappings:
-      # These RTX mapped terms tagged as the inverse of "biolink:occurs_in", i.e. Entity/Site contains Process"
-      - BFO:0000067
-      - SNOMED:has_occurrence
-      - UBERON:site_of
-    exact_mappings:
-      - BFO:0000066
-      - PathWhiz:has_location
-      - SNOMED:occurs_in
-    narrow_mappings:
-      # SemMedDb term 'OCCURS_IN' constrained to something (other than process) occurring in a group or population
-      - SEMMEDDB:OCCURS_IN
-      - SEMMEDDB:occurs_in
-      # SemMedDb term 'PROCESS_IN' constrained specifically to a process occurring in the object concept entity
-      - SEMMEDDB:PROCESS_OF
-      - SEMMEDDB:process_of
-      # Uberon term constrained to a 'site' as object concept
-      - UBERON_CORE:site_of
-      - LOINC:has_imaged_location
-      - PathWhiz:in_species
-      - RO:0002231
-      - RO:0002232
-      - SNOMED:has_direct_procedure_site
-      - SNOMED:has_direct_site
-      - SNOMED:has_procedure_site
-
-  contains process:
-    is_a: related to at instance level
-    inverse: occurs in
-
-  located in:
-    is_a: related to at instance level
-    description: >-
-      holds between a material entity and a material entity or site
-      within which it is located (but of which it is not considered a part)
-    in_subset:
-      - translator_minimal
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    exact_mappings:
-      - RO:0001025
-      - FMA:has_location
-    narrow_mappings:
-      - GOREL:0001004
-      - BSPO:0000107
-      - BSPO:0000108
-      - BSPO:0000120
-      - BSPO:0000121
-      - BSPO:0000122
-      - BSPO:0000123
-      - BSPO:0000124
-      - BSPO:0000125
-      - BSPO:0000126
-      - BSPO:0001100
-      - BSPO:0001101
-      - BSPO:0001107
-      - BSPO:0015101
-      - BSPO:0015102
-      - BSPO:0015202
-      - UBERON_CORE:in_central_side_of
-      - UBERON_CORE:in_innermost_side_of
-      - UBERON_CORE:in_outermost_side_of
-      - NCIT:R100
-      - EFO:0000784
-      - FMA:has_location
-      - HMDB:at_cellular_location
-      - HMDB:at_tissue
-      - HMDB:in_biospecimen
-      - LOINC:has_imaging_focus
-      - NCIT:R156
-      - NCIT:R155
-      - NCIT:R145
-      - NCIT:R40
-      - NCIT:R171
-      - NCIT:R167
-      - NCIT:R165
-      - NCIT:R169
-      - NCIT:R170
-      - NCIT:R166
-      - NCIT:R168
-      - RO:0002303
-      - SNOMED:has_finding_site
-      - SNOMED:has_indirect_procedure_site
-      - SNOMED:has_inherent_location
-
-  location of:
-    is_a: related to at instance level
-    aliases: ['site of']
-    description: >-
-      holds between material entity or site and a material entity
-      that is located within it (but not considered a part of it)
-    in_subset:
-      - translator_minimal
-    inverse: located in
-    exact_mappings:
-      - RO:0001015
-      - SEMMEDDB:LOCATION_OF
-      - SEMMEDDB:location_of
-      - WIKIDATA_PROPERTY:P276
-      # RTX tagged this as an inverse of biolink:located_in
-      - FMA:location_of
-    narrow_mappings:
-      - SNOMED:inherent_location_of
-      - NCIT:Anatomic_Structure_Has_Location_Role
-
-  disease has location:
-    description: >-
-      A relationship between a disease and an anatomical entity where the
-      disease has one or more features that are located in that entity.
-    is_a: related to
-    exact_mappings:
-      - RO:0004026
-      - MONDO:disease_has_location
-
-  similar to:
-      is_a: related to at instance level
-      description: >-
-        holds between an entity and some other entity with similar features.
-      in_subset:
-        - translator_minimal
-      symmetric: true
-      annotations:
-        tag: biolink:canonical_predicate
-        value: true
-      exact_mappings:
-        - RO:HOM0000000               #I don't understand this identifier, but I think it's equivalent
-        - SO:similar_to               #equivalent
-
-  chemically similar to:
-    is_a: similar to
-    description: >-
-      holds between one small molecule entity and another that it approximates
-      for purposes of scientific study, in virtue of its exhibiting
-      similar features of the studied entity.
-    in_subset:
-      - translator_minimal
-    symmetric: true
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    narrow_mappings:
-      - CHEBI:has_parent_hydride    #subproperty
-      - CHEBI:has_functional_parent #subproperty
-      - CHEBI:is_conjugate_acid_of  #subproperty
-      - CHEBI:is_conjugate_base_of  #subproperty
-      - CHEBI:is_enantiomer_of      #subproperty
-      - CHEBI:is_tautomer_of        #subproperty
-      - NCIT:has_salt_form
-
-  has sequence location:
-    is_a: related to at instance level
-    description: >-
-      holds between two nucleic acid entities when the subject can be localized
-      in sequence coordinates on the object. For example, between
-      an exon and a chromosome/contig.
-    domain: nucleic acid entity
-    range: nucleic acid entity
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    exact_mappings:
-      - faldo:location
-
-  sequence location of:
-    is_a: related to at instance level
-    domain: nucleic acid entity
-    range: nucleic acid entity
-    inverse: has sequence location
-
-  model of:
-    is_a: related to at instance level
-    description: >-
-      holds between a thing and some other thing it approximates
-      for purposes of scientific study, in virtue of its exhibiting
-      similar features of the studied entity.
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    in_subset:
-      - translator_minimal
-    exact_mappings:
-      - RO:0003301
-    narrow_mappings:
-      - FOODON:00001301
-
-  models:
-    is_a: related to at instance level
-    inverse: model of
-
-  overlaps:
-    is_a: related to at instance level
-    description: >-
-      holds between entities that overlap in their extents (materials or processes)
-    in_subset:
-      - translator_minimal
-    symmetric: true
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    exact_mappings:
-      - RO:0002131
-    narrow_mappings:
-      - BSPO:0005001
-      - CHEMBL.MECHANISM:overlaps_with
-      - RO:0002100
-      - RO:0002102
-      - RO:0002433
-
-  has part:
-    is_a: overlaps
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    description: >-
-      holds between wholes and their parts (material entities or processes)
-    in_subset:
-      - translator_minimal
-    exact_mappings:
-      - BFO:0000051
-      # term name seems to be 'realizes' but RTX maps this term here
-      - BFO:0000055
-      - WIKIDATA_PROPERTY:P527
-      - RO:0001019
-      - RXNORM:consists_of
-      - RXNORM:has_part
-    broad_mappings:
-      # To 'contain' is 'to have something inside or include something as a part'; slightly broader?
-      - RO:0001019
-      - FMA:contains
-      - RXNORM:contains
-    narrow_mappings:
-      - BFO:0000117
-      # RTX term originally mapped to 'biolink:coexists_with'?
-      - FMA:has_constitutional_part
-      - FMA:has_part
-      # Several of the following RTX terms were originally mapped as inverses to 'biolink:part_of'?
-      - FMA:has_member
-      - FOODON:00001563
-      - FOODON:00002420
-      - LOINC:has_component
-      - LOINC:has_member
-      - MEDDRA:has_member
-      - MONDO:disease_has_major_feature
-      - NCIT:complex_has_physical_part
-      - NDDF:has_ingredient
-      - PathWhiz:has_element_in_bound
-      # This RTX contributed term was tagged as 'biolink:has_gene_product' but seems more compositional in nature
-      - NCIT:R50
-      - PathWhiz:has_protein_in_complex
-      - RO:0002104
-      - RO:0002180
-      - RO:0002351
-      - RO:0002473
-      - RO:0002524
-      - RO:0002551
-      - RXNORM:has_ingredient
-      - SNOMED:has_component
-      - UMLS:has_component
-
-  has plasma membrane part:
-    is_a: has part
-    description: >-
-      Holds between a cell c and a protein complex or protein p if
-      and only if that cell has as part a plasma_membrane[GO:0005886], and that plasma membrane has p as part.
-    exact_mappings:
-      - RO:0002104
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    in_subset:
-      - translator_minimal
-
-  composed_primarily_of:
-    is_a: related to
-    description: >-
-      x composed_primarily_of_y if:more than half of the mass of x is made from parts of y.
-    exact_mappings:
-      - RO:0002473
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    in_subset:
-      - translator_minimal
-
-  plasma membrane part of:
-    is_a: part of
-    inverse: has plasma membrane part
-
-  part of:
-    is_a: overlaps
-    description: >-
-      holds between parts and wholes (material entities or processes)
-    in_subset:
-      - translator_minimal
-    inverse: has part
-    exact_mappings:
-      - BFO:0000050
-      - SEMMEDDB:PART_OF
-      - SEMMEDDB:part_of
-      - WIKIDATA_PROPERTY:P361
-      - FMA:part_of
-      - RXNORM:constitutes
-      - RXNORM:part_of
-    broad_mappings:
-      # To 'contain' is 'to have something inside or include something as a part'
-      - RO:0001018
-      - FMA:contained_in
-      - RXNORM:contained_in
-    narrow_mappings:
-      - BSPO:0001106
-      - BSPO:0001108
-      - BSPO:0001113
-      - BSPO:0001115
-      - UBERON_CORE:layer_part_of
-      - UBERON_CORE:subdivision_of
-      - UBERON_CORE:trunk_part_of
-      - CHEBI:is_substituent_group_from
-      - CPT:panel_element_of
-      - CPT:panel_element_of_possibly_included
-      - DRUGBANK:component_of
-      - FMA:constitutional_part_of
-      - FMA:member_of
-      - FMA:regional_part_of
-      - FMA:related_developmental_entity_of
-      - LOINC:component_of
-      - LOINC:has_supersystem
-      - LOINC:member_of
-      - LOINC:multipart_of
-      - MEDDRA:member_of
-      - MONDO:part_of_progression_of_disease
-      - NCIT:R82
-      - NCIT:R27
-      - NCIT:is_component_of_chemotherapy_regimen
-      - NDDF:ingredient_of
-      - RO:0002007
-      - RO:0002350
-      - RO:0002376
-      - RO:0002380
-      - RO:0002571
-      - RO:0002572
-      - RO:0002576
-      - RXNORM:ingredient_of
-      - RXNORM:ingredients_of
-      - RXNORM:precise_ingredient_of
-      - SNOMED:active_ingredient_of
-      - SNOMED:basis_of_strength_substance_of
-      - SNOMED:component_of
-      - SNOMED:direct_substance_of
-      - SNOMED:during
-      - SNOMED:focus_of
-      - SNOMED:has_dependent
-      - SNOMED:part_anatomy_structure_of
-      - SNOMED:precise_active_ingredient_of
-      - UBERON:subdivision_of
-      - UMLS:component_of
-      - UMLS:has_owning_affiliate
-      - UMLS:owning_subsection_of
-      - VANDF:ingredient_of
-
-  has input:
-    is_a: has participant
-    description: >-
-      holds between a process and a continuant, where the continuant is an input into the process
-    domain: occurrent
-    range: biological process or activity
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    in_subset:
-      - translator_minimal
-    close_mappings:
-      # RTX inverse mapping to to 'biolink:has_input'
-      - RO:0002352
-    exact_mappings:
-      - RO:0002233
-      - SEMMEDDB:USES
-      - SEMMEDDB:uses
-    narrow_mappings:
-      - LOINC:has_fragments_for_synonyms
-      - LOINC:has_system
-      - PathWhiz:has_left_element
-      - RO:0002590
-      - RO:0004009
-      - SNOMED:has_finding_method
-      - SNOMED:has_precondition
-      - SNOMED:has_specimen_source_identity
-      - SNOMED:has_specimen_substance
-      - SNOMED:uses_access_device
-      - SNOMED:uses_device
-      - SNOMED:uses_energy
-      - SNOMED:uses_substance
-
-  is input of:
-    is_a: participates in
-    domain: biological process or activity
-    range: occurrent
-    inverse: has input
-    in_subset:
-      - translator_minimal
-
-  has output:
-    is_a: has participant
-    description: >-
-      holds between a process and a continuant, where the continuant is an output of the process
-    domain: occurrent
-    range: biological process or activity
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    in_subset:
-      - translator_minimal
-    close_mappings:
-      - RO:0002353
-      - RO:0002354
-    exact_mappings:
-      - RO:0002234
-    narrow_mappings:
-      - NCIT:R31
-      - OBI:0000299
-      - PathWhiz:has_right_element
-      - RO:0002296
-      - RO:0002297
-      - RO:0002298
-      - RO:0002299
-      - RO:0002588
-      - RO:0004008
-
-  is output of:
-    is_a: participates in
-    range: occurrent
-    domain: biological process or activity
-    inverse: has output
-    in_subset:
-      - translator_minimal
-
-  has participant:
-    is_a: related to at instance level
-    description: >-
-      holds between a process and a continuant, where the continuant is somehow involved in the process
-    domain: occurrent
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    in_subset:
-      - translator_minimal
-    close_mappings:
-      - WIKIDATA_PROPERTY:P2283
-    exact_mappings:
-      - RO:0000057
-      - RO:has_participant
-    narrow_mappings:
-      - BFO:0000167
-      # Several of the following RTX terms tagged as inverse to 'biolink:participates_in'
-      - LOINC:has_subject
-      - NCIT:process_involves_gene
-      - NBO-PROPERTY:has_participant
-      - PathWhiz:has_bound
-      - PathWhiz:has_compound
-      - PathWhiz:has_element_collection
-      - PathWhiz:has_enzyme
-      - OBI:0000293
-      - PathWhiz:has_nucleic_acid
-      - PathWhiz:has_protein
-      - PathWhiz:has_reaction
-      - RO:0004007
-      - RO:0004020
-      - RO:0004021
-      - SNOMED:has_indirect_device
-      - SNOMED:has_procedure_device
-      - SNOMED:has_recipient_category
-
-  catalyzes:
-    is_a: participates in
-    # domain: nucleic acid entity
-    # range: molecular activity
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-
-  has catalyst:
-    is_a: has participant
-    inverse: catalyzes
-
-  has substrate:
-    is_a: has participant
-    # domain: molecular activity
-    # range: chemical entity or gene or gene product
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-
-  is substrate of:
-    is_a: participates in
-    inverse: has substrate
-
-  participates in:
-    is_a: related to at instance level
-    description: >-
-      holds between a continuant and a process, where the continuant is somehow involved
-      in the process
-    range: occurrent
-    inverse: has participant
-    in_subset:
-      - translator_minimal
-    exact_mappings:
-      - RO:0000056
-      - BFO:0000056
-    narrow_mappings:
-      - DRUGBANK:pathway
-      - HMDB:in_pathway
-      - LOINC:is_given_pharmaceutical_substance_for
-      - NCIT:R130
-      - NCIT:R37
-      - NCIT:R131
-      - NCIT:R51
-      - NCIT:R53
-      - OBI:0000295
-      - RO:0002216
-      - RO:0002505
-      - RO:0002565
-      - SNOMED:has_direct_device
-
-  actively involved in:
-    is_a: participates in
-    aliases: ['involved in']
-    description: >-
-      holds between a continuant and a process or function, where
-      the continuant actively contributes to part or all of
-      the process or function it realizes
-    domain: molecular activity
-    range: occurrent
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    in_subset:
-      - translator_minimal
-    exact_mappings:
-      - RO:0002331
-      - RO:0002432
-    narrow_mappings:
-      - NBO-PROPERTY:by_means
-      - ORPHA:317348
-      - ORPHA:317349
-      - ORPHA:327767
-      - RO:0002503
-
-  actively involves:
-    is_a: has participant
-    domain: occurrent
-    range: molecular activity
-    inverse: actively involved in
-    exact_mappings:
-      - RO:0002331
-    in_subset:
-      - translator_minimal
-
-  capable of:
-    is_a: actively involved in
-    description: >-
-      holds between a physical entity and process or function, where the
-      continuant alone has the ability to carry out the process or function.
-    range: occurrent
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    in_subset:
-      - translator_minimal
-    exact_mappings:
-      - RO:0002215
-    narrow_mappings:
-      - NCIT:R52
-      - RO:0002500
-
-  capability of:
-    is_a: actively involves
-    inverse: capable of
-
-  enables:
-    is_a: participates in
-    description: >-
-      holds between a physical entity and a process, where the physical entity executes the process
-    domain: physical entity
-    range: biological process or activity
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    in_subset:
-      - translator_minimal
-    inverse: enabled by
-    exact_mappings:
-      - RO:0002327
-
-  enabled by:
-    is_a: has participant
-    description: >-
-      holds between a process and a physical entity, where the physical entity executes the process
-    domain: biological process or activity
-    range: physical entity
-    in_subset:
-      - translator_minimal
-    inverse: enables
-    exact_mappings:
-      - RO:0002333
-
-  derives into:
-    is_a: related to at instance level
-    aliases: ['is normal cell origin of disease','may be normal cell origin of disease']
-    description: >-
-      holds between two distinct material entities, the old entity and
-      the new entity, in which the new entity begins to exist when
-      the old entity ceases to exist, and the new entity inherits
-      the significant portion of the matter of the old entity
-    in_subset:
-      - translator_minimal
-    inverse: derives from
-    exact_mappings:
-      - RO:0001001
-      - SEMMEDDB:CONVERTS_TO
-      - SEMMEDDB:converts_to
-      # RTX posted terms as inverse of 'biolink:derives_from'
-      - FMA:derives
-
-  derives from:
-    is_a: related to at instance level
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    description: >-
-      holds between two distinct material entities, the new entity
-      and the old entity, in which the new entity begins to exist
-      when the old entity ceases to exist, and the new entity
-      inherits the significant portion of the matter of the old entity
-    in_subset:
-      - translator_minimal
-      - samples
-    inverse: derives into
-    exact_mappings:
-      - RO:0001000
-      - FMA:derives_from
-      - DOID-PROPERTY:derives_from
-    narrow_mappings:
-      - CHEBI:has_functional_parent
-      - SNOMED:has_specimen_source_topography
-
-  is metabolite of:
-    is_a: derives from
-    description: >-
-      holds between two molecular entities in which the first one is derived
-      from the second one as a product of metabolism
-    domain: molecular entity
-    range: molecular entity
-    in_subset:
-      - translator_minimal
-    inverse: has metabolite
-    comments:
-      - The CHEBI ID represents a role rather than a predicate
-    exact_mappings:
-      - CHEBI:25212
-
-  has metabolite:
-    is_a: derives into
-    description: >-
-      holds between two molecular entities in which the second one is derived from the first
-      one as a product of metabolism
-    domain: molecular entity
-    range: molecular entity
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    in_subset:
-      - translator_minimal
-    comments:
-      - The CHEBI ID represents a role rather than a predicate
-    exact_mappings:
-      - CHEBI:25212
-
-  food component of:
-    is_a: part of
-    description: >-
-      holds between a one or more chemical entities present in food,
-      irrespective of nutritional value (i.e. could also be a contaminant or additive)
-    domain: chemical entity
-    range: chemical entity
-    in_subset:
-      - translator_minimal
-    inverse: has food component
-    #mappings:
-    #  -
-
-  has food component:
-    is_a: has part
-    description: >-
-      holds between food and one or more chemical entities composing it,
-      irrespective of nutritional value (i.e. could also be a contaminant or additive)
-    domain: chemical entity
-    range: chemical entity
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    in_subset:
-      - translator_minimal
-
-  nutrient of:
-    is_a: food component of
-    description: >-
-      holds between a one or more chemical entities present in food,
-      irrespective of nutritional value (i.e. could also be a contaminant or additive)
-    domain: chemical entity
-    range: chemical entity
-    in_subset:
-      - translator_minimal
-    inverse: has nutrient
-    #exact_mappings:
-    #  -
-
-  has nutrient:
-    is_a: has food component
-    description: >-
-      one or more nutrients which are growth factors for a living organism
-    domain: chemical entity
-    range: chemical entity
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    in_subset:
-      - translator_minimal
-    exact_mappings:
-      - WIKIDATA:Q181394
-
-  is active ingredient of:
-    is_a: part of
-    description: >-
-      holds between a molecular entity and a drug, in which the former
-      is a part of the latter, and is a biologically active component
-    domain: molecular entity
-    range: drug
-    in_subset:
-      - translator_minimal
-    inverse: has active ingredient
-    mappings:
-      - RO:0002249
-
-  has active ingredient:
-    is_a: has part
-    description: >-
-      holds between a drug and a molecular entity in which the latter
-      is a part of the former, and is a biologically active component
-    domain: drug
-    range: molecular entity
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    in_subset:
-      - translator_minimal
-    inverse: is active ingredient of
-    mappings:
-      - RO:0002248
-
-  is excipient of:
-    is_a: part of
-    description: >-
-      holds between a molecular entity and a drug in which the former is
-      a part of the latter, and is a biologically inactive component
-    domain: molecular entity
-    range: drug
-    in_subset:
-      - translator_minimal
-    inverse: has excipient
-    mappings:
-      - WIKIDATA:Q902638
-
-  has excipient:
-    is_a: has part
-    description: >-
-      holds between a drug and a molecular entities in which the latter
-      is a part of the former, and is a biologically inactive component
-    domain: drug
-    range: molecular entity
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    in_subset:
-      - translator_minimal
-    mappings:
-      - WIKIDATA:Q902638
-
-  manifestation of:
-    is_a: related to at instance level
-    description: >-
-      that part of a phenomenon which is directly observable or
-      visibly expressed, or which gives evidence to the underlying
-      process; used in SemMedDB for linking things like dysfunctions
-      and processes to some disease or syndrome
-    range: disease
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    in_subset:
-      - translator_minimal
-    exact_mappings:
-      - SEMMEDDB:MANIFESTATION_OF
-      - SEMMEDDB:manifestation_of
-      - OMIM:manifestation_of
-    broad_mappings:
-      # Wikidata definition slightly broader: "inherent and characteristic embodiment of a given concept"
-      - WIKIDATA_PROPERTY:P1557
-    narrow_mappings:
-      - SNOMED:has_definitional_manifestation
-
-  has manifestation:
-    is_a: related to at instance level
-    domain: disease
-    inverse: manifestation of
-
-  produces:
-    is_a: related to at instance level
-    description: >-
-      holds between a material entity and a product that is generated
-      through the intentional actions or functioning of the material entity
-    in_subset:
-      - translator_minimal
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    related_mappings:
-      - GOREL:0001010
-    exact_mappings:
-      - RO:0003000
-      - WIKIDATA_PROPERTY:P1056
-      - SEMMEDDB:PRODUCES
-      - SEMMEDDB:produces
-    narrow_mappings:
-      - NCIT:R29
-      - SNOMED:has_process_output
-      - SNOMED:specimen_procedure_of
-
-  produced by:
-    is_a: related to at instance level
-    inverse: produces
-    exact_mappings:
-      - RO:0003001
-
-  consumes:
-    is_a: has input
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    narrow_mappings:
-      - RO:0004009
-
-  consumed by:
-    is_a: is input of
-    inverse: consumes
-
-  temporally related to:
-    is_a: related to at instance level
-    description: >-
-      holds between two entities with a temporal relationship
-    domain: occurrent
-    range: occurrent
-    symmetric: true
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    exact_mappings:
-      - SNOMED:temporally_related_to
-    narrow_mappings:
-      # The These RTX mappings are temporal in nature, but not with precedes ordering, so mapped here
-      - RO:0002082
-      - RO:0002083
-      - RO:0002092
-      - RO:0002093
-      - RO:0002223
-      - RO:0002224
-      - RO:0002229
-      - RO:0002230
-      - RO:0002488
-      - RO:0002489
-      - RO:0002492
-      - RO:0002493
-      - RO:0002496
-      - RO:0002497
-
-  precedes:
-    is_a: temporally related to
-    description: >-
-      holds between two processes, where one completes before the other begins
-    domain: occurrent
-    range: occurrent
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    in_subset:
-      - translator_minimal
-    close_mappings:
-      # the subject of these terms is a material entity, not a process,
-      # but affects a process which causes a second process to occur
-      - RO:0002263
-      - RO:0002264
-    exact_mappings:
-      - BFO:0000063
-      - SEMMEDDB:PRECEDES
-      - SEMMEDDB:precedes
-      - SNOMED:occurs_before
-    broad_mappings:
-      # the Wikidata definition is subtly broader, focusing on a series not strictly temporal in nature
-      - WIKIDATA_PROPERTY:P156
-    narrow_mappings:
-      - FMA:transforms_into
-      - RO:0002090
-      - RO:0002411
-      - RO:0002412
-
-  preceded by:
-    is_a: temporally related to
-    description: >-
-      holds between two processes, where the other is completed before the one begins
-    domain: occurrent
-    range: occurrent
-    inverse: precedes
-    in_subset:
-      - translator_minimal
-    exact_mappings:
-      - BFO:0000062
-    broad_mappings:
-      # Contributed by RTX as inverse of 'precedes'. Seems more generic to just processes, so we tag it as 'broad'?
-      - GENEPIO:0001739
-    narrow_mappings:
-      # RTX contributed mapping was given as the inverse of 'biolink:precedes'
-      - FMA:transforms_from
-      - RO:0002087
-      - RO:0002285
-
-  directly interacts with:
-    is_a: interacts with
-    description: Holds between chemical entities that physically and directly interact
-      with each other
-    domain: chemical entity
-    range: chemical entity or gene or gene product
-    symmetric: true
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    related_mappings:
-      - GAMMA:kd
-      - GAMMA:kb
-      - GAMMA:potency
-    exact_mappings:
-      - GAMMA:interacts_with
-    broad_mappings:
-      # Definition of this term is more generic than direct physical molecular interactions:
-      # A is connected to B iff there exists a fiat, material or temporal path between A and B.
-      - SIO:000203
-    narrow_mappings:
-      - PHAROS:drug_targets
-      - DRUGBANK:chelator
-      - GAMMA:antibody_binding
-      - GAMMA:pharmacological_chaperone
-      - GAMMA:releasing_agent
-      - GAMMA:pharmacological_chaperone
-      - GAMMA:releasing_agent
-      - GAMMA:binder
-      - GAMMA:binding
-      - GAMMA:ligand
-      - GAMMA:cofactor
-      - GAMMA:multitarget
-      - GAMMA:chaperone
-      - GAMMA:component
-      - GAMMA:adduct
-      - GAMMA:antibody
-      - CTD:affects_binding
-      - DGIdb:binder
-      - DGIdb:cofactor
-
-  affects expression in:
-    is_a: affects
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    description: Holds between a variant and an anatomical entity where the expression of the variant
-       is located in.
-    exact_mappings:
-      - GTEx:affects_expression_in
-
-  has variant part:
-    is_a: has part
-    description: holds between a nucleic acid entity and a nucleic acid entity that is a sub-component of it
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    exact_mappings:
-      - GENO:0000382
-
-  variant part of:
-    is_a: part of
-    inverse: has variant part
-
-  related condition:
-    is_a: related to at instance level
-    symmetric: true
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    exact_mappings:
-      - GENO:0000790
-
-  ## Predicates relating variants to genes
-
-  is sequence variant of:
-    is_a: related to at instance level
-    aliases: ['gene product sequence variation encoded by gene mutant', 'allelic variant of', 'gene product variant of gene product']
-    description: holds between a sequence variant and a nucleic acid entity
-    domain: sequence variant
-    range: nucleic acid entity
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    narrow_mappings:
-      - WIKIDATA:P3433
-
-  has sequence variant:
-    is_a: related to at instance level
-    inverse: is sequence variant of
-    domain: nucleic acid entity
-    range: sequence variant
-
-  is missense variant of:
-    is_a: is sequence variant of
-    description: holds between a gene  and a sequence variant, such the sequence variant
-      results in a different amino acid sequence but where the length is preserved.
-    domain: sequence variant
-    range: gene
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    exact_mappings:
-      - SO:0001583
-
-  has missense variant:
-    is_a: has sequence variant
-    domain: gene
-    range: sequence variant
-    inverse: is missense variant of
-
-  is synonymous variant of:
-    is_a: is sequence variant of
-    description: holds between a sequence variant and a gene, such the sequence variant
-      is in the coding sequence of the gene, but results in the same amino acid sequence
-    domain: sequence variant
-    range: gene
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    exact_mappings:
-      - SO:0001819
-
-  has synonymous variant:
-    is_a: has sequence variant
-    domain: gene
-    range: sequence variant
-    inverse: is synonymous variant of
-    aliases: ['stop gained']
-
-  is nonsense variant of:
-    is_a: is sequence variant of
-    description: holds between a sequence variant and a gene, such the sequence variant
-      results in a premature stop codon
-    domain: sequence variant
-    range: gene
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    broad_mappings:
-      # Term definition broader than nonsense codon: A sequence variant whereby
-      # the gene product has diminished or abolished function.
-      - SO:0002054
-
-  has nonsense variant:
-    is_a: has sequence variant
-    domain: gene
-    range: sequence variant
-    inverse: is nonsense variant of
-
-  is frameshift variant of:
-    is_a: is sequence variant of
-    description: holds between a sequence variant and a gene, such the sequence variant
-      causes a disruption of the translational reading frame, because the number of
-      nucleotides inserted or deleted is not a multiple of three.
-    domain: sequence variant
-    range: gene
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    exact_mappings:
-      - SO:0001589
-    aliases: ['frameshift variant', 'start lost', 'stop lost']
-
-  has frameshift variant:
-    is_a: has sequence variant
-    inverse: is frameshift variant of
-    domain: gene
-    range: sequence variant
-    aliases: ['splice region variant', 'splice acceptor variant', 'splice donor variant']
-
-  is splice site variant of:
-    is_a: is sequence variant of
-    description: holds between a sequence variant and a gene, such the sequence variant
-      is in the canonical splice site of one of the gene's exons.
-    domain: sequence variant
-    range: gene
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    exact_mappings:
-      - SO:0001629
-
-
-  has splice site variant:
-    is_a: has sequence variant
-    domain: gene
-    range: sequence variant
-    inverse: is splice site variant of
-    aliases: ['downstream gene variant', 'upstream gene variant']
-
-  is nearby variant of:
-    is_a: is sequence variant of
-    description: holds between a sequence variant and a gene sequence that the variant
-      is genomically close to.
-    domain: sequence variant
-    range: gene
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    exact_mappings:
-      - GAMMA:0000102
-
-  has nearby variant:
-    is_a: has sequence variant
-    domain: gene
-    range: sequence variant
-    inverse: is nearby variant of
-    aliases: ['intron variant', '3 prime UTR variant', '5 prime UTR variant', '5 prime UTR premature start codon gain variant', 'non coding transcript exon variant']
-
-  is non coding variant of:
-    is_a: is sequence variant of
-    description: holds between a sequence variant and a gene, where the variant does
-      not affect the coding sequence
-    domain: sequence variant
-    range: gene
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    exact_mappings:
-      - GAMMA:0000103
-
-  has non coding variant:
-    is_a: has sequence variant
-    domain: gene
-    range: sequence variant
-    inverse: is non coding variant of
-
-  # relating disease to process
-
-  disease has basis in:
-    description: A relation that holds between a disease and an entity where the state
-      of the entity has contribution to the disease.
-    is_a: related to at instance level
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    narrow_mappings:
-      # These two MONDO terms seem more particular than the predicate
-      - MONDO:disease_has_basis_in_development_of
-      - MONDO:disease_has_basis_in_accumulation_of
-
-
-  # These may be pushable to causal relationships, but seem important for clarity
-  # Also because causes adverse event tends to be very noisy and it's useful to be able
-  # to distinguish it.  maybe not the best way to do that though.
-
-  causes adverse event:
-    is_a: causes
-    description: holds between a drug and a disease or phenotype that can be caused
-      by the drug
-    domain: drug
-    range: disease or phenotypic feature
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-
-  adverse event caused by:
-    is_a: causes
-    domain: disease or phenotypic feature
-    range: drug
-    inverse: causes adverse event
-
-  contraindicated for:
-    is_a: related to at instance level
-    description: Holds between a drug and a disease or phenotype, such that a person
-      with that disease should not be treated with the drug.
-    domain: drug
-    range: disease or phenotypic feature
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    exact_mappings:
-      - NCIT:C37933
-
-  has contraindication:
-    is_a: related to at instance level
-    domain: disease or phenotypic feature
-    range: drug
-    inverse: contraindicated for
-
-  # The remaining new slots are here because we ran across them somewhere and
-  # they didn't seem to map well to anything else.
-
-  has not completed:
-    is_a: related to at instance level
-    description: holds between an entity and a process that the entity is capable of,
-      but has not completed
-    exact_mappings:
-      - CL:has_not_completed
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-
-  not completed by:
-    is_a: related to at instance level
-    inverse: has not completed
-
-  has completed:
-    is_a: related to at instance level
-    description: holds between an entity and a process that the entity is capable of
-      and has completed
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-
-  completed by:
-    is_a: related to at instance level
-    inverse: has completed
-
-  decreases molecular interaction:
-    is_a: molecularly interacts with
-    description: indicates that the source decreases the molecular interaction between
-      the target and some other chemical entity
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    mixins:
-      - decreases amount or activity of
-
-  molecular interaction decreased by:
-    is_a: molecularly interacts with
-    inverse: decreases molecular interaction
-
-  increases molecular interaction:
-    is_a: molecularly interacts with
-    description: indicates that the source increases the molecular interaction between
-      the target and some other chemical entity
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    mixins:
-      - increases amount or activity of
-
-  molecular interaction increased by:
-    is_a: molecularly interacts with
-    inverse: increases molecular interaction
-
-  in linkage disequilibrium with:
-    is_a: related to at instance level
-    description: holds between two sequence variants, the presence of which are correlated
-      in a population
-    symmetric: true
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    exact_mappings:
-      - NCIT:C16798
-
-  has increased amount:
-    is_a: related to at instance level
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    narrow_mappings:
-      - CL:has_high_plasma_membrane_amount
-
-  increased amount of:
-    is_a: related to at instance level
-    inverse: has increased amount
-
-  has decreased amount:
-    is_a: related to at instance level
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    narrow_mappings:
-      - CL:has_low_plasma_membrane_amount
-
-  decreased amount in:
-    is_a: related to at instance level
-    inverse: has decreased amount
-
-  lacks part:
-    is_a: related to at instance level
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-
-  missing from:
-    is_a: related to at instance level
-    inverse: lacks part
-
-  develops from:
-    is_a: related to at instance level
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    close_mappings:
-      # RTX mapping seems to be inverse of 'biolink:develops_from'
-      - RO:0002203
-      - FMA:develops_into
-    exact_mappings:
-      - BTO:develops_from
-      - DDANAT:develops_from
-      - FMA:develops_from
-      - RO:0002202
-    narrow_mappings:
-      - RO:0002207
-      - RO:0002225 # x develops from part of y if and only if there exists some z such that x develops from z and z is part of y
-      - RO:0002226 # x develops_in y if x is located in y whilst x is developing
-
-  develops into:
-     is_a: related to at instance level
-     inverse: develops from
-
-  in taxon:
-    aliases: ['instance of', 'is organism source of gene product', 'organism has gene', 'gene found in organism',' gene product has organism source']
-    is_a: related to at instance level
-    domain: thing with taxon
-    range: organism taxon
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-    description: >-
-      connects an entity to its taxonomic classification. Only certain kinds
-      of entities can be taxonomically classified; see 'thing with taxon'
-    in_subset:
-      - translator_minimal
-    exact_mappings:
-      - RO:0002162
-      - WIKIDATA_PROPERTY:P703
-    narrow_mappings:
-      - RO:0002160
-
-  taxon of:
-    is_a: related to at instance level
-    inverse: in taxon
-    domain: organism taxon
-    range: thing with taxon
-
-  has molecular consequence:
-    is_a: related to at instance level
-    aliases: ['allele has activity']
-    description: >-
-      connects a sequence variant to a class describing the molecular
-      consequence. E.g.  SO:0001583
-    range: ontology class
-    annotations:
-      tag: biolink:canonical_predicate
-      value: true
-
-  is molecular consequence of:
-    is_a: related to at instance level
-    domain: ontology class
-    inverse: has molecular consequence
-
-## --------------------
-## ASSOCIATION SLOTS
-## --------------------
-
-  association slot:
-    abstract: true
-    domain: association
-    aliases: ['edge property','statement property']
-    description: >-
-      any slot that relates an association to another entity
-
-  original_subject:
-    is_a: association slot
-    description: >-
-      used to hold the original subject of a relation (or predicate) that an external knowledge
-      source uses before transformation to match the biolink-model specification.
-
-  original_object:
-    is_a: association slot
-    description: >-
-      used to hold the original object of a relation (or predicate) that an external knowledge
-      source uses before transformation to match the biolink-model specification.
-
-  original_predicate:
-    aliases: ['original relation', 'relation']
-    is_a: association slot
-    description: >-
-      used to hold the original relation/predicate that an external knowledge
-      source uses before transformation to match the biolink-model specification.
-    id_prefixes:
-      - RO
-      - BSPO
-      - SIO
-    domain: association
-    range: uriorcurie
-
-  subject:
-    is_a: association slot
-    local_names:
-      ga4gh: annotation subject
-      neo4j: node with outgoing relationship
-    description: >-
-      connects an association to the subject of the association.
-      For example, in a gene-to-phenotype association, the gene is subject and phenotype is object.
-    required: true
-    range: named thing
-    slot_uri: rdf:subject
-    exact_mappings:
-      - owl:annotatedSource
-      - OBAN:association_has_subject
-
-  object:
-    is_a: association slot
-    description: >-
-      connects an association to the object of the association.
-      For example, in a gene-to-phenotype association, the gene is subject and phenotype is object.
-    required: true
-    range: named thing
-    local_names:
-      ga4gh: descriptor
-      neo4j: node with incoming relationship
-    slot_uri: rdf:object
-    exact_mappings:
-      - owl:annotatedTarget
-      - OBAN:association_has_object
-
-  predicate:
-    is_a: association slot
-    description: >-
-      A high-level grouping for the relationship type. AKA minimal predicate.
-      This is analogous to category for nodes.
-    domain: association
-    notes: >-
-      Has a value from the Biolink related_to hierarchy. In RDF,  this
-      corresponds to rdf:predicate and in Neo4j this corresponds to the
-      relationship type. The convention is for an edge label in snake_case
-      form. For example, biolink:related_to, biolink:causes, biolink:treats
-    range: predicate type
-    required: true
-    local_names:
-      ga4gh: annotation predicate
-      translator: predicate
-    slot_uri: rdf:predicate
-    exact_mappings:
-      - owl:annotatedProperty
-      - OBAN:association_has_predicate
-
-  logical interpretation:
-    is_a: association slot
-    required: false
-    domain: association
-    range: logical_interpretation_enum
-    exact_mappings:
-      - os:LogicalInterpretation
-
-  relation:
-    deprecated: true
-
-  negated:
-    is_a: association slot
-    range: boolean
-    description: >-
-      if set to true, then the association is negated i.e. is not true
-
-  has confidence level:
-    is_a: association slot
-    range: confidence level
-    description: >-
-      connects an association to a qualitative term denoting the level of confidence
-
-  has evidence:
-    is_a: association slot
-    range: evidence type
-    description: >-
-      connects an association to an instance of supporting evidence
-    exact_mappings:
-      - RO:0002558
-    multivalued: true
-
-  mechanism of action:
-    is_a: association slot
-    range: boolean
-    description: >-
-      a boolean flag to indicate if the edge is part of a path or subgraph of a knowledge graph that constitutes
-      the mechanism of action for a result.
-    exact_mappings:
-      - NCIT:C54680
-      - MI:2044
-      - LOINC:MTHU019741
-
-  knowledge source:
-    is_a: association slot
-    description: >-
-      An Information Resource from which the knowledge expressed in an Association was
-      retrieved, directly or indirectly. This can be any resource through which the
-      knowledge passed on its way to its currently serialized form. In practice,
-      implementers should use one of the more specific subtypes of this generic property.
-    range: information resource
-    multivalued: true
-    close_mappings:
-      - pav:providedBy
-
-  provided by:
-    is_a: association slot
-    deprecated: >-
-      This slot is deprecated and replaced by a set of more precise slots for describing
-      the source retrieval provenance of an Association.  These include 'knowledge source'
-      and its descendants 'primary knowledge source', 'original knowledge source', and
-      'aggregator knowledge source'.
-    # deprecated_element_has_exact_replacement: knowledge source
-    description: >-
-      connects an association to the agent (person, organization or group) that provided it
-    range: agent
-    multivalued: true
-    exact_mappings:
-      - pav:providedBy
-
-  primary knowledge source:
-     is_a: knowledge source
-     description: >-
-       The most upstream source of the knowledge expressed in an Association that an
-       implementer can identify (may or may not be the 'original' source).
-     range: information resource
-     multivalued: false
-
-  original knowledge source:
-    is_a: primary knowledge source
-    description: >-
-      The Information Resource that created the original record of the knowledge expressed
-      in an Association (e.g. via curation of the knowledge from the literature, or
-      generation of the knowledge de novo through computation, reasoning, inference over
-      data).
-    range: information resource
-    multivalued: false
-
-  aggregator knowledge source:
-    is_a: knowledge source
-    description: >-
-      An intermediate aggregator resource from which knowledge expressed in an Association was
-      retrieved downstream of the original source, on its path to its current serialized form.
-    range: information resource
-    multivalued: true
-
-  supporting data source:
-    is_a: association slot
-    description: >-
-      An Information Resource from which data was retrieved and subsequently used as
-      evidence to generate the knowledge expressed in an Association (e.g. through
-      computation on, reasoning or inference over the retrieved data).
-    range: information resource
-    multivalued: true
-
-  association type:
-    is_a: association slot
-    range: category type
-    deprecated: >-
-      This slot is deprecated in favor of 'category' slot.
-    deprecated_element_has_exact_replacement: category
-    description: >-
-      connects an association to the category of association (e.g. gene to phenotype)
-
-  chi squared statistic:
-    is_a: association slot
-    range: float
-    description: >-
-      represents the chi-squared statistic computed from observations
-    exact_mappings:
-      - STATO:0000030
-
-  p value:
-    is_a: association slot
-    range: float
-    description: >-
-      A quantitative confidence value that represents the probability of
-      obtaining a result at least as extreme as that actually obtained,
-      assuming that the actual value was the result of chance alone.
-    exact_mappings:
-      - OBI:0000175
-      - NCIT:C44185
-      - EDAM-DATA:1669
-
-  interacting molecules category:
-    is_a: association slot
-    range: ontology class
-    exact_mappings:
-      - MI:1046
-    values_from:
-      - MI
-    examples:
-      - value: MI:1048
-        description: smallmolecule-protein
-
-  quantifier qualifier:
-    is_a: association slot
-    range: ontology class
-    description: >-
-      A measurable quantity for the object of the association
-    narrow_mappings:
-      # TODO: RTX contributed terms mapped here... May need review?
-      - LOINC:analyzes
-      - LOINC:measured_by
-      - LOINC:property_of
-      - SEMMEDDB:measures
-      - UMLS:measures
-
-  catalyst qualifier:
-    is_a: association slot
-    multivalued: true
-    range: macromolecular machine mixin
-    description: >-
-      a qualifier that connects an association between two causally connected
-      entities (for example, two chemical entities, or a chemical entity in
-      that changes location) and the gene product, gene, or complex that
-      enables or catalyzes the change.
-
-  expression site:
-    description: >-
-      location in which gene or protein expression takes place.
-      May be cell, tissue, or organ.
-    is_a: association slot
-    range: anatomical entity
-    examples:
-      - value: UBERON:0002037
-        description: cerebellum
-
-  stage qualifier:
-    description: >-
-      stage during which gene or protein expression of takes place.
-    is_a: association slot
-    range: life stage
-    # path: "object/during"
-    examples:
-      - value: UBERON:0000069
-        description: larval stage
-
-  phenotypic state:
-    description: >-
-      in experiments (e.g. gene expression) assaying diseased or unhealthy
-      tissue, the phenotypic state can be put here, e.g. MONDO ID.
-      For healthy tissues, use XXX.
-    is_a: association slot
-    range: disease or phenotypic feature
-
-  qualifiers:
-    singular_name: qualifier
-    description: >-
-      connects an association to qualifiers that modify or
-      qualify the meaning of that association
-    local_names:
-      ga4gh: annotation qualifier
-    is_a: association slot
-    multivalued: true
-    range: ontology class
-
-  frequency qualifier:
-    description: >-
-      a qualifier used in a phenotypic association to state how frequent the phenotype is observed in the subject
-    is_a: association slot
-    range: frequency value
-
-  severity qualifier:
-    description: >-
-      a qualifier used in a phenotypic association to state
-      how severe the phenotype is in the subject
-    is_a: association slot
-    range: severity value
-
-  sex qualifier:
-    description: >-
-      a qualifier used in a phenotypic association to state whether
-      the association is specific to a particular sex.
-    is_a: association slot
-    range: biological sex
-
-  onset qualifier:
-    description: >-
-      a qualifier used in a phenotypic association to state
-      when the phenotype appears is in the subject
-    is_a: association slot
-    range: onset
-
-  clinical modifier qualifier:
-    description: >-
-      Used to characterize and specify the phenotypic abnormalities
-      defined in the Phenotypic abnormality subontology,
-      with respect to severity, laterality, age of onset, and other aspects
-    is_a: association slot
-    range: clinical modifier
-
-  sequence variant qualifier:
-    description: >-
-      a qualifier used in an association with the variant
-    is_a: association slot
-    range: sequence variant
-
-  publications:
-    singular_name: publication
-    description: >-
-      connects an association to publications supporting the association
-    is_a: association slot
-    multivalued: true
-    range: publication
-
-  associated environmental context:
-    is_a: association slot
-    description: >-
-      An attribute that can be applied to an association where the association holds between two entities
-      located or occurring in a particular environment. For example, two microbial taxa may interact in the context of
-      a human gut; a disease may give rise to a particular phenotype in a particular environmental exposure.
-  # TODO: add examples of values for this property.
-
-  sequence localization attribute:
-    is_a: association slot
-    domain: genomic sequence localization
-    description: >-
-      An attribute that can be applied to a genome sequence localization edge. These edges
-      connect a nucleic acid entity such as an exon to an entity such as a chromosome. Edge properties are used
-      to ascribe specific positional information and other metadata to the localization. In pragmatic terms
-      this can be thought of as columns in a GFF3 line.
-
-  interbase coordinate:
-    is_a: sequence localization attribute
-    aliases: ['zero-based', 'half-open', 'space-based']
-    description: >-
-      A position in interbase coordinates. Interbase coordinates start at position 0 instead of position 1.
-      This is applied to a sequence localization edge.
-    range: integer
-
-  start interbase coordinate:
-    is_a: interbase coordinate
-    description: >-
-      The position at which the subject nucleic acid entity starts
-      on the chromosome or other entity to which it is located on.
-      (ie: the start of the sequence being referenced is 0).
-    close_mappings:
-      - faldo:begin
-
-  end interbase coordinate:
-    is_a: interbase coordinate
-    description: >-
-      The position at which the subject nucleic acid entity ends
-      on the chromosome or other entity to which it is located on.
-    close_mappings:
-      - faldo:end
-
-  start coordinate:
-    is_a: base coordinate
-    aliases: ['start']
-    description: >-
-      The position at which the subject genomic entity starts
-      on the chromosome or other entity to which it is located on.
-      (ie: the start of the sequence being referenced is 1).
-    exact_mappings:
-      - gff3:start
-    close_mappings:
-      - faldo:begin
-
-  end coordinate:
-    is_a: base coordinate
-    aliases: ['end']
-    description: >-
-      The position at which the subject genomic entity ends
-      on the chromosome or other entity to which it is located on.
-    exact_mappings:
-      - gff3:end
-    close_mappings:
-      - faldo:end
-
-  genome build:
-    is_a: sequence localization attribute
-    description: >-
-      The version of the genome on which a feature is located.
-      For example, GRCh38 for Homo sapiens.
-    range: strand_enum
-    exact_mappings:
-      - gff3:strand
-
-  strand:
-    is_a: sequence localization attribute
-    description: >-
-      The strand on which a feature is located. Has a value of '+'
-      (sense strand or forward strand) or '-' (anti-sense strand or reverse strand).
-    range: strand_enum
-    exact_mappings:
-      - gff3:strand
-
-  phase:
-    is_a: sequence localization attribute
-    domain: coding sequence
-    description: >-
-      The phase for a coding sequence entity. For example, phase of a
-      CDS as represented in a GFF3 with a value of 0, 1 or 2.
-    range: phase_enum
-    exact_mappings:
-      - gff3:phase
-
-  FDA approval status:
-    is_a: association slot
-    description: >-
-    range: FDA_approval_status_enum
-
-classes:
-
-  ## ----------
-  ## ATTRIBUTES
-  ## ----------
-
-  ## Ontology Classes
-
-  ontology class:
-    mixin: true
-    description: >-
-      a concept or class in an ontology, vocabulary or thesaurus. Note that nodes in
-      a biolink compatible KG can be considered both instances of biolink classes, and
-      OWL classes in their own right. In general you should not need to use this class directly.
-      Instead, use the appropriate biolink class. For example, for the GO concept of endocytosis (GO:0006897),
-      use bl:BiologicalProcess as the type.
-    exact_mappings:
-      - owl:Class
-      - schema:Class
-    comments:
-      - >-
-         This is modeled as a mixin. 'ontology class' should not be the primary type of a
-         node in the KG. Instead you should use an informative bioloink category, such as AnatomicalEntity
-         (for Uberon classes), ChemicalSubstance (for CHEBI or CHEMBL), etc
-      - >-
-         Note that formally this is a metaclass. Instances of this class are instances in the graph,
-         but can be the object of 'type' edges. For example, if we had a node in the graph representing
-         a specific brain of a specific patient (e.g brain001), this could have a category of bl:Sample,
-         and by typed more specifically with an ontology class UBERON:nnn, which has as category bl:AnatomicalEntity
-    see_also:
-      - https://github.com/biolink/biolink-model/issues/486
-    examples:
-      - value: UBERON:0000955
-        description: >-
-          the class 'brain' from the Uberon anatomy ontology
-    id_prefixes:
-      - MESH
-      - UMLS
-      - KEGG.BRITE ## br/ko number
-
-  annotation:
-    description: >-
-      Biolink Model root class for entity annotations.
-    abstract: true
-
-  quantity value:
-    is_a: annotation
-    description: >-
-      A value of an attribute that is quantitative and measurable,
-      expressed as a combination of a unit and a numeric value
-    slots:
-      - has unit
-      - has numeric value
-
-  # Alignment attempted of the biolink:Attribute model
-  # to the proposed TRAPI Release 1.1 Attribute schema, i.e.
-  #
-  # attribute_name: "assertionAuthoredBy",
-  # attribute_type: SEPIO:0000130,
-  # value: "ORCID:12345",
-  # value_type: "wd:Q51044",
-  # value_type_name: "ORCID ID"
-  # url: https://orcid.org/12345
-  # source: ORCID
-
-  attribute:
-    is_a: annotation
-    mixins:
-      - ontology class
-    description: >-
-      A property or characteristic of an entity.
-      For example, an apple may have properties such as color, shape, age, crispiness.
-      An environmental sample may have attributes such as depth, lat, long, material.
-    slots:
-      - name                   # 'attribute_name'
-      - has attribute type     # 'attribute_type'
-      # 'value', 'value_type', 'value_type_name'
-      # extracted from either of the next two slots
-      - has quantitative value
-      - has qualitative value
-      - iri                    # 'url'
-      - source                 # 'source'
-    slot_usage:
-      name:
-        description: >-
-          The human-readable 'attribute name' can be set to a string which reflects its context of
-          interpretation, e.g. SEPIO evidence/provenance/confidence annotation or it can default
-          to the name associated with the 'has attribute type' slot ontology term.
-    id_prefixes:
-      - EDAM-DATA
-      - EDAM-FORMAT
-      - EDAM-OPERATION
-      - EDAM-TOPIC
-    exact_mappings:
-      - SIO:000614
-    in_subset:
-      - samples
-
-  biological sex:
-    is_a: attribute
-    exact_mappings:
-     - PATO:0000047
-
-  phenotypic sex:
-    is_a: biological sex
-    description: >-
-      An attribute corresponding to the phenotypic sex of the individual,
-      based upon the reproductive organs present.
-    exact_mappings:
-     - PATO:0001894
-
-  genotypic sex:
-    is_a: biological sex
-    description: >-
-      An attribute corresponding to the genotypic sex of the individual,
-      based upon genotypic composition of sex chromosomes.
-    exact_mappings:
-     - PATO:0020000
-
-  severity value:
-    is_a: attribute
-    description: >-
-      describes the severity of a phenotypic feature or disease
-
-  relationship quantifier:
-    mixin: true
-
-  sensitivity quantifier:
-    is_a: relationship quantifier
-    mixin: true
-
-  specificity quantifier:
-    is_a: relationship quantifier
-    mixin: true
-
-  pathognomonicity quantifier:
-    is_a: specificity quantifier
-    description: >-
-      A relationship quantifier between a variant or symptom and a disease, which is
-      high when the presence of the feature implies the existence of the disease
-    mixin: true
-
-  frequency quantifier:
-    is_a: relationship quantifier
-    mixin: true
-    slots:
-      - has count
-      - has total
-      - has quotient
-      - has percentage
-
-  chemical or drug or treatment:
-    mixin: true
-
-  ## ------
-  ## THINGS
-  ## ------
-
-  entity:
-    description: >-
-      Root Biolink Model class for all things and informational relationships, real or imagined.
-    abstract: true
-    slots:
-      - id
-      - iri
-      - category
-      - type   # rdf:type
-      - name
-      - description
-      - source
-      - provided by
-      - has attribute
-      # evidence code(s)?
-
-  named thing:
-    is_a: entity
-    description: "a databased entity or concept/class"
-    slot_usage:
-      category:
-        range: named thing
-        required: true
-    exact_mappings:
-      - BFO:0000001
-      - WIKIDATA:Q35120
-      # UMLS Semantic Group "Objects"
-      - UMLSSG:OBJC
-      # Entity
-      - STY:T071
-      - dcid:Thing
-
-  relationship type:
-    is_a: ontology class
-    description: >-
-      An OWL property used as an edge label
-
-  gene ontology class:
-    mixin: true
-    description: >-
-      an ontology class that describes a functional aspect of a gene, gene prodoct or complex
-    is_a: ontology class
-    in_subset:
-      - testing
-
-  unclassified ontology class:
-    mixin: true
-    description: >-
-      this is used for nodes that are taken from an ontology but are not typed using an existing biolink class
-    is_a: ontology class
-    in_subset:
-      - testing
-
-  taxonomic rank:
-    description: >-
-      A descriptor for the rank within a taxonomic classification.
-      Example instance: TAXRANK:0000017 (kingdom)
-    is_a: ontology class
-    id_prefixes:
-      - TAXRANK
-    mappings:
-      - WIKIDATA:Q427626
-
-  organism taxon:
-    aliases: ['taxon', 'taxonomic classification']
-    description: >-
-      A classification of a set of organisms. Example instances:
-      NCBITaxon:9606 (Homo sapiens), NCBITaxon:2 (Bacteria).
-      Can also be used to represent strains or subspecies.
-    is_a: named thing
-    slot_usage:
-      has taxonomic rank:
-        range: taxonomic rank
-        multivalued: false
-        mappings:
-          - WIKIDATA:P105
-    values_from:
-      - NCBITaxon
-    exact_mappings:
-      - WIKIDATA:Q16521
-      - STY:T001
-      - bioschemas:Taxon
-    narrow_mappings:
-      - dcid:BiologicalSpecies
-    id_prefixes:
-      - NCBITaxon
-      - MESH
-    in_subset:
-      - model_organism_database
-
-  ## Temporal Entities
-
-  event:
-    is_a: named thing
-    description: >-
-      Something that happens at a given place and time.
-    exact_mappings:
-      - NCIT:C25499
-      # UMLS "Event"
-      - STY:T051
-
-  ## Administrative Entities
-
-  administrative entity:
-    is_a: named thing
-    abstract: true
-
-  agent:
-    is_a: administrative entity
-    aliases: ['group']
-    description: >-
-      person, group, organization or project that provides
-      a piece of information (i.e. a knowledge association)
-    slots:
-      - affiliation
-      - address
-    exact_mappings:
-      - prov:Agent
-      - dct:Agent
-    narrow_mappings:
-      # Organization
-      - UMLSSG:ORGA
-      - STY:T092
-      # Health Care Related Organization
-      - STY:T093
-      # Professional Society
-      - STY:T094
-      # Self-help or Relief Organization
-      - STY:T095
-      # Group
-      - STY:T096
-    slot_usage:
-      id:
-        required: true
-        description: >-
-          Different classes of agents have distinct preferred identifiers.
-          For publishers, use the ISBN publisher code.
-          See https://grp.isbn-international.org/ for publisher code lookups.
-          For editors, authors and  individual providers, use the individual's
-          ORCID if available; Otherwise, a ScopusID, ResearchID or
-          Google Scholar ID ('GSID') may be used if the author ORCID is unknown.
-          Institutional agents could be identified by an
-          International Standard Name Identifier ('ISNI') code.
-        values_from:
-          # CURIE space for publishers
-          - isbn
-          # CURIE space for authors
-          - ORCID
-          - ScopusID
-          - ResearchID
-          - GSID
-          # Institutional agents
-          - isni
-      name:
-        description: >-
-          it is recommended that an author's 'name' property
-          be formatted as "surname, firstname initial."
-    id_prefixes:
-      - isbn
-      - ORCID
-      - ScopusID
-      - ResearchID
-      - GSID
-      - isni
-
-  ## General Information Entities
-
-  information content entity:
-    aliases: ['information', 'information artefact', 'information entity']
-    abstract: true
-    is_a: named thing
-    description: >-
-      a piece of information that typically describes
-      some topic of discourse or is used as support.
-    slots:
-      - license
-      - rights
-      - format
-      - creation date
-    id_prefixes:
-      - doi
-    exact_mappings:
-      - IAO:0000030
-    narrow_mappings:
-      # UMLS Semantic Group "Concepts & Ideas"
-      - UMLSSG:CONC
-      # Conceptual Entity
-      - STY:T077
-      # Idea or Concept
-      - STY:T078
-      # Temporal Concept
-      - STY:T079
-      # Qualitative Concept
-      - STY:T080
-      # Quantitative Concept
-      - STY:T081
-      # Spatial Concept
-      - STY:T082
-      # Regulation or Law
-      - STY:T089
-      # Group Attribute
-      - STY:T102
-      # Functional Concept
-      - STY:T169
-      # Language
-      - STY:T171
-      # Classification
-      - STY:T185
-
-  dataset:
-    description: >-
-      an item that refers to a collection of data from a data source.
-    is_a: information content entity
-    exact_mappings:
-      - IAO:0000100
-      - dctypes:Dataset
-      - schema:dataset
-      - dcid:Dataset
-
-  dataset distribution:
-    is_a: information content entity
-    description: >-
-      an item that holds distribution level information about a dataset.
-    slots:
-      - distribution download url
-    exact_mappings:
-      - dcat:Distribution
-
-  dataset version:
-    description: >-
-      an item that holds version level information about a dataset.
-    is_a: information content entity
-    slots:
-      - has dataset
-      - ingest date
-      - has distribution
-
-  dataset summary:
-    description: >-
-      an item that holds summary level information about a dataset.
-    is_a: information content entity
-    slots:
-      - source web page
-      - source logo
-
-  confidence level:
-    is_a: information content entity
-    description: >-
-      Level of confidence in a statement
-    values_from:
-      - cio
-    exact_mappings:
-      - CIO:0000028
-      # statement confidence
-      - SEPIO:0000187
-    close_mappings:
-      # assertion confidence levels
-      - SEPIO:0000167
-
-  evidence type:
-    is_a: information content entity
-    aliases: ['evidence code']
-    description: >-
-      Class of evidence that supports an association
-    values_from:
-      - eco
-    exact_mappings:
-      - ECO:0000000
-
-  information resource:
-    is_a: information content entity
-    aliases: ['knowledgebase']
-    description: >-
-      A database or knowledgebase and its supporting ecosystem of interfaces
-      and services that deliver content to consumers (e.g. web portals, APIs,
-      query endpoints, streaming services, data downloads, etc.).
-      A single Information Resource by this definition may span many different datasets or
-      databases, and include many access endpoints and user
-      interfaces. Information Resources include project-specific resources
-      such as a Translator Knowledge Provider, and community knowledgebases like ChemBL, OMIM, or DGIdb.
-    in_subset:
-        - translator_minimal
-
-
-  ## Publications
-
-  # TODO: to review additional ontology relating to Publications, such as http://www.sparontologies.net/ontologies
-  publication:
-    is_a: information content entity
-    description: >-
-      Any published piece of information. Can refer to a whole publication,
-      its encompassing publication (i.e. journal or book) or to a part of a
-      publication, if of significant knowledge scope (e.g. a figure, figure
-      legend, or section highlighted by NLP). The scope is intended to be
-      general and include information published on the web, as well as printed
-      materials, either directly or in one of the Publication Biolink
-      category subclasses.
-    slots:
-      - authors
-      - pages
-      - summary
-      - keywords
-      - mesh terms
-      - xref
-    # In addition to embedded slots, instances of 'contributor association'
-    # may be used to more extensively document publisher, editor and author details
-    slot_usage:
-      id:
-        description: >-
-          Different kinds of publication subtypes will have different preferred
-          identifiers (curies when feasible). Precedence of identifiers for
-          scientific articles is as follows: PMID if available; DOI if not; actual
-          alternate CURIE otherwise. Enclosing publications (i.e. referenced by
-          'published in' node property) such as books and journals, should have
-          industry-standard identifier such as from ISBN and ISSN.
-      name:
-        description: >-
-          the 'title' of the publication is generally recorded in the 'name'
-          property (inherited from NamedThing). The field name 'title' is now also
-          tagged as an acceptable alias for the node property 'name' (just in case).
-      type:
-        slot_uri: dct:type
-        required: true
-        description: >-
-          Ontology term for publication type may be drawn from
-          Dublin Core types (https://www.dublincore.org/specifications/dublin-core/dcmi-type-vocabulary/),
-          FRBR-aligned Bibliographic Ontology (https://sparontologies.github.io/fabio/current/fabio.html),
-          the MESH publication types (https://www.nlm.nih.gov/mesh/pubtypes.html),
-          the Confederation of Open Access Repositories (COAR) Controlled Vocabulary for Resource Type Genres
-          (http://vocabularies.coar-repositories.org/documentation/resource_types/),
-          Wikidata (https://www.wikidata.org/wiki/Wikidata:Publication_types), or
-          equivalent publication type ontology. When a given publication type ontology term
-          is used within a given knowledge graph, then the CURIE identified term must be
-          documented in the graph as a concept node of biolink:category biolink:OntologyClass.
-        values_from:  # Not sure which takes precedence, if any...
-          - dctypes
-          - fabio
-          - MESH_PUB
-          - COAR_RESOURCE
-          - WIKIDATA
-      pages:
-        multivalued: true
-        description: >-
-          When a 2-tuple of page numbers are provided, they represent
-          the start and end page of the publication within its parent publication context.
-          For books, this may be set to the total number of pages of the book.
-    exact_mappings:
-      - IAO:0000311
-    narrow_mappings:
-      - IAO:0000013
-      # UMLS Semantic Type "Intellectual Product"
-      - STY:T170
-    id_prefixes:
-      - NLMID
-    in_subset:
-      - model_organism_database
-
-  book:
-    is_a: publication
-    description: >-
-      This class may rarely be instantiated except if use cases
-      of a given knowledge graph support its utility.
-    slot_usage:
-      id:
-        required: true
-        description: >-
-          Books should have industry-standard identifier such as from ISBN.
-      type:
-        description: >-
-          Should generally be set to an ontology class defined term for 'book'.
-    id_prefixes:
-      - isbn
-      - NLMID
-    in_subset:
-      - model_organism_database
-
-  book chapter:
-    is_a: publication
-    slots:
-      - published in
-      - volume
-      - chapter
-    slot_usage:
-      published in:
-        required: true
-        description: >-
-          The enclosing parent book containing the chapter
-          should have industry-standard identifier from ISBN.
-    in_subset:
-      - model_organism_database
-
-  serial:
-    aliases: ['journal']
-    is_a: publication
-    description: >-
-      This class may rarely be instantiated except if use cases
-      of a given knowledge graph support its utility.
-    slots:
-      - iso abbreviation
-      - volume
-      - issue
-    slot_usage:
-      id:
-        required: true
-        description: >-
-          Serials (journals) should have industry-standard identifier such as from ISSN.
-      type:
-        description: >-
-          Should generally be set to an ontology class defined term for 'serial' or 'journal'.
-    id_prefixes:
-      - issn
-      - NLMID
-    in_subset:
-      - model_organism_database
-
-  article:
-    is_a: publication
-    slots:
-      - published in
-      - iso abbreviation
-      - volume
-      - issue
-    slot_usage:
-      published in:
-        required: true
-        description: >-
-          The enclosing parent serial containing the article should
-          have industry-standard identifier from ISSN.
-      iso abbreviation:
-        description: >-
-          Optional value, if used locally as a convenience, is set
-          to the iso abbreviation of the 'published in' parent.
-    id_prefixes:
-      # By inheritance, a DOI may be used as a publication identifier; there may be other relevant namespaces
-      - PMID
-    in_subset:
-      - model_organism_database
-
-  ## Top Level Abstractions of Material & Process Entities
-
-  physical essence or occurrent:
-    description: >-
-      Either a physical or processual entity.
-    mixin: true
-
-
-  physical essence:
-    description: >-
-      Semantic mixin concept.  Pertains to entities that have
-      physical properties such as mass, volume, or charge.
-    is_a: physical essence or occurrent
-    mixin: true
-
-  physical entity:
-    is_a: named thing
-    mixins:
-      - physical essence
-    description: >-
-      An entity that has material reality (a.k.a. physical essence).
-    exact_mappings:
-      # Physical Object
-      - STY:T072
-    narrow_mappings:
-      # Manufactured Object
-      - STY:T073
-
-  occurrent:
-    description: >-
-      A processual entity.
-    # biolink:Occurrent is most consistently used as a mixin thus it should
-    # be declared as such and cannot inherit from the non-mixin biolink:NamedThing
-    is_a: physical essence or occurrent
-    mixin: true
-    exact_mappings:
-      - BFO:0000003
-
-  activity and behavior:
-    is_a: occurrent
-    mixin: true
-    description: >-
-      Activity or behavior of any independent integral living,
-      organization or mechanical actor in the world
-    exact_mappings:
-      # Activities & Behaviors
-      - UMLSSG:ACTI
-
-  activity:
-    is_a: named thing
-    mixins:
-      - activity and behavior
-    description: >-
-      An activity is something that occurs over a period of time and acts upon
-      or with entities; it may include consuming, processing, transforming,
-      modifying, relocating, using, or generating entities.
-    exact_mappings:
-      - prov:Activity
-      - NCIT:C43431
-      # Activity
-      - STY:T052
-    narrow_mappings:
-      # Daily or Recreational Activity
-      - STY:T056
-      # Occupational Activity
-      - STY:T057
-      # Governmental or Regulatory Activity
-      - STY:T064
-      # Machine Activity
-      - STY:T066
-      # Research Activity
-      - STY:T062
-      # Educational Activity
-      - STY:T065
-      # Health Care Activity
-      - STY:T058
-
-  procedure:
-    is_a: named thing
-    mixins:
-      - activity and behavior
-    description: >-
-      A series of actions conducted in a certain order or manner
-    exact_mappings:
-      # Procedures
-      - UMLSSG:PROC
-      - dcid:MedicalProcedure
-    narrow_mappings:
-      # Laboratory Procedure
-      - STY:T059
-      # Diagnostic Procedure
-      - STY:T060
-      # Therapeutic or Preventive Procedure
-      - STY:T061
-      # Molecular Biology Research Technique
-      - STY:T063
-
-  phenomenon:
-    is_a: named thing
-    mixins:
-      - occurrent
-    description: >-
-      a fact or situation that is observed to exist or happen,
-      especially one whose cause or explanation is in question
-    broad_mappings:
-      # the inclusion of 'process' in the definition of these
-      # terms broadens them, relative to 'phenomenon'
-      # Phenomenon or Process
-      - STY:T067
-      # Human-caused Phenomenon or Process
-      - STY:T068
-      # Natural Phenomenon or Process
-      - STY:T070
-    exact_mappings:
-      # Phenomena
-      - UMLSSG:PHEN
-    narrow_mappings:
-      # Laboratory or Test Result
-      - STY:T034
-      # Biologic Function
-      - STY:T038
-      # Environmental Effect of Humans
-      - STY:T069
-
-  device:
-    is_a: named thing
-    description: >-
-      A thing made or adapted for a particular purpose, especially
-      a piece of mechanical or electronic equipment
-    narrow_mappings:
-      # Devices
-      - UMLSSG:DEVI
-      # Medical Device
-      - STY:T074
-      # Research Device
-      - STY:T075
-      # Drug Delivery Device
-      - STY:T203
-      # Biomedical or Dental Material
-      - STY:T122
-
-  ## Scientific Studies
-
-  study population:
-    is_a: population of individual organisms
-    description: >-
-      A group of people banded together or treated as a group as participants in a research study.
-    close_mappings:
-      - WIKIDATA:Q7229825
-
-  subject of investigation:
-    mixin: true
-    description: >-
-      An entity that has the role of being studied in an investigation, study, or experiment
-
-  material sample:
-    aliases: ['biospecimen', 'sample', 'biosample', 'physical sample']
-    is_a: physical entity
-    mixins:
-      - subject of investigation
-    description: >-
-      A sample is a limited quantity of something (e.g. an individual or set of individuals
-      from a population, or a portion of a substance) to be used for testing, analysis,
-      inspection, investigation, demonstration, or trial use. [SIO]
-    exact_mappings:
-      - OBI:0000747
-      - SIO:001050
-    id_prefixes:
-      - BIOSAMPLE
-      - GOLD.META
-
-  ## Earth Sciences
-
-  planetary entity:
-    is_a: named thing
-    description: >-
-      Any entity or process that exists at the level of the whole planet
-
-  environmental process:
-    is_a: planetary entity
-    mixins:
-      - occurrent
-    exact_mappings:
-      - ENVO:02500000
-
-  environmental feature:
-    is_a: planetary entity
-    exact_mappings:
-      - ENVO:01000254
-
-  geographic location:
-    is_a: planetary entity
-    description: >-
-      a location that can be described in lat/long coordinates
-    slots:
-      - latitude
-      - longitude
-    exact_mappings:
-      # Geographic Areas
-      - UMLSSG:GEOG
-      # Geographic Area
-      - STY:T083
-
-  geographic location at time:
-    is_a: geographic location
-    description: >-
-      a location that can be described in lat/long coordinates, for a particular time
-    slots:
-      - timepoint
-
-  ## Biological Sciences
-
-  biological entity:
-    is_a: named thing
-    aliases: ['bioentity']
-    abstract: true
-    narrow_mappings:
-      - WIKIDATA:Q28845870
-      # UMLS Semantic Type "Experimental Model of Disease"
-      - STY:T050
-      # SIO term is 'biological entity' but less inclusive than the Biolink scope
-      - SIO:010046
-
-  thing with taxon:
-    mixin: true
-    description: >-
-      A mixin that can be used on any entity that can be taxonomically classified.
-      This includes individual organisms; genes, their products and other molecular
-      entities; body parts; biological processes
-    slots:
-      - in taxon
-
-  genomic entity:
-    mixin: true
-    is_a: thing with taxon
-    slots:
-      - has biological sequence
-    in_subset:
-      - translator_minimal
-    narrow_mappings:
-      - STY:T028   # Gene or Genome
-      - GENO:0000897  # Genomic Entity
-
-  molecular entity:
-    is_a: chemical entity
-    description: >-
-      A molecular entity is a chemical entity composed of individual or
-      covalently bonded atoms.
-    slots:
-      - is metabolite
-    narrow_mappings:
-      - STY:T088 # Carbohydrate
-      - STY:T085 # Molecular Sequence
-      - CHEBI:23367 # Any constitutionally or isotopically distinct atom, molecule, ion, ion pair, radical,
-                    # radical ion, complex, conformer etc., identifiable as a separately distinguishable entity.
-      - bioschemas:MolecularEntity
-    in_subset:
-      - translator_minimal
-    id_prefixes:
-      - PUBCHEM.COMPOUND
-      - CHEMBL.COMPOUND
-      - UNII
-      - CHEBI
-      - DRUGBANK
-      - MESH
-      - CAS
-      - DrugCentral
-      - GTOPDB
-      - HMDB
-      - KEGG.COMPOUND
-      - ChemBank
-      - PUBCHEM.SUBSTANCE
-      - SIDER.DRUG
-      - INCHI
-      - INCHIKEY
-      # - iupac # is not actually a CURIE namespace but only a naming convention for chemistry
-      # - SMILES  # is not actually a CURIE namespace but only a query language for chemistry
-      - KEGG.GLYCAN  ## G number
-      - KEGG.DRUG    ## D number
-      - KEGG.DGROUP  ## DG number
-      - KEGG.ENVIRON ## E number
-      - UMLS
-
-  chemical entity:
-    is_a: named thing
-    mixins:
-      - physical essence
-      - chemical or drug or treatment # issue 701
-      - chemical entity or gene or gene product
-      - chemical entity or protein or polypeptide
-    description: >-
-      A chemical entity is a physical entity that pertains to chemistry or
-      biochemistry.
-    slots:
-      - trade name
-      - available from
-      - max tolerated dose
-      - is toxic
-    exact_mappings:
-      - CHEBI:24431
-      - SIO:010004 # Chemical entity
-      - WIKIDATA:Q79529 # Chemical substance
-      - STY:T103 # Chemical
-    narrow_mappings:
-      - WIKIDATA:Q43460564
-    in_subset:
-      - translator_minimal
-    id_prefixes:
-      - UNII
-      - MESH
-      - CAS #CAS numbers are given for things like plant extracts as well.
-      - UMLS
-
-  chemical substance:
-    deprecated: >-
-      This class is deprecated in favor of 'small molecule.'
-
-  small molecule:
-    is_a: molecular entity
-    aliases: [ 'chemical substance']
-    description: >-
-        A small molecule entity is a molecular entity characterized by availability
-        in small-molecule databases of SMILES, InChI, IUPAC, or other
-        unambiguous representation of its precise chemical structure; for
-        convenience of representation, any valid chemical representation is
-        included, even if it is not strictly molecular (e.g., sodium ion).
-    narrow_mappings:
-      - STY:T196 # Element, Ion, or Isotope
-      - CHEBI:59999
-      - bioschemas:ChemicalSubstance
-    id_prefixes:
-      - PUBCHEM.COMPOUND
-      - CHEMBL.COMPOUND
-      - UNII
-      - CHEBI
-      - DRUGBANK
-      - MESH
-      - CAS
-      - DrugCentral
-      - GTOPDB
-      - HMDB
-      - KEGG.COMPOUND
-      - ChemBank
-      - PUBCHEM.SUBSTANCE
-      - SIDER.DRUG
-      - INCHI
-      - INCHIKEY
-      # - iupac # is not actually a CURIE namespace but only a naming convention for chemistry
-      # - SMILES  # is not actually a CURIE namespace but only a query language for chemistry
-      - KEGG.GLYCAN  ## G number
-      - KEGG.DRUG    ## D number
-      - KEGG.DGROUP  ## DG number
-      - KEGG.ENVIRON ## E number
-      - BIGG.METABOLITE
-      - UMLS
-    slot_usage:
-      id:
-        examples:
-          - value: CHEBI:29101
-            description: sodium ion
-    in_subset:
-      - model_organism_database
-      - translator_minimal
-
-  chemical mixture:
-    is_a: chemical entity
-    description: >-
-      A chemical mixture is a chemical entity composed of two or more
-      molecular entities.
-    slots:
-      - is supplement
-      - highest FDA approval status
-      - drug regulatory status world wide
-    in_subset:
-      - translator_minimal
-    id_prefixes:
-      - PUBCHEM.COMPOUND
-      - CHEMBL.COMPOUND
-      - UNII
-      - CHEBI
-      - DRUGBANK
-      - MESH
-      - CAS
-      - DrugCentral
-      - GTOPDB
-      - HMDB
-      - KEGG.COMPOUND
-      - ChemBank
-      - PUBCHEM.SUBSTANCE
-      - SIDER.DRUG
-      - INCHI
-      - INCHIKEY
-      # - iupac # is not actually a CURIE namespace but only a naming convention for chemistry
-      # - SMILES  # is not actually a CURIE namespace but only a query language for chemistry
-      - KEGG.GLYCAN  ## G number
-      - KEGG.DRUG    ## D number
-      - KEGG.DGROUP  ## DG number
-      - KEGG.ENVIRON ## E number
-      - UMLS
-    close_mappings:
-      - dcid:ChemicalCompound
-
-  nucleic acid entity:
-    is_a: molecular entity
-    description: >-
-      A nucleic acid entity is a molecular entity characterized by
-      availability in gene databases of nucleotide-based sequence
-      representations of its precise sequence; for convenience of
-      representation, partial sequences of various kinds are included.
-    aliases: [ 'sequence feature', 'genomic entity' ]
-    mixins:
-      - genomic entity
-      - physical essence
-      - ontology class
-    exact_mappings:
-      - SO:0000110
-    narrow_mappings:
-      - STY:T086   # Nucleotide Sequence
-      - STY:T114   # Nucleic Acid, Nucleoside, or Nucleotide
-    in_subset:
-      - model_organism_database
-      - translator_minimal
-    id_prefixes:
-      - PUBCHEM.COMPOUND
-      - CHEMBL.COMPOUND
-      - UNII
-      - CHEBI
-      - MESH
-      - CAS
-      - GTOPDB
-      - HMDB
-      - KEGG.COMPOUND
-      - ChemBank
-      - PUBCHEM.SUBSTANCE
-      - INCHI
-      - INCHIKEY
-      # - iupac # is not actually a CURIE namespace but only a naming convention for chemistry
-      # - SMILES  # is not actually a CURIE namespace but only a query language for chemistry
-      - KEGG.GLYCAN  # G number
-      - KEGG.ENVIRON # E number
-
-  molecular mixture:
-    is_a: chemical mixture
-    description: >-
-      A molecular mixture is a chemical mixture composed of two or more
-      molecular entities with known concentration and stoichiometry.
-    in_subset:
-      - translator_minimal
-    id_prefixes:
-      - PUBCHEM.COMPOUND
-      - CHEMBL.COMPOUND
-      - UNII
-      - CHEBI
-      - DRUGBANK
-      - MESH
-      - CAS
-      - DrugCentral
-      - GTOPDB
-      - HMDB
-      - KEGG.COMPOUND
-      - ChemBank
-      - PUBCHEM.SUBSTANCE
-      - SIDER.DRUG
-      - INCHI
-      - INCHIKEY
-      # - iupac # is not actually a CURIE namespace but only a naming convention for chemistry
-      # - SMILES  # is not actually a CURIE namespace but only a query language for chemistry
-      - KEGG.GLYCAN  ## G number
-      - KEGG.DRUG    ## D number
-      - KEGG.DGROUP  ## DG number
-      - KEGG.ENVIRON ## E number
-      - UMLS
-
-  complex molecular mixture:
-    is_a: chemical mixture
-    description: >-
-      A complex molecular mixture is a chemical mixture composed of two or
-      more molecular entities with unknown concentration and stoichiometry.
-    in_subset:
-      - translator_minimal
-    id_prefixes:
-      - PUBCHEM.COMPOUND
-      - CHEMBL.COMPOUND
-      - UNII
-      - CHEBI
-      - DRUGBANK
-      - MESH
-      - CAS
-      - DrugCentral
-      - GTOPDB
-      - HMDB
-      - KEGG.COMPOUND
-      - ChemBank
-      - PUBCHEM.SUBSTANCE
-      - SIDER.DRUG
-      - INCHI
-      - INCHIKEY
-      # - iupac # is not actually a CURIE namespace but only a naming convention for chemistry
-      # - SMILES  # is not actually a CURIE namespace but only a query language for chemistry
-      - KEGG.GLYCAN  ## G number
-      - KEGG.DRUG    ## D number
-      - KEGG.DGROUP  ## DG number
-      - KEGG.ENVIRON ## E number
-      - UMLS
-
-  biological process or activity:
-    description: >-
-      Either an individual molecular activity, or a collection of
-      causally connected molecular activities in a biological system.
-    is_a: biological entity
-    mixins:
-      - occurrent
-      - ontology class
-    id_prefixes:
-      - GO
-      - REACT
-    slots:
-      - has input
-      - has output
-      - enabled by
-
-  molecular activity:
-    description: >-
-      An execution of a molecular function carried out by a
-      gene product or macromolecular complex.
-    is_a: biological process or activity
-    aliases: ['molecular function', 'molecular event', 'reaction']
-    mixins:
-      - occurrent
-      - ontology class
-    slot_usage:
-      has input:
-        range: molecular entity
-        description: >-
-          A chemical entity that is the input for the reaction
-      has output:
-        range: molecular entity
-        description: >-
-          A chemical entity that is the output for the reaction
-      enabled by:
-        range: macromolecular machine mixin
-        description: >-
-          The gene product, gene, or complex that catalyzes the reaction
-    exact_mappings:
-      - GO:0003674
-      # UMLS Semantic Type "Molecular Function"
-      - STY:T044
-    id_prefixes:
-      - GO
-      - REACT
-      - RHEA
-      - metacyc.reaction
-      - EC
-      - TCDB
-      - KEGG.REACTION  ## R number
-      - KEGG.RCLASS    ## RC number
-      - KEGG.ENZYME    ## EC number
-      - KEGG.ORTHOLOGY ## in particular for gut microbiome use case in issue #888
-      - UMLS
-      - BIGG.REACTION
-      - SEED.REACTION
-      - METANETX.REACTION
-
-  biological process:
-    is_a: biological process or activity
-    mixins:
-      - occurrent
-      - ontology class
-    description: >-
-      One or more causally connected executions of molecular functions
-    exact_mappings:
-      - GO:0008150
-      - SIO:000006
-      - WIKIDATA:Q2996394
-    broad_mappings:
-      - WIKIDATA:P682
-    id_prefixes:
-      - GO
-      - REACT
-      - metacyc.reaction
-      - KEGG.MODULE ## M number
-
-  pathway:
-    is_a: biological process
-    mixins:
-      - ontology class
-    exact_mappings:
-      - PW:0000001
-      - WIKIDATA:Q4915012
-    narrow_mappings:
-      - SIO:010526
-      - GO:0007165
-    id_prefixes:
-      - GO
-      - REACT
-      - KEGG
-      - SMPDB
-      - MSigDB
-      - PHARMGKB.PATHWAYS
-      - WIKIPATHWAYS
-      - FB  # FlyBase FBgg*
-      - PANTHER.PATHWAY
-      - KEGG.PATHWAY
-
-  physiological process:
-    aliases: ['physiology']
-    is_a: biological process
-    mixins:
-      - ontology class
-    close_mappings:
-    exact_mappings:
-      # Physiologic Function
-      - STY:T039
-      - WIKIDATA:Q30892994
-    narrow_mappings:
-      # Organism Function
-      - STY:T040
-      # Organ or Tissue Function
-      - STY:T042
-      # Cell Function
-      - STY:T043
-      # Genetic Function
-      - STY:T045
-    id_prefixes:
-      - GO
-      - REACT
-
-  behavior:
-    is_a: biological process
-    mixins:
-      - ontology class
-      - activity and behavior
-    exact_mappings:
-      - GO:0007610
-      # Behavior
-      - STY:T053
-    narrow_mappings:
-      # Mental Process
-      - STY:T041
-      # Social Behavior
-      - STY:T054
-      # Individual Behavior
-      - STY:T055
-
-  ## (Bio)chemistry
-
-  processed material:
-    is_a: chemical mixture
-    description: >-
-      A chemical entity (often a mixture) processed
-      for consumption for nutritional, medical or technical use.
-      Is a material entity that is created or changed during material processing.
-    exact_mappings:
-      - OBI:0000047
-    id_prefixes:
-      - UMLS
-
-  drug:
-    is_a: molecular mixture
-    mixins:
-      - chemical or drug or treatment
-      - ontology class
-    description: >-
-      A substance intended for use in the diagnosis, cure,
-      mitigation, treatment, or prevention of disease
-    comments:
-      - The CHEBI ID represents a role rather than a substance
-    broad_mappings:
-      # Pharmacologic Substance: Any natural, endogenously-derived,
-      # synthetic or semi-synthetic compound with pharmacologic activity.
-      - STY:T121
-    exact_mappings:
-      - WIKIDATA:Q12140
-      - CHEBI:23888
-      # UMLS Semantic Type "Clinical Drug"
-      - STY:T200
-      - dcid:Drug
-    narrow_mappings:
-      # Antibiotic
-      - STY:T195
-    id_prefixes:
-      - RXCUI
-      - NDC
-      - UMLS
-
-  ## Food
-
-  environmental food contaminant:
-    is_a: chemical entity
-    related_mappings:
-      # substance role
-      - CHEBI:78299
-
-  food additive:
-    is_a: chemical entity
-    related_mappings:
-      # substance role
-      - CHEBI:64047
-
-  nutrient:
-    is_a: chemical entity
-    related_mappings:
-      # substance role
-      - CHEBI:33284
-
-  macronutrient:
-    is_a: nutrient
-    related_mappings:
-      # substance role
-      - CHEBI:33937
-
-  micronutrient:
-    is_a: nutrient
-    related_mappings:
-      # substance role
-      - CHEBI:27027
-
-  vitamin:
-    is_a: micronutrient
-    related_mappings:
-      # substance role
-      - CHEBI:33229
-      # Vitamin
-      - STY:T127
-
-  food:
-    is_a: chemical mixture
-    description: >-
-      A substance consumed by a living organism as a source of nutrition
-    id_prefixes:
-      - foodb.compound
-    exact_mappings:
-      # Food
-      - STY:T168
-
-  ## Biology and Biomedical Sciences
-
-  ## Biological Attributes
-
-  organism attribute:
-    is_a: attribute
-    description: >-
-      describes a characteristic of an organismal entity.
-    exact_mappings:
-      # Organism Attribute
-      - STY:T032
-
-  phenotypic quality:
-    aliases: ['phenotypic properties']
-    is_a: organism attribute
-    description: >-
-      A property of a phenotype
-    examples:
-      - value: weight
-
-    mappings:
-      - PATO:0000001
-
-  inheritance:
-    is_a: organism attribute
-    description: >-
-      The pattern or 'mode' in which a particular genetic trait or disorder is passed from one
-      generation to the next, e.g. autosomal dominant, autosomal recessive, etc.
-    exact_mappings:
-      - HP:0000005
-      - GENO:0000141
-      - NCIT:C45827
-
-  ## Biological Entities
-
-  organismal entity:
-    description: >-
-      A named entity that is either a part of an organism, a whole organism,
-      population or clade of organisms, excluding chemical entities
-    abstract: true
-    is_a: biological entity
-    slot_usage:
-      has attribute:
-        description: >-
-          may often be an organism attribute
-    exact_mappings:
-      - WIKIDATA:Q7239
-      # UMLS Semantic Group "Living Beings"
-      # Several of the associated semantic types here are probably not
-      # that relevant to the Biolink world but we keep them here for now.
-      - UMLSSG:LIVB
-
-  life stage:
-    is_a: organismal entity
-    mixins:
-      - thing with taxon
-    description: >-
-      A stage of development or growth of an organism,
-      including post-natal adult stages
-    exact_mappings:
-      - UBERON:0000105
-    narrow_mappings:
-      # constrained to human life cycles
-      - HsapDv:0000000
-    in_subset:
-      - model_organism_database
-
-  individual organism:
-    aliases: ['organism']
-    description: >-
-      An instance of an organism. For example, Richard Nixon,
-      Charles Darwin, my pet cat. Example ID: ORCID:0000-0002-5355-2576
-    mixins:
-      - thing with taxon
-    is_a: organismal entity
-    exact_mappings:
-      - SIO:010000
-      # Organism
-      - STY:T001
-    narrow_mappings:
-      # Wikidata considers its definition of 'individual' to be constrained to human persons?
-      - WIKIDATA:Q795052
-      - foaf:Person
-    id_prefixes:
-      - ORCID
-
-  population of individual organisms:
-    description: >-
-      A collection of individuals from the same taxonomic class
-      distinguished by one or more characteristics.  Characteristics can
-      include, but are not limited to, shared geographic location, genetics,
-      phenotypes.
-    local_names:
-      ga4gh: population
-    mixins:
-      - thing with taxon
-    is_a: organismal entity
-    exact_mappings:
-      - PCO:0000001
-      - SIO:001061
-      # UMLS Semantic Type "Population Group"
-      - STY:T098
-      - OBI:0000181
-    id_prefixes:
-      - HANCESTRO
-    in_subset:
-      - model_organism_database
-
-  disease or phenotypic feature:
-    aliases: ['phenome']
-    is_a: biological entity
-    description: >-
-      Either one of a disease or an individual phenotypic feature.
-      Some knowledge resources such as Monarch treat these as
-      distinct, others such as MESH conflate.
-    mixins:
-      - thing with taxon
-    union_of:
-      - disease
-      - phenotypic feature
-    narrow_mappings:
-      # UMLS Semantic Type "Finding" - more specialized use of 'disease or phenotypic feature'
-      - STY:T033
-
-  disease:
-    aliases: ['condition', 'disorder', 'medical condition']
-    is_a: disease or phenotypic feature
-    exact_mappings:
-      - MONDO:0000001
-      - DOID:4
-      - NCIT:C2991
-      - WIKIDATA:Q12136
-      - SIO:010299
-      # UMLS Semantic Group "Disorders"
-      - UMLSSG:DISO
-      # Disease or Syndrome
-      - STY:T047
-      - dcid:Disease
-    narrow_mappings:
-      # Congenital Abnormality
-      - STY:T019
-      # Acquired Abnormality
-      - STY:T020
-      # Mental or Behavioral Dysfunction
-      - STY:T048
-      # Cell or Molecular Dysfunction
-      - STY:T049
-      # Anatomical Abnormality
-      - STY:T190
-      # Neoplastic Process
-      - STY:T191
-      # disease susceptibility
-      - MONDO:0042489
-    id_prefixes:
-      - MONDO
-      - DOID
-      - OMIM
-      - ORPHANET
-      - EFO
-      - UMLS
-      - MESH
-      - MEDDRA
-      - NCIT
-      - SNOMEDCT
-      - medgen
-      - ICD10
-      - ICD9
-      - KEGG.DISEASE ## H number
-      - HP
-      - MP
-    in_subset:
-      - model_organism_database
-
-  phenotypic feature:
-    aliases: ['sign', 'symptom', 'phenotype', 'trait', 'endophenotype']
-    is_a: disease or phenotypic feature
-    description: >-
-      A combination of entity and quality that makes up a phenotyping statement.
-    examples:
-      - value: MP:0001262
-        description: decreased body weight
-    exact_mappings:
-      - UPHENO:0001001
-      - SIO:010056
-      - WIKIDATA:Q104053
-    narrow_mappings:
-      # Sign or Symptom
-      - STY:T184
-      - WIKIDATA:Q169872
-      # presentation of a disease in clinical medicine
-      - WIKIDATA:Q25203551
-    id_prefixes:
-      - HP
-      - EFO
-      - NCIT
-      - UMLS
-      - MEDDRA
-      - MP
-      - ZP
-      - UPHENO
-      - APO
-      - FBcv
-      - WBPhenotype
-      - SNOMEDCT
-      - MESH
-      - XPO
-      - FYPO
-    in_subset:
-      - model_organism_database
-
-  behavioral feature:
-    description: >-
-      A phenotypic feature which is behavioral in nature.
-    is_a: phenotypic feature
-    exact_mappings:
-      - NBO:0000243
-
-  anatomical entity:
-    is_a: organismal entity
-    mixins:
-      - thing with taxon
-      - physical essence
-    description: >-
-      A subcellular location, cell type or gross anatomical part
-    exact_mappings:
-      - UBERON:0001062
-      - WIKIDATA:Q4936952
-      # UMLS Semantic Group "Anatomy"
-      - UMLSSG:ANAT
-      # UMLS Semantic Type "Anatomical Structure"
-      - STY:T017
-    id_prefixes:
-      - UBERON
-      - GO
-      - CL
-      - UMLS
-      - MESH
-      - NCIT
-    in_subset:
-      - model_organism_database
-
-  cellular component:
-    aliases: ['cell component','cell part']
-    is_a: anatomical entity
-    description: >-
-      A location in or around a cell
-    exact_mappings:
-      - GO:0005575
-      - SIO:001400
-      - WIKIDATA:Q5058355
-      # Cell Component
-      - STY:T026
-    broad_mappings:
-      - WIKIDATA:P681
-    id_prefixes:
-      - GO
-      - MESH
-      - UMLS
-      - NCIT
-      - SNOMEDCT
-      - CL
-      - UBERON
-
-  cell:
-    is_a: anatomical entity
-    exact_mappings:
-      - GO:0005623
-      - CL:0000000
-      - SIO:010001
-      - WIKIDATA:Q7868
-      # UMLS Semantic Type "Cell"
-      - STY:T025
-    id_prefixes:
-      - CL
-      - PO
-      - UMLS
-      - NCIT
-      - MESH
-      - UBERON
-      - SNOMEDCT
-
-  cell line:
-    is_a: organismal entity
-    exact_mappings:
-      - CLO:0000031
-    id_prefixes:
-      - CLO
-
-  gross anatomical structure:
-    aliases: ['tissue', 'organ']
-    is_a: anatomical entity
-    exact_mappings:
-      - UBERON:0010000
-      - WIKIDATA:Q4936952
-    narrow_mappings:
-      # UMLS Semantic Type "Body Part, Organ, or Organ Component"
-      - STY:T023
-      # UMLS Semantic Type "Tissue"
-      - STY:T024
-      # Embryonic Structure
-      - STY:T018
-    id_prefixes:
-      - UBERON
-      - UMLS
-      - MESH
-      - NCIT
-      - PO
-      - FAO
-
-
-  ## entity mixins
-
-  chemical entity or gene or gene product:
-    description: >-
-      A union of chemical entities and children, and gene or gene product.
-      This mixin is helpful to use when searching across
-      chemical entities that must include genes and their children as chemical entities.
-    mixin: true
-
-  chemical entity or protein or polypeptide:
-    description: >-
-      A union of chemical entities and children, and protein and polypeptide.
-      This mixin is helpful to use when searching across
-      chemical entities that must include genes and their children as chemical entities.
-    mixin: true
-
-  macromolecular machine mixin:
-    description: >-
-      A union of gene locus, gene product, and macromolecular complex mixin. These are
-      the basic units of function in a cell. They either carry out individual
-      biological activities, or they encode molecules which do this.
-    mixin: true
-    slots:
-      - name
-    slot_usage:
-      name:
-        range: symbol type
-        description: >-
-          genes are typically designated by a short symbol and a full name.
-          We map the symbol to the default display name
-          and use an additional slot for full name
-
-  gene or gene product:
-    description: >-
-      A union of gene loci or gene products.
-      Frequently an identifier for one will be used as proxy for another
-    is_a: macromolecular machine mixin
-    mixin: true
-    id_prefixes:
-      - CHEMBL.TARGET
-      - IUPHAR.FAMILY
-
-  gene:
-    description: >-
-      A region (or regions) that includes all of the sequence elements
-      necessary to encode a functional transcript. A gene locus may include
-      regulatory regions, transcribed regions and/or other
-      functional sequence regions.
-    is_a: biological entity
-    mixins:
-      - gene or gene product
-      - genomic entity
-      - chemical entity or gene or gene product
-      - physical essence
-      - ontology class
-    aliases: ['locus']
-    slots:
-      - symbol
-      - synonym
-      - xref
-    narrow_mappings:
-      - bioschemas:gene
-    exact_mappings:
-      - SO:0000704
-      - SIO:010035
-      - WIKIDATA:Q7187
-      - dcid:Gene
-    id_prefixes:
-      - NCBIGene
-      - ENSEMBL
-      - HGNC
-      - MGI
-      - ZFIN
-      - dictyBase
-      - WB
-      - WormBase # we have two prefixes here as worbase supports WormBase:WBGene00000898
-                 # and alliancegenome.org and identifiers.org supports WB:WBGene00000898.
-      - FB  # FlyBase FBgn*
-      - RGD
-      - SGD
-      - POMBASE
-      - OMIM
-      - KEGG.GENE ## org:gene
-      - UMLS
-      - Xenbase
-      # - IUPHAR
-    in_subset:
-      - model_organism_database
-
-  gene product mixin:
-    description: >-
-      The functional molecular product of a single gene locus.
-      Gene products are either proteins or functional RNA molecules.
-    is_a: gene or gene product
-    mixin: true
-    slots:
-      - synonym
-      - xref
-    exact_mappings:
-      - WIKIDATA:Q424689
-      - GENO:0000907
-      - NCIT:C26548
-    id_prefixes:
-      - UniProtKB
-      - gtpo
-      - PR
-
-  gene product isoform mixin:
-    description: >-
-      This is an abstract class that can be mixed in with different kinds of
-      gene products to indicate that the gene product is intended to represent
-      a specific isoform rather than a canonical or reference or generic
-      product. The designation of canonical or reference may be arbitrary,
-      or it may represent the superclass of all isoforms.
-    is_a: gene product mixin
-    mixin: true
-
-  macromolecular complex mixin:
-    description: >-
-      A stable assembly of two or more macromolecules, i.e. proteins,
-      nucleic acids, carbohydrates or lipids, in which at least one
-      component is a protein and the constituent parts function together.
-    is_a: macromolecular machine mixin
-    mixin: true
-    exact_mappings:
-      - GO:0032991
-      - WIKIDATA:Q22325163
-    id_prefixes:
-      - INTACT
-      - GO
-      - PR
-      - REACT
-    in_subset:
-      - model_organism_database
-
-  microRNA or siRNA:
-    description: >-
-      A union of small RNA species that perform transcript silencing via
-      the RISC complex; this mixin is helpful when searching for post-
-      transcriptional interactions.
-    mixin: true
-
-  ## Genomic Classes
-
-  genome:
-    is_a: biological entity
-    mixins:
-      - genomic entity
-      - physical essence
-      - ontology class
-    description: >-
-      A genome is the sum of genetic material within a cell or virion.
-    exact_mappings:
-      - SO:0001026
-      - SIO:000984
-      - WIKIDATA:Q7020
-    close_mappings:
-      - dcid:GenomeAssemblyUnit
-    in_subset:
-      - model_organism_database
-
-  exon:
-    is_a: nucleic acid entity
-    description: >-
-      A region of the transcript sequence within a gene which is not
-      removed from the primary RNA transcript by RNA splicing.
-    exact_mappings:
-      - SO:0000147
-      - SIO:010445
-      - WIKIDATA:Q373027
-
-  transcript:
-    is_a: nucleic acid entity
-    description: >-
-      An RNA synthesized on a DNA or RNA template by an RNA polymerase.
-    exact_mappings:
-      - SO:0000673
-      - SIO:010450
-      - WIKIDATA:Q7243183
-      - dcid:RNATranscript
-    id_prefixes:
-      - ENSEMBL # ENSEMBL:ENST for human
-      - FB      # FlyBase:FBtr
-    in_subset:
-      - model_organism_database
-
-  coding sequence:
-    is_a: nucleic acid entity
-    exact_mappings:
-      - SO:0000316
-      - SIO:001390
-
-  polypeptide:
-    aliases: [ 'amino acid entity' ]
-    is_a: biological entity
-    description: >-
-      A polypeptide is a molecular entity characterized by availability
-      in protein databases of amino-acid-based sequence representations
-      of its precise primary structure; for convenience of representation,
-      partial sequences of various kinds are included, even if they do not
-      represent a physical molecule.
-    mixins:
-      - thing with taxon
-      - chemical entity or gene or gene product
-      - chemical entity or protein or polypeptide
-    id_prefixes:
-      - UniProtKB
-      - PR
-      - ENSEMBL # ENSEMBL:ENSP*
-      - FB      # FlyBase FBpp*
-      - UMLS
-    in_subset:
-      - model_organism_database
-    narrow_mappings:
-      - SO:0000104 # polypeptide definde in SO conflates protein and polypeptide
-      # Amino Acid, Peptide, or Protein
-      - STY:T116
-      # Amino Acid Sequence
-      - STY:T087
-
-  protein:
-    description: >-
-      Test
-    is_a: polypeptide
-    mixins:
-      - gene product mixin
-      - thing with taxon
-    id_prefixes:
-      - UniProtKB
-      - PR
-      - ENSEMBL # ENSEMBL:ENSP*
-      - FB      # FlyBase FBpp*
-      - UMLS
-      - MESH
-    broad_mappings:
-      - bioschemas:Protein
-    exact_mappings:
-      - PR:000000001
-      - SIO:010043
-      - WIKIDATA:Q8054
-    narrow_mappings:
-      # Enzyme
-      - STY:T126
-      # Receptor
-      - STY:T192
-
-  protein isoform:
-    aliases: ['proteoform']
-    is_a: protein
-    description: >-
-      Represents a protein that is a specific isoform of the canonical or
-      reference protein. See https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4114032/
-    mixins:
-      - gene product isoform mixin
-    id_prefixes:
-      - UniProtKB # UniProtKB:([A-Z0-9]+-\d+)
-      - UNIPROT.ISOFORM
-      - PR
-      - ENSEMBL
-
-  protein domain:
-    is_a: biological entity
-    description: >-
-      A conserved part of protein sequence and (tertiary) structure that can evolve,
-      function, and exist independently of the rest of the protein chain.
-      Protein domains maintain their structure and function independently of the proteins in which they are found.
-      e.g. an SH3 domain.
-    mixins:
-      - gene grouping mixin
-      - chemical entity or gene or gene product
-    exact_mappings:
-      - NCIT:C13379
-      - SIO:001379
-      - UMLS:C1514562
-
-  protein family:
-    is_a: biological entity
-    exact_mappings:
-      - NCIT:C26004
-      - WIKIDATA:Q2278983
-    narrow_mappings:
-      - SIO:001380
-      - NCIT:C20130
-      - WIKIDATA:Q417841
-    mixins:
-      - gene grouping mixin
-      - chemical entity or gene or gene product
-
-  nucleic acid sequence motif:
-    aliases: ['consensus sequence']
-    is_a: biological entity
-    description: >-
-      A linear nucleotide sequence pattern that is widespread and has, or is conjectured to have,
-      a biological significance. e.g. the TATA box promoter motif, transcription factor binding
-      consensus sequences.
-
-  RNA product:
-    is_a: transcript
-    mixins:
-      - gene product mixin
-    exact_mappings:
-      - CHEBI:33697
-      # This SIO term here also mapped to 'biolink:Transcript'; however,
-      # since this 'biolink:RNAProduct' relates more to the biochemical
-      # essence of RNA, then map the SIO term instead to 'biolink:Transcript'
-      # - SIO:010450
-      - WIKIDATA:Q11053
-    id_prefixes:
-      - RNACENTRAL
-
-  RNA product isoform:
-    is_a: RNA product
-    description: >-
-      Represents a protein that is a specific isoform of the canonical or reference RNA
-    mixins:
-      - gene product isoform mixin
-    id_prefixes:
-      - RNACENTRAL
-
-  noncoding RNA product:
-    is_a: RNA product
-    id_prefixes:
-      - RNACENTRAL
-      - NCBIGene
-      - ENSEMBL
-    exact_mappings:
-      - SO:0000655
-      - SIO:001235
-
-  microRNA:
-    is_a: noncoding RNA product
-    exact_mappings:
-      - SO:0000276
-      - SIO:001397
-      - WIKIDATA:Q310899
-    id_prefixes:
-      - MIR
-      - HGNC
-      - WormBase
-    in_subset:
-      - model_organism_database
-
-  siRNA:
-    aliases: ['small interfering RNA', 'RNAi']
-    description: >-
-      A small RNA molecule that is the product of a longer exogenous or
-      endogenous dsRNA, which is either a bimolecular duplex or very long
-      hairpin, processed (via the Dicer pathway) such that numerous siRNAs
-      accumulate from both strands of the dsRNA. SRNAs trigger the cleavage
-      of their target molecules.
-    is_a: noncoding RNA product
-    exact_mappings:
-      - SO:0000646
-      - WIKIDATA:Q203221
-    id_prefixes:
-      - MIR
-      - HGNC
-      - WormBase
-    in_subset:
-      - model_organism_database
-
-  gene grouping mixin:
-    description: >-
-      any grouping of multiple genes or gene products
-    mixin: true
-    slots:
-      - has gene or gene product
-
-  gene family:
-    aliases: ['orthogroup','protein family']
-    is_a: biological entity
-    exact_mappings:
-      - NCIT:C26004
-      - WIKIDATA:Q2278983
-    narrow_mappings:
-      # These term definitions focus only on proteins;
-      # the 'biolink:GeneFamily' term would be more inclusive
-      # to describe gene loci, non-coding RNA, etc.
-      - SIO:001380
-      - NCIT:C20130
-      - WIKIDATA:Q417841
-    mixins:
-      - gene grouping mixin
-      - chemical entity or gene or gene product
-    description: >-
-      any grouping of multiple genes or gene products related by common descent
-    id_prefixes:
-      - PANTHER.FAMILY
-      - HGNC.FAMILY
-      - FB       # FlyBase FBgg*
-      - interpro # note: may be better to introduce a protein domain/family
-      - CATH
-      - CDD
-      - HAMAP
-      - PFAM
-      - PIRSF
-      - PRINTS
-      - PRODOM
-      - PROSITE
-      - SMART
-      - SUPFAM
-      - TIGRFAM
-      - CATH.SUPERFAMILY
-      - RFAM ## RNAs only
-      - KEGG.ORTHOLOGY ## aka KEGG.KO: K number
-      - EGGNOG
-      - COG
-    in_subset:
-      - model_organism_database
-
-  zygosity:
-    is_a: attribute
-    exact_mappings:
-      - GENO:0000133
-
-  genotype:
-    is_a: biological entity
-    mixins:
-      - physical essence
-      - genomic entity
-      - ontology class
-    description: >-
-      An information content entity that describes a genome by specifying the
-      total variation in genomic sequence and/or gene expression, relative to
-      some established background
-    comments:
-      - Consider renaming as genotypic entity
-    slots:
-      - has zygosity
-    exact_mappings:
-      - GENO:0000536
-      - SIO:001079
-    id_prefixes:
-      - ZFIN
-      - FB   # FlyBase FBba*
-    in_subset:
-      - model_organism_database
-
-  haplotype:
-    is_a: biological entity
-    mixins:
-      - genomic entity
-      - physical essence
-      - ontology class
-    description: >-
-      A set of zero or more Alleles on a single instance of a Sequence[VMC]
-#    slots:
-#      - completeness
-    exact_mappings:
-      - GENO:0000871
-      - SO:0001024
-      - VMC:Haplotype
-
-  sequence variant:
-    aliases: ['allele']
-    local_names:
-      agr: allele
-    is_a: biological entity
-    mixins:
-      - genomic entity
-      - physical essence
-      - ontology class
-    description: >-
-      An allele that varies in its sequence from what is considered
-      the reference allele at that locus.
-    comments:
-      - This class is for modeling the specific state at a locus.
-        A single DBSNP rs ID could correspond to more than one sequence variants
-        (e.g CIViC:1252 and CIViC:1253, two distinct BRCA2 alleles for rs28897743)
-    broad_mappings:
-      # slightly broader semantics than SO:0001059 - 'sequence alteration'
-      # describes a sequence feature that may have 1..* sequence alterations
-      - SO:0001060
-    exact_mappings:
-      - GENO:0000002
-      - WIKIDATA:Q15304597
-      - SIO:010277
-      - VMC:Allele
-      - SO:0001059
-    close_mappings:
-      - dcid:Allele
-    id_prefixes:
-      - CAID # ClinGen Allele Registry
-      - CLINVAR
-      - ClinVarVariant
-      - WIKIDATA
-      # - CIViC needs IRI mapping
-      - DBSNP
-      # - MYVARIANT_HG19 needs IRI mapping
-      # - MYVARIANT_HG38 needs IRI mapping
-      # - HGVS needs IRI mapping
-      - MGI
-      - ZFIN # ZFIN:ZDB-ALT-*
-      - FB   # FlyBase FBal*
-      - WB
-      - WormBase ## WormBase:WBVar*
-    alt_descriptions:
-      AGR: >-
-        An entity that describes a single affected, endogenous allele.
-        These can be of any type that matches that definition
-      VMC: >-
-        A contiguous change at a Location
-    slots:
-      - has gene
-    slot_usage:
-      has gene:
-        multivalued: true
-        description: Each allele can be associated with any number of genes
-      has biological sequence:
-        description: >-
-          The state of the sequence w.r.t a reference sequence
-      id:
-        examples:
-          - value: ZFIN:ZDB-ALT-980203-1091
-            description: ti282a allele from ZFIN
-          - value: ClinVarVariant:17681
-            description: NM_007294.3(BRCA1):c.2521C>T (p.Arg841Trp)
-    in_subset:
-      - model_organism_database
-
-  snv:
-    aliases: ['single nucleotide variant','single nucleotide polymorphism', 'snp']
-    is_a: sequence variant
-    description: >-
-      SNVs are single nucleotide positions in genomic DNA at
-      which different sequence alternatives exist
-    exact_mappings:
-      - SO:0001483
-
-  reagent targeted gene:
-    aliases: ['sequence targeting reagent']
-    is_a: biological entity
-    description: >-
-      A gene altered in its expression level in the context of some
-      experiment as a result of being targeted by gene-knockdown
-      reagent(s) such as a morpholino or RNAi.
-    mixins:
-      - genomic entity
-      - physical essence
-      - ontology class
-    exact_mappings:
-      - GENO:0000504
-    in_subset:
-      - model_organism_database
-
-  ## --------------------
-  ## Clinical
-  ## Attributes, Cohort,
-  ## Exposures & Outcomes
-  ## --------------------
-
-  ## Clinical Attributes
-
-  clinical attribute:
-    is_a: attribute
-    description: >-
-      Attributes relating to a clinical manifestation
-    exact_mappings:
-      # Clinical Attribute
-      - STY:T201
-
-  clinical measurement:
-    is_a: clinical attribute
-    description: >-
-      A clinical measurement is a special kind of attribute which results
-      from a laboratory observation from a subject individual or sample.
-      Measurements can be connected to their subject by the 'has attribute' slot.
-    slot_usage:
-      has attribute type:
-        required: true
-        multivalued: false
-        values_from:
-          - EFO
-          - LOINC
-    exact_mappings:
-      - EFO:0001444
-
-  clinical modifier:
-    is_a: clinical attribute
-    description: >-
-      Used to characterize and specify the phenotypic abnormalities
-      defined in the phenotypic abnormality sub-ontology, with respect
-      to severity, laterality, and other aspects
-    exact_mappings:
-      - HP:0012823
-
-  clinical course:
-    is_a: clinical attribute
-    description: >-
-      The course a disease typically takes from its onset, progression in time, and
-      eventual resolution or death of the affected individual
-    exact_mappings:
-      - HP:0031797
-
-  onset:
-    is_a: clinical course
-    description: >-
-      The age group in which (disease) symptom manifestations appear
-    exact_mappings:
-      - HP:0003674
-
-  clinical entity:
-    is_a: named thing
-    description: >-
-      Any entity or process that exists in the clinical domain and outside the
-      biological realm. Diseases are placed under biological entities
-
-  clinical trial:
-    is_a: clinical entity
-
-  clinical intervention:
-    is_a: clinical entity
-
-  clinical finding:
-    is_a: phenotypic feature
-    description: >-
-      this category is currently considered broad enough to tag clinical lab
-      measurements and other biological attributes taken as 'clinical traits'
-      with some statistical score, for example, a p value in genetic associations.
-    slot_usage:
-      has attribute:
-        range: clinical attribute
-    id_prefixes:
-      - LOINC
-      - NCIT
-      - EFO
-
-  hospitalization:
-    is_a: clinical intervention
-    exact_mappings:
-      - SNOMEDCT:32485007
-      - WIKIDATA:Q3140971
-
-  socioeconomic attribute:
-    is_a: attribute
-    description: >-
-      Attributes relating to a socioeconomic manifestation
-    #slot_usage:
-    # need a suitable qualifying socioeconomic ontology target here?
-    # Perhaps some subset of ECTO: https://github.com/EnvironmentOntology/environmental-exposure-ontology
-    #  has attribute type:
-    #     range: socioeconomic ontology
-    # exact_mappings:
-    #  - ??
-
-  ## Cohorts
-
-  case:
-    aliases: ['patient', 'proband']
-    is_a: individual organism
-    description: >-
-      An individual (human) organism that has a patient role in some clinical context.
-
-  cohort:
-    is_a: study population
-    description: >-
-      A group of people banded together or treated as a group who share common characteristics.
-      A cohort 'study' is a particular form of longitudinal study that samples a cohort,
-      performing a cross-section at intervals through time.
-    #
-    # As of this moment (Nov. 22), the jury is still out on what metadata of a cohort
-    # will be common to all cohort descriptions versus cohort-specific annotation.
-    # The former should be embedded as explicit slots in the cohort category. The latter
-    # ought to be documented as (ontology term constrained) extended node attributes.
-    #
-    #slots:
-    #  - general disease focus,
-    #  - specific inclusion/exclusion criteria,
-    #  - year(s) of cohort creation,
-    #  - institution.
-    exact_mappings:
-      - WIKIDATA:Q1303415
-    narrow_mappings:
-      # Professional or Occupational Group
-      - STY:T097
-      # Family Group
-      - STY:T099
-      # Age Group
-      - STY:T100
-      # Patient or Disabled Group
-      - STY:T101
-
-  ## Exposures
-
-  exposure event:
-    aliases: ['exposure', 'experimental condition']
-    mixin: true
-    slots:
-      - timepoint
-    description: >-
-      A (possibly time bounded) incidence of a feature of the environment of an organism that
-      influences one or more phenotypic features of that organism, potentially mediated by genes
-    exact_mappings:
-      - XCO:0000000
-    in_subset:
-      - model_organism_database
-
-  # TODO - confirm that genomic backgrounds are exposures
-  genomic background exposure:
-    mixins:
-      - exposure event
-      - gene grouping mixin
-      - physical essence
-      - genomic entity
-      - ontology class
-    description: >-
-      A genomic background exposure is where an individual's specific genomic background
-      of genes, sequence variants or other pre-existing genomic conditions constitute
-      a kind of 'exposure' to the organism, leading to or influencing an outcome.
-
-  pathological entity mixin:
-    description: >-
-      A pathological (abnormal) structure or process.
-    mixin: true
-    exact_mappings:
-      - MPATH:0
-    narrow_mappings:
-      - HP:0000118
-
-  pathological process:
-    description: >-
-      A biologic function or a process having an abnormal or deleterious
-      effect at the subcellular, cellular, multicellular, or organismal level.
-    is_a: biological process
-    mixins:
-      - pathological entity mixin
-    exact_mappings:
-      - OBI:1110122
-      - NCIT:C16956
-    narrow_mappings:
-      # metastasis
-      - NCIT:C19151
-      - EFO:0009708
-      - STY:T046
-      - STY:T037
-
-  pathological process exposure:
-    mixins:
-      - exposure event
-    description: >-
-      A pathological process, when viewed as an exposure, representing
-      a precondition, leading to or influencing an outcome,
-      e.g. autoimmunity leading to disease.
-
-  pathological anatomical structure:
-    description: >-
-      An anatomical structure with the potential of have an abnormal or deleterious
-      effect at the subcellular, cellular, multicellular, or organismal level.
-    is_a: anatomical entity
-    mixins:
-      - pathological entity mixin
-
-  pathological anatomical exposure:
-    mixins:
-      - exposure event
-    description: >-
-      An abnormal anatomical structure, when viewed as an exposure,
-      representing an precondition, leading to or influencing an outcome,
-      e.g. thrombosis leading to an ischemic disease outcome.
-
-  disease or phenotypic feature exposure:
-    mixins:
-      - exposure event
-      - pathological entity mixin
-    description: >-
-      A disease or phenotypic feature state, when viewed as an exposure,
-      represents an precondition, leading to or influencing an outcome,
-      e.g. HIV predisposing an individual to infections; a relative deficiency
-      of skin pigmentation predisposing an individual to skin cancer.
-
-  chemical exposure:
-    mixins:
-      - exposure event
-    description: >-
-      A chemical exposure is an intake of a particular
-      chemical entity.
-    exact_mappings:
-      # this ECTO term is not visibly defined but
-      # the 9000000-series identifiers seems to be the
-      # numeric space of chemical exposure definitions
-      - ECTO:9000000
-      - SIO:001399
-
-  complex chemical exposure:
-    description: >-
-      A complex chemical exposure is an intake of a chemical
-      mixture (e.g. gasoline), other than a drug.
-
-  drug exposure:
-    is_a: chemical exposure
-    aliases: ['drug intake', 'drug dose', 'medication intake']
-    description: >-
-      A drug exposure is an intake of a particular drug.
-    mixins:
-      - exposure event
-    broad_mappings:
-      # slightly broader than just drug effects on a biological system
-      - SIO:001005
-    exact_mappings:
-      - ECTO:0000509
-
-  # TODO: deprecate?
-  drug to gene interaction exposure:
-    description: >-
-      drug to gene interaction exposure is a drug exposure is where the
-      interactions of the drug with specific genes are known to constitute
-      an 'exposure' to the organism, leading to or influencing an outcome.
-    is_a: drug exposure
-    mixins:
-      - gene grouping mixin
-
-  treatment:
-    aliases: ['medical action', 'medical intervention']
-    # 'named thing' seems too generic here but not sure what applies better here
-    is_a: named thing
-    mixins:
-      - exposure event
-      - chemical or drug or treatment
-    description: >-
-      A treatment is targeted at a disease or phenotype and may involve
-      multiple drug 'exposures', medical devices and/or procedures
-    slots:
-      - has drug
-      - has device
-      - has procedure
-    exact_mappings:
-      - OGMS:0000090
-      - SIO:001398
-    broad_mappings:
-      - MAXO:0000058
-
-  biotic exposure:
-    aliases: ['viral exposure','bacterial exposure']
-    mixins:
-      - exposure event
-    description: >-
-      An external biotic exposure is an intake of (sometimes pathological)
-      biological organisms (including viruses).
-
-  geographic exposure:
-    is_a: environmental exposure
-    mixins:
-      - exposure event
-    description: >-
-      A geographic exposure is a factor relating to geographic
-      proximity to some impactful entity.
-    close_mappings:
-      - dcid:GeologicalEvent
-    narrow_mappings:
-      - dcid:IceStoremEvent
-      - dcid:LakeEffectSnowEvent
-      - dcid:LandslideEvent
-      - dcid:MarineDenseFogEvent
-      - dcid:MarineLighteningEvent
-      - dcid:MarineStrongWindEvent
-      - dcid:MarineThunderstormWindEvent
-      - dcid:StormEvent
-      - dcid:StormSurgeTideEvent
-      - dcid:StrongWindEvent
-      - dcid:ThunderstormWindEvent
-      - dcid:TornadoEvent
-      - dcid:TropicalDepressionEvent
-      - dcid:WinterStoremEvent
-
-  environmental exposure:
-    mixins:
-      - exposure event
-    description: >-
-      A environmental exposure is a factor relating to abiotic processes
-      in the environment including sunlight (UV-B), atmospheric (heat,
-      cold, general pollution) and water-born contaminants.
-
-  behavioral exposure:
-    mixins:
-      - exposure event
-    description: >-
-      A behavioral exposure is a factor relating to behavior impacting an individual.
-
-  socioeconomic exposure:
-    mixins:
-      - exposure event
-    description: >-
-      A socioeconomic exposure is a factor relating to social and
-      financial status of an affected individual (e.g. poverty).
-    slot_usage:
-      has attribute:
-        range: socioeconomic attribute
-        required: true
-
-  ## Outcomes
-
-  outcome:
-    mixin: true
-    description: >-
-      An entity that has the role of being the consequence of an exposure event.
-      This is an abstract mixin grouping of various categories of possible
-      biological or non-biological (e.g. clinical) outcomes.
-
-  pathological process outcome:
-    mixins:
-      - outcome
-    description: >-
-      An outcome resulting from an exposure event which
-      is the manifestation of a pathological process.
-
-  pathological anatomical outcome:
-    mixins:
-      - outcome
-    description: >-
-      An outcome resulting from an exposure event which
-      is the manifestation of an abnormal anatomical structure.
-
-  disease or phenotypic feature outcome:
-    mixins:
-      - outcome
-    description: >-
-      Physiological outcomes resulting from an exposure event which
-      is the manifestation of a disease or other characteristic phenotype.
-
-  behavioral outcome:
-    mixins:
-      - outcome
-    description: >-
-      An outcome resulting from an exposure event which is
-      the manifestation of human behavior.
-
-  hospitalization outcome:
-    mixins:
-      - outcome
-    description: >-
-      An outcome resulting from an exposure event which is
-      the increased manifestation of acute (e.g. emergency
-      room visit) or chronic (inpatient) hospitalization.
-
-  mortality outcome:
-    mixins:
-      - outcome
-    description: >-
-      An outcome of death from resulting from an exposure event.
-
-  epidemiological outcome:
-    mixins:
-      - outcome
-    description: >-
-      An epidemiological outcome, such as societal disease
-      burden, resulting from an exposure event.
-    related_mappings:
-      - NCIT:C19291
-
-  socioeconomic outcome:
-    mixins:
-      - outcome
-    description: >-
-      An general social or economic outcome, such as
-      healthcare costs, utilization, etc., resulting from an exposure event
-
-  ## ------------
-  ## ASSOCIATIONS
-  ## ------------
-
-  association:
-    is_a: entity
-    description: >-
-      A typed association between two entities, supported by evidence
-    comments:
-      - This is roughly the model used by biolink and ontobio at the moment
-    slots:
-      - subject
-      - predicate
-      - object
-      - relation
-      - negated
-      - qualifiers
-      - publications
-      - has evidence
-    slot_usage:
-      type:
-        description: rdf:type of biolink:Association should be fixed at rdf:Statement
-      category:
-        range: category type
-        required: false
-    exact_mappings:
-      - OBAN:association
-      - rdf:Statement
-      - owl:Axiom
-
-  contributor association:
-    is_a: association
-    defining_slots:
-      - subject
-      - predicate
-      - object
-    description: >-
-      Any association between an entity (such as a publication)
-      and various agents that contribute to its realisation
-    slot_usage:
-      subject:
-        range: information content entity
-        description: >-
-          information content entity which an agent has helped realise
-      predicate:
-        subproperty_of: contributor
-        description: >-
-          generally one of the predicate values 'provider', 'publisher', 'editor' or 'author'
-      object:
-        range: agent
-        description: >-
-          agent helping to realise the given entity (e.g. such as a publication)
-      qualifiers:
-        description: >-
-          this field can be used to annotate special characteristics of an
-          agent relationship, such as the fact that a given author agent of
-          a publication is the 'corresponding author'
-
-  genotype to genotype part association:
-    is_a: association
-    defining_slots:
-      - subject
-      - object
-    description: >-
-      Any association between one genotype and a genotypic entity that is a sub-component of it
-    slot_usage:
-      predicate:
-        subproperty_of: has variant part
-      subject:
-        range: genotype
-        description: >-
-          parent genotype
-      object:
-        range: genotype
-        description: >-
-          child genotype
-
-  genotype to gene association:
-    description: >-
-      Any association between a genotype and a gene.
-      The genotype have have multiple variants in that gene or a single one.
-      There is no assumption of cardinality
-    is_a: association
-    defining_slots:
-      - subject
-      - object
-    slot_usage:
-      predicate:
-        description: >-
-          the relationship type used to connect genotype to gene
-      subject:
-        range: genotype
-        description: >-
-          parent genotype
-      object:
-        range: gene
-        description: >-
-          gene implicated in genotype
-
-  genotype to variant association:
-    description: >-
-      Any association between a genotype and a sequence variant.
-    is_a: association
-    defining_slots:
-      - subject
-      - object
-    slot_usage:
-      predicate:
-        # subproperty_of: ???
-        description: >-
-          the relationship type used to connect genotype to gene
-      subject:
-        range: genotype
-        description: >-
-          parent genotype
-      object:
-        range: sequence variant
-        description: >-
-          gene implicated in genotype
-
-  gene to gene association:
-    aliases: ['molecular or genetic interaction']
-    description: >-
-      abstract parent class for different kinds of gene-gene or gene product
-      to gene product relationships. Includes homology and interaction.
-    abstract: true
-    is_a: association
-    defining_slots:
-      - subject
-      - object
-    slot_usage:
-      subject:
-        range: gene or gene product
-        description: >-
-          the subject gene in the association. If the relation is symmetric,
-          subject vs object is arbitrary. We allow a gene product to stand
-          as a proxy for the gene or vice versa.
-      object:
-        range: gene or gene product
-        description: >-
-          the object gene in the association. If the relation is symmetric,
-          subject vs object is arbitrary. We allow a gene product to stand
-          as a proxy for the gene or vice versa.
-
-  gene to gene homology association:
-    description: >-
-      A homology association between two genes. May be orthology (in which
-      case the species of subject and object should differ) or paralogy
-      (in which case the species may be the same)
-    is_a: gene to gene association
-    defining_slots:
-      - subject
-      - predicate
-      - object
-    slot_usage:
-      predicate:
-        subproperty_of: homologous to
-        symmetric: true
-        description: >-
-          homology relationship type
-
-  gene expression mixin:
-    description: >-
-      Observed gene expression intensity, context (site, stage) and
-      associated phenotypic status within which the expression occurs.
-    mixin: true
-    slots:
-      - quantifier qualifier
-      - expression site
-      - stage qualifier
-      - phenotypic state
-    slot_usage:
-      quantifier qualifier:
-        description: >-
-          Optional quantitative value indicating degree of expression.
-
-  gene to gene coexpression association:
-    description: >-
-      Indicates that two genes are co-expressed,
-      generally under the same conditions.
-    is_a: gene to gene association
-    defining_slots:
-      - subject
-      - predicate
-      - object
-    mixins:
-      - gene expression mixin
-    slot_usage:
-      predicate:
-        subproperty_of: coexpressed with
-        symmetric: true
-
-  pairwise gene to gene interaction:
-    description: >-
-      An interaction between two genes or two gene products.
-      May be physical (e.g. protein binding) or genetic (between genes).
-      May be symmetric (e.g. protein interaction) or directed (e.g. phosphorylation)
-    is_a: gene to gene association
-    defining_slots:
-      - subject
-      - predicate
-      - object
-    slot_usage:
-      predicate:
-        subproperty_of: interacts with
-        symmetric: true
-      # relation:
-      #  values_from:
-      #    - ro
-      #    - mi
-        description: "interaction relationship type"
-    narrow_mappings:
-      - dcid:ProteinProteinInteraction
-
-  pairwise molecular interaction:
-    description: >-
-      An interaction at the molecular level between two physical entities
-    is_a: pairwise gene to gene interaction
-    slots:
-      # need to declare a slot before it is used,
-      # then list it in 'slots', not just a slot_usage
-      - interacting molecules category
-    defining_slots:
-      - subject
-      - predicate
-      - object
-    slot_usage:
-      subject:
-        range: molecular entity
-      id:
-        description: >-
-          identifier for the interaction. This may come from an interaction database such as IMEX.
-        examples:
-          - value: WB:WBInteraction000538741
-        values_from:
-          - IMEX
-          - BioGRID
-      predicate:
-        subproperty_of: molecularly interacts with
-      # relation:
-       # values_from:
-        #  - ro
-        #  - mi
-        description: "interaction relationship type"
-        examples:
-          - value: RO:0002447
-            description: the subject molecular phosphorylates the object molecule
-      object:
-        range: molecular entity
-
-  post translational interaction:
-    description: >-
-      A pairwise interaction between two proteins
-    is_a: pairwise molecular interaction
-    defining_slots:
-      - subject
-      - predicate
-      - object
-    slot_usage:
-      subject:
-        range: protein
-      id:
-        description: Identifier for the interaction
-        examples:
-          - value: Todo
-        values_from:
-          - Todo
-      predicate:
-        subproperty_of: molecularly interacts with
-        description: "interaction relationship type"
-        examples:
-          - value: Todo
-      object:
-        range: protein
-
-  post transcriptional interaction:
-    description: >-
-      An interaction between a transcript and a modifying actor
-    is_a: pairwise molecular interaction
-    defining_slots:
-      - subject
-      - predicate
-      - object
-    slot_usage:
-      subject:
-        range: microRNA or siRNA
-      id:
-        description: Identifier for the interaction
-        examples:
-          - value: Todo
-        values_from:
-          - Todo
-      predicate:
-        subproperty_of: molecularly interacts with
-        description: "interaction relationship type"
-        examples:
-          - value: Todo
-      object:
-        range: transcript
-
-  RISC dependent interaction:
-    description: >-
-      The interaction of a short interfering RNA with an mRNA transcript
-    is_a: post transcriptional interaction
-    defining_slots:
-      - subject
-      - predicate
-      - object
-    slot_usage:
-      subject:
-        range: microRNA or siRNA
-      object:
-        range: transcript
-
-  phosphorylation:
-    description: >-
-      The action of one protein phosphorylating another protein
-    is_a: post translational interaction
-    defining_slots:
-      - subject
-      - predicate
-      - object
-    slot_usage:
-      subject:
-        range: protein
-      id:
-        description: Identifier of phosphorylation
-      predicate:
-        subproperty_of: molecularly interacts with
-        description: "interaction relationship type"
-      object:
-        range: protein
-
-  cell line to entity association mixin:
-    description: >-
-      An relationship between a cell line and another entity
-    mixin: true
-    defining_slots:
-      - subject
-    slot_usage:
-      subject:
-        range: cell line
-
-  # TODO: figure out what gives with subject range
-  cell line to disease or phenotypic feature association:
-    is_a: association
-    mixins:
-      - cell line to entity association mixin
-      - entity to disease or phenotypic feature association mixin
-    description: >-
-      An relationship between a cell line and a disease or a phenotype, where
-      the cell line is derived from an individual with that disease or phenotype.
-    slot_usage:
-      subject:
-#        - range: cell line
-#        - range: disease or phenotypic feature
-        range: disease or phenotypic feature
-
-  chemical entity to entity association mixin:
-    description: >-
-      An interaction between a chemical entity and another entity
-    mixin: true
-    defining_slots:
-      - subject
-    slot_usage:
-      subject:
-        range: chemical entity or gene or gene product
-        description: "the chemical entity that is an interactor"
-
-  drug to entity association mixin:
-    description: >-
-      An interaction between a drug and another entity
-    is_a: chemical entity to entity association mixin
-    mixin: true
-    defining_slots:
-      - subject
-    slot_usage:
-      subject:
-        range: drug
-        description: "the drug that is an interactor"
-
-  chemical to entity association mixin:
-    description: >-
-      An interaction between a chemical entity and another entity
-    is_a: chemical entity to entity association mixin
-    mixin: true
-    defining_slots:
-      - subject
-    slot_usage:
-      subject:
-        range: chemical entity or gene or gene product
-        description: "the chemical entity or entity that is an interactor"
-
-  case to entity association mixin:
-    description: >-
-      An abstract association for use where the case is the subject
-    mixin: true
-    defining_slots:
-      - subject
-    slot_usage:
-      subject:
-        range: case
-        description: "the case (e.g. patient) that has the property"
-
-  chemical to chemical association:
-    description: >-
-      A relationship between two chemical entities. This can encompass actual
-      interactions as well as temporal causal edges, e.g. one chemical converted to another.
-    is_a: association
-    defining_slots:
-      - subject
-      - object
-    mixins:
-      - chemical to entity association mixin
-    slot_usage:
-      object:
-        range: chemical entity
-        description: "the chemical element that is the target of the statement"
-
-  reaction to participant association:
-    description:
-    is_a: chemical to chemical association
-    slots:
-      - stoichiometry
-      - reaction direction
-      - reaction side
-    slot_usage:
-      subject:
-        range: molecular entity
-    defining_slots:
-      - subject
-      - predicate
-      - object
-
-  reaction to catalyst association:
-    description:
-    is_a: reaction to participant association
-    slot_usage:
-      object:
-        range: gene or gene product
-
-  chemical to chemical derivation association:
-    description: >-
-      A causal relationship between two chemical entities, where the subject
-      represents the upstream entity and the object represents the downstream.
-      For any such association there is an implicit reaction:
-        IF
-        R has-input C1 AND
-        R has-output C2 AND
-        R enabled-by P AND
-        R type Reaction
-        THEN
-        C1 derives-into C2 <<catalyst qualifier P>>
-    is_a: chemical to chemical association
-    defining_slots:
-      - subject
-      - predicate
-      - object
-    slots:
-      - catalyst qualifier
-    slot_usage:
-      subject:
-        range: chemical entity
-        description: >-
-          the upstream chemical entity
-      object:
-        range: chemical entity
-        description: >-
-          the downstream chemical entity
-      predicate:
-        subproperty_of: derives into
-      catalyst qualifier:
-        description: >-
-          this connects the derivation edge to the chemical entity that
-          catalyzes the reaction that causes the subject chemical to
-          transform into the object chemical.
-
-  chemical to disease or phenotypic feature association:
-    description: >-
-      An interaction between a chemical entity and a phenotype or disease,
-      where the presence of the chemical gives rise to or exacerbates the phenotype.
-    is_a: association
-    narrow_mappings:
-      - SIO:000993
-    defining_slots:
-      - subject
-      - object
-    mixins:
-      - chemical to entity association mixin
-      - entity to disease or phenotypic feature association mixin
-    slot_usage:
-      object:
-        range: disease or phenotypic feature
-        description: "the disease or phenotype that is affected by the chemical"
-
-  chemical to pathway association:
-    description: >-
-      An interaction between a chemical entity and a biological process or pathway.
-    is_a: association
-    exact_mappings:
-      - SIO:001250
-    defining_slots:
-      - subject
-      - object
-    mixins:
-      - chemical to entity association mixin
-    slot_usage:
-      object:
-        range: pathway
-        description: "the pathway that is affected by the chemical"
-
-  chemical to gene association:
-    description: >-
-      An interaction between a chemical entity and a gene or gene product.
-    is_a: association
-    exact_mappings:
-      - SIO:001257
-    defining_slots:
-      - subject
-      - object
-    mixins:
-      - chemical to entity association mixin
-    slot_usage:
-      object:
-        range: gene or gene product
-        description: >-
-          the gene or gene product that is affected by the chemical.
-
-  drug to gene association:
-    description: >-
-      An interaction between a drug and a gene or gene product.
-    is_a: association
-    related_mappings:
-      - SIO:001257
-    defining_slots:
-      - subject
-      - object
-    mixins:
-      - drug to entity association mixin
-    slot_usage:
-      object:
-        range: gene or gene product
-        description: "the gene or gene product that is affected by the drug"
-
-  material sample to entity association mixin:
-    description: >-
-      An association between a material sample and something.
-    mixin: true
-    defining_slots:
-      - subject
-    slot_usage:
-      subject:
-        range: material sample
-        description: >-
-          the material sample being described
-
-  material sample derivation association:
-    description: >-
-      An association between a material sample and
-      the material entity from which it is derived.
-    is_a: association
-    defining_slots:
-      - subject
-      - predicate
-    slot_usage:
-      subject:
-        range: material sample
-        description: >-
-          the material sample being described
-      object:
-        description: >-
-          the material entity the sample was derived from. This may be another
-          material sample, or any other material entity, including for example
-          an organism, a geographic feature, or some environmental material.
-      predicate:
-        description: >-
-          derivation relationship
-        subproperty_of: derives from
-
-  material sample to disease or phenotypic feature association:
-    description: >-
-      An association between a material sample and a disease or phenotype.
-    is_a: association
-    mixins:
-      - material sample to entity association mixin
-      - entity to disease or phenotypic feature association mixin
-    defining_slots:
-      - subject
-      - object
-
-  disease to entity association mixin:
-    mixin: true
-    defining_slots:
-      - subject
-    slot_usage:
-      subject:
-        range: disease
-        description: "disease class"
-        values_from: ['mondo', 'omim', 'orphanet', 'ncit', 'doid']
-        examples:
-          - value: MONDO:0017314
-            description: "Ehlers-Danlos syndrome, vascular type"
-
-  entity to exposure event association mixin:
-    description: >-
-      An association between some entity and an exposure event.
-    mixin: true
-    defining_slots:
-      - object
-    slot_usage:
-      object:
-        range: exposure event
-
-  disease to exposure event association:
-    description: >-
-      An association between an exposure event and a disease.
-    is_a: association
-    mixins:
-      - disease to entity association mixin
-      - entity to exposure event association mixin
-    defining_slots:
-      - subject
-      - object
-
-  exposure event to entity association mixin:
-    deprecated: true
-
-  entity to outcome association mixin:
-    description: >-
-      An association between some entity and an outcome
-    mixin: true
-    defining_slots:
-      - object
-    slot_usage:
-      object:
-        range: outcome
-
-  exposure event to outcome association:
-    description: >-
-      An association between an exposure event and an outcome.
-    is_a: association
-    mixins:
-      - exposure event to entity association mixin
-      - entity to outcome association mixin
-    slots:
-      - has population context
-      - has temporal context
-    defining_slots:
-      - subject
-      - object
-
-  frequency qualifier mixin:
-    mixin: true
-    description: >-
-      Qualifier for frequency type associations
-    slots:
-      - frequency qualifier
-
-  entity to feature or disease qualifiers mixin:
-    description: >-
-      Qualifiers for entity to disease or phenotype associations.
-    mixin: true
-    is_a: frequency qualifier mixin
-    slots:
-      - severity qualifier
-      - onset qualifier
-
-  entity to phenotypic feature association mixin:
-    mixin: true
-    is_a: entity to feature or disease qualifiers mixin
-    defining_slots:
-      - object
-    slot_usage:
-      description:
-        description: >-
-          A description of specific aspects of this phenotype, not otherwise
-          covered by the phenotype ontology class
-      object:
-        range: phenotypic feature
-        description: "phenotypic class"
-        values_from: ['upheno', 'hp', 'mp', 'wbphenotype']
-        examples:
-          - value: HP:0002487
-            description: Hyperkinesis
-          - value: WBPhenotype:0000180
-            description: axon morphology variant
-          - value: MP:0001569
-            description: abnormal circulating bilirubin level
-    slots:
-      - sex qualifier
-
-  information content entity to named thing association:
-    description: >-
-      association between a named thing and a information content entity where the specific context
-      of the relationship between that named thing and the publication is unknown. For
-      example, model organisms databases often capture the knowledge that a gene is found in a
-      journal article, but not specifically the context in which that gene was documented in the article.
-      In these cases, this association with the accompanying predicate 'mentions' could be used.
-      Conversely, for more specific associations (like 'gene to disease association', the publication should
-      be captured as an edge property).
-    is_a: association
-    defining_slots:
-      - subject
-      - object
-    slot_usage:
-      subject:
-        domain: publication
-      object:
-        range: named thing
-      predicate:
-        subproperty_of: mentions
-    in_subset:
-      - model_organism_database
-
-  entity to disease association mixin:
-    description: >-
-      mixin class for any association whose object (target node) is a disease
-    mixin: true
-    is_a: entity to feature or disease qualifiers mixin
-    defining_slots:
-      - object
-    slot_usage:
-      object:
-        range: disease
-        description: "disease"
-        examples:
-          - value: MONDO:0020066
-            description: "Ehlers-Danlos syndrome"
-
-  disease or phenotypic feature to entity association mixin:
-    mixin: true
-    defining_slots:
-      - subject
-    slot_usage:
-      subject:
-        range: disease or phenotypic feature
-        description: "disease or phenotype"
-        examples:
-          - value: MONDO:0017314
-            description: "Ehlers-Danlos syndrome, vascular type"
-          - value: MP:0013229
-            description: "abnormal brain ventricle size"
-
-  disease or phenotypic feature to location association:
-    description: >-
-      An association between either a disease or a phenotypic feature and
-      an anatomical entity, where the disease/feature manifests in that site.
-    is_a: association
-    mixins:
-      - disease or phenotypic feature to entity association mixin
-    slot_usage:
-      object:
-        range: anatomical entity
-        description: >-
-          anatomical entity in which the disease or feature is found.
-        examples:
-          - value: UBERON:0002048
-            description: "lung"
-
-  entity to disease or phenotypic feature association mixin:
-    mixin: true
-    defining_slots:
-      - object
-    slot_usage:
-      object:
-        range: disease or phenotypic feature
-        description: "disease or phenotype"
-        examples:
-          - value: MONDO:0017314
-            description: "Ehlers-Danlos syndrome, vascular type"
-          - value: MP:0013229
-            description: "abnormal brain ventricle size"
-
-  genotype to entity association mixin:
-    mixin: true
-    defining_slots:
-      - subject
-    slot_usage:
-      subject:
-        range: genotype
-        description: "genotype that is the subject of the association"
-
-  genotype to phenotypic feature association:
-    is_a: association
-    defining_slots:
-      - subject
-      - object
-    description: >-
-      Any association between one genotype and a phenotypic feature, where having
-      the genotype confers the phenotype, either in isolation or through environment
-    mixins:
-      - entity to phenotypic feature association mixin
-      - genotype to entity association mixin
-    slot_usage:
-      predicate:
-        subproperty_of: has phenotype
-      subject:
-        range: genotype
-        description: >-
-          genotype that is associated with the phenotypic feature
-
-  # ie: smoke exposure to coughing phenotype? is this a denormalization?
-  exposure event to phenotypic feature association:
-    is_a: association
-    defining_slots:
-      - subject
-      - object
-    description: >-
-      Any association between an environment and a phenotypic feature,
-      where being in the environment influences the phenotype.
-    mixins:
-      - entity to phenotypic feature association mixin
-    slot_usage:
-      subject:
-        range: exposure event
-
-  disease to phenotypic feature association:
-    is_a: association
-    defining_slots:
-      - subject
-      - object
-    description: >-
-      An association between a disease and a phenotypic feature in which the
-      phenotypic feature is associated with the disease in some way.
-    mixins:
-      - entity to phenotypic feature association mixin
-      - disease to entity association mixin
-    close_mappings:
-      - dcid:DiseaseSymptomAssociation
-
-  case to phenotypic feature association:
-    description: >-
-      An association between a case (e.g. individual patient) and a phenotypic
-      feature in which the individual has or has had the phenotype.
-    is_a: association
-    defining_slots:
-      - subject
-      - object
-    mixins:
-      - entity to phenotypic feature association mixin
-      - case to entity association mixin
-
-  behavior to behavioral feature association:
-    description: >-
-      An association between an mixture behavior and
-      a behavioral feature manifested by
-      the individual exhibited or has exhibited the behavior.
-    is_a: association
-    defining_slots:
-      - subject
-      - object
-    slot_usage:
-      subject:
-        range: behavior
-        description: >-
-          behavior that is the subject of the association
-      object:
-        range: behavioral feature
-        description: >-
-          behavioral feature that is the object of the association
-    mixins:
-      - entity to phenotypic feature association mixin
-
-  gene to entity association mixin:
-    mixin: true
-    defining_slots:
-      - subject
-    slot_usage:
-      subject:
-        range: gene or gene product
-        description: >-
-          gene that is the subject of the association
-
-  variant to entity association mixin:
-    local_names:
-      ga4gh: variant annotation
-    mixin: true
-    defining_slots:
-      - subject
-    slot_usage:
-      subject:
-        range: sequence variant
-        description: >-
-          a sequence variant in which the allele state is associated with some other entity
-        examples:
-          - value: ClinVar:38077
-            description: "ClinVar representation of NM_000059.3(BRCA2):c.7007G>A (p.Arg2336His)"
-          - value: ClinGen:CA024716
-            description: "chr13:g.32921033G>C (hg19) in ClinGen"
-
-  gene to phenotypic feature association:
-    is_a: association
-    exact_mappings:
-      - WBVocab:Gene-Phenotype-Association
-    defining_slots:
-      - subject
-      - object
-    mixins:
-      - entity to phenotypic feature association mixin
-      - gene to entity association mixin
-    slot_usage:
-      subject:
-        range: gene or gene product
-        description: "gene in which variation is correlated with the phenotypic feature"
-        examples:
-          - value: HGNC:2197
-            description: "COL1A1 (Human)"
-
-  gene to disease association:
-    is_a: association
-    comments:
-      - NCIT:R176 refers to the inverse relationship
-    exact_mappings:
-      - SIO:000983
-    close_mappings:
-      - dcid:DiseaseGeneAssociation
-    defining_slots:
-      - subject
-      - object
-    mixins:
-      - entity to disease association mixin
-      - gene to entity association mixin
-    slot_usage:
-      subject:
-        range: gene or gene product
-        description: >-
-          gene in which variation is correlated with the disease,
-          may be protective or causative or associative, or as a model
-
-  variant to gene association:
-    description: >-
-      An association between a variant and a gene, where the variant has
-      a genetic association with the gene (i.e. is in linkage disequilibrium)
-    is_a: association
-    defining_slots:
-      - subject
-      - predicate
-      - object
-    mixins:
-      - variant to entity association mixin
-    slot_usage:
-      object:
-        range: gene
-      predicate:
-        subproperty_of: genetic association
-
-  variant to gene expression association:
-    description: >-
-      An association between a variant and expression of a gene (i.e. e-QTL)
-    is_a: variant to gene association
-    defining_slots:
-      - subject
-      - predicate
-      - object
-    mixins:
-      - gene expression mixin
-    slot_usage:
-      predicate:
-        subproperty_of: affects expression of
-
-  variant to population association:
-    description: >-
-      An association between a variant and a population, where the variant has
-      particular frequency in the population
-    is_a: association
-    defining_slots:
-      - subject
-      - object
-    mixins:
-      - variant to entity association mixin
-      - frequency quantifier
-      - frequency qualifier mixin
-    slot_usage:
-      subject:
-        range: sequence variant
-        description: >-
-          an allele that has a certain frequency in a given population
-        examples:
-          - value: "NC_000017.11:g.43051071A>T"
-            description: >-
-              17:41203088 A/C in gnomad
-      object:
-        range: population of individual organisms
-        description: >-
-          the population that is observed to have the frequency
-        examples:
-          - value: HANCESTRO:0010
-            description: African
-      has quotient:
-        description: >-
-          frequency of allele in population, expressed as a number with allele
-          divided by number in reference population, aka allele frequency
-        examples:
-          - value: "0.0001666"
-      has count:
-        description: >-
-          number in object population that carry a particular allele, aka allele count
-        examples:
-          - value: "4"
-            description: 4 individuals in gnomad set
-      has total:
-        description: >-
-          number all populations that carry a particular allele, aka allele number
-        examples:
-          - value: "24014"
-            description: 24014 individuals in gnomad set
-
-  population to population association:
-    description: >-
-      An association between a two populations
-    is_a: association
-    defining_slots:
-      - subject
-      - object
-    slot_usage:
-      subject:
-        range: population of individual organisms
-        description: >-
-          the population that form the subject of the association
-      object:
-        range: population of individual organisms
-        description: >-
-          the population that form the object of the association
-      predicate:
-        # subproperty_of: ???
-        description: >-
-          A relationship type that holds between the subject and object
-          populations. Standard mereological relations can be used.
-          E.g. subject part-of object, subject overlaps object.
-          Derivation relationships can also be used
-
-  variant to phenotypic feature association:
-    is_a: association
-    defining_slots:
-      - subject
-      - object
-    mixins:
-      - variant to entity association mixin
-      - entity to phenotypic feature association mixin
-    slot_usage:
-      subject:
-        range: sequence variant
-        description: >-
-          a sequence variant in which the allele state is
-          associated in some way with the phenotype state
-
-  variant to disease association:
-    is_a: association
-    comments:
-      - TODO decide no how to model pathogenicity
-    defining_slots:
-      - subject
-      - object
-    mixins:
-      - variant to entity association mixin
-      - entity to disease association mixin
-    slot_usage:
-      subject:
-        description: >-
-          a sequence variant in which the allele state
-          is associated in some way with the disease state
-        examples:
-          - value: ClinVar:52241
-            description: "NM_000059.3(BRCA2):c.7007G>C (p.Arg2336Pro)"
-      predicate:
-        description: >-
-          E.g. is pathogenic for
-        subproperty_of: related condition
-      object:
-        description: >-
-          a disease that is associated with that variant
-        examples:
-          - value: MONDO:0016419
-            description: hereditary breast cancer
-
-  genotype to disease association:
-    is_a: association
-    comments:
-      - TODO decide no how to model pathogenicity
-    defining_slots:
-      - subject
-      - object
-    mixins:
-      - genotype to entity association mixin
-      - entity to disease association mixin
-    slot_usage:
-      subject:
-        description: >-
-          a genotype that is associated in some way with a disease state
-      predicate:
-        description: >-
-          E.g. is pathogenic for
-        subproperty_of: related condition
-      object:
-        description: >-
-          a disease that is associated with that genotype
-        examples:
-          - value: MONDO:0016419
-            description: hereditary breast cancer
-
-  model to disease association mixin:
-    description: >-
-      This mixin is used for any association class for which the subject
-      (source node) plays the role of a 'model', in that it recapitulates some
-      features of the disease in a way that is useful for studying the disease
-      outside a patient carrying the disease
-    mixin: true
-    slot_usage:
-      subject:
-        description: >-
-          The entity that serves as the model of the disease. This may be
-          an organism, a strain of organism, a genotype or variant that exhibits
-          similar features, or a gene that when mutated exhibits features of the disease
-      predicate:
-        subproperty_of: model of
-        description: >-
-          The relationship to the disease
-
-  gene as a model of disease association:
-    is_a: gene to disease association
-    defining_slots:
-      - subject
-      - predicate
-      - object
-    mixins:
-      - model to disease association mixin
-      - entity to disease association mixin
-    slot_usage:
-      subject:
-        range: gene or gene product
-        description: >-
-          A gene that has a role in modeling the disease. This may be a model
-          organism ortholog of a known disease gene, or it may be a gene whose
-          mutants recapitulate core features of the disease.
-
-  variant as a model of disease association:
-    is_a: variant to disease association
-    defining_slots:
-      - subject
-      - predicate
-      - object
-    mixins:
-      - model to disease association mixin
-      - entity to disease association mixin
-    slot_usage:
-      subject:
-        range: sequence variant
-        description: >-
-          A variant that has a role in modeling the disease.
-
-  genotype as a model of disease association:
-    is_a: genotype to disease association
-    defining_slots:
-      - subject
-      - predicate
-      - object
-    mixins:
-      - model to disease association mixin
-      - entity to disease association mixin
-    slot_usage:
-      subject:
-        range: genotype
-        description: >-
-          A genotype that has a role in modeling the disease.
-
-  cell line as a model of disease association:
-    is_a: cell line to disease or phenotypic feature association
-    defining_slots:
-      - subject
-      - predicate
-      - object
-    mixins:
-      - model to disease association mixin
-      - entity to disease association mixin
-    slot_usage:
-      subject:
-        range: cell line
-        description: >-
-          A cell line derived from an organismal entity with a disease state that is used
-          as a model of that disease.
-
-  organismal entity as a model of disease association:
-    is_a: association
-    defining_slots:
-      - subject
-      - predicate
-      - object
-    mixins:
-      - model to disease association mixin
-      - entity to disease association mixin
-    slot_usage:
-      subject:
-        range: organismal entity
-        description: >-
-          A organismal entity (strain, breed) with a predisposition to a disease, or bred/created
-          specifically to model a disease.
-
-  organism to organism association:
-    is_a: association
-    defining_slots:
-      - subject
-      - predicate
-      - object
-    slot_usage:
-      subject:
-        range: individual organism
-      # relation:
-      #  values_from:
-      #    - ro
-      object:
-        range: individual organism
-        description: >-
-          An association between two individual organisms.
-
-  taxon to taxon association:
-    is_a: association
-    defining_slots:
-      - subject
-      - predicate
-      - object
-    slot_usage:
-      subject:
-        range: organism taxon
-      # relation:
-      #  values_from:
-      #    - ro
-      object:
-        range: organism taxon
-        description: >-
-          An association between individuals of different taxa.
-
-  gene has variant that contributes to disease association:
-    is_a: gene to disease association
-    defining_slots:
-      - subject
-      - predicate
-      - object
-    slots:
-      - sequence variant qualifier
-    slot_usage:
-      subject:
-        range: gene or gene product
-        description: >-
-          A gene that has a role in modeling the disease. This may be
-          a model organism ortholog of a known disease gene, or it may be
-          a gene whose mutants recapitulate core features of the disease.
-
-  gene to expression site association:
-    is_a: association
-    defining_slots:
-      - subject
-      - predicate
-      - object
-    description: >-
-      An association between a gene and an expression site,
-      possibly qualified by stage/timing info.
-    notes:
-      - "TBD: introduce subclasses for distinction between wild-type and experimental conditions?"
-    see_also: "https://github.com/monarch-initiative/ingest-artifacts/tree/master/sources/BGee"
-    slots:
-      - stage qualifier
-      - quantifier qualifier
-    slot_usage:
-      subject:
-        range: gene or gene product
-        description: "gene in which variation is correlated with the phenotypic feature"
-      object:
-        range: anatomical entity
-        description: "location in which the gene is expressed"
-        examples:
-          - value: UBERON:0002037
-            description: cerebellum
-      predicate:
-        description: "expression relationship"
-        subproperty_of: expressed in
-      stage qualifier:
-        range: life stage
-        description: "stage at which the gene is expressed in the site"
-        examples:
-          - value: UBERON:0000069
-            description: larval stage
-      quantifier qualifier:
-        description: >-
-          can be used to indicate magnitude, or also ranking
-
-  sequence variant modulates treatment association:
-    is_a: association
-    description: >-
-      An association between a sequence variant and a treatment or health intervention.
-      The treatment object itself encompasses both the disease and the drug used.
-    comments:
-      - An alternate way to model the same information could be via a qualifier
-    defining_slots:
-      - subject
-      - object
-    abstract: true
-    slot_usage:
-      subject:
-        range: sequence variant
-        description: "variant that modulates the treatment of some disease"
-      object:
-        range: treatment
-        description: "treatment whose efficacy is modulated by the subject variant"
-
-  functional association:
-    is_a: association
-    description: >-
-      An association between a macromolecular machine mixin (gene, gene product or
-      complex of gene products) and either a molecular activity, a biological
-      process or a cellular location in which a function is executed.
-    slot_usage:
-      subject:
-        range: macromolecular machine mixin
-        description: >-
-          gene, product or macromolecular complex mixin that
-          has the function associated with the GO term
-        examples:
-          - value: ZFIN:ZDB-GENE-050417-357
-            description: twist1b
-      object:
-        range: gene ontology class
-        description: >-
-          class describing the activity, process or
-          localization of the gene product
-        values_from:
-          - go
-        examples:
-          - value: GO:0016301
-            description: kinase activity
-          - value: GO:0045211
-            description: postsynaptic membrane
-
-  macromolecular machine to entity association mixin:
-    description: >-
-      an association which has a macromolecular machine mixin as a subject
-    mixin: true
-    slot_usage:
-      subject:
-        domain: macromolecular machine mixin
-
-  macromolecular machine to molecular activity association:
-    description: >-
-      A functional association between a macromolecular machine (gene,
-      gene product or complex) and a molecular activity (as represented
-      in the GO molecular function branch), where the entity
-      carries out the activity, or contributes to its execution.
-    is_a: functional association
-    mixins:
-      - macromolecular machine to entity association mixin
-    slot_usage:
-      object:
-        range: molecular activity
-
-  macromolecular machine to biological process association:
-    description: >-
-      A functional association between a macromolecular machine (gene,
-      gene product or complex) and a biological process or pathway
-      (as represented in the GO biological process branch), where the entity
-      carries out some part of the process, regulates it, or acts upstream of it.
-    is_a: functional association
-    mixins:
-      - macromolecular machine to entity association mixin
-    slot_usage:
-      object:
-        range: biological process
-
-  macromolecular machine to cellular component association:
-    description: >-
-      A functional association between a macromolecular machine (gene,
-      gene product or complex) and a cellular component (as represented
-      in the GO cellular component branch), where the entity
-      carries out its function in the cellular component.
-    is_a: functional association
-    mixins:
-      - macromolecular machine to entity association mixin
-    slot_usage:
-      object:
-        range: cellular component
-
-  molecular activity to chemical entity association:
-    is_a: association
-    description: >-
-      Added in response to capturing relationship between microbiome activities as measured via
-      measurements of blood analytes as collected via blood and stool samples
-    slot_usage:
-      subject:
-        range: molecular activity
-      object:
-        range: chemical entity
-
-  molecular activity to molecular activity association:
-    is_a: association
-    description: >-
-      Added in response to capturing relationship between microbiome activities as measured via
-      measurements of blood analytes as collected via blood and stool samples
-    slot_usage:
-      subject:
-        range: molecular activity
-      object:
-        range: molecular activity
-
-
-  gene to go term association:
-    aliases: ['functional association']
-    is_a: functional association
-    exact_mappings:
-      - WBVocab:Gene-GO-Association
-    defining_slots:
-      - subject
-      - object
-    slot_usage:
-      subject:
-        range: gene
-        description: >-
-          gene, product or macromolecular complex that has
-          the function associated with the GO term
-        examples:
-          - value: ZFIN:ZDB-GENE-050417-357
-            description: twist1b
-      object:
-        range: gene ontology class
-        description: >-
-          class describing the activity, process or
-          localization of the gene product
-        values_from:
-          - go
-        examples:
-          - value: GO:0016301
-            description: kinase activity
-
-  entity to disease association:
-    is_a: association
-    exact_mappings:
-    slots:
-      - FDA approval status
-    defining_slots:
-      - subject
-      - object
-
-  entity to phenotypic feature association:
-    is_a: association
-    exact_mappings:
-    slots:
-      - FDA approval status
-    defining_slots:
-      - subject
-      - object
-
-  ## -----------------
-  ## SEQUENCE FEATURES
-  ## -----------------
-
-  sequence association:
-    is_a: association
-    description: >-
-      An association between a sequence feature and a nucleic acid entity it is localized to.
-
-  genomic sequence localization:
-    is_a: sequence association
-    description: >-
-      A relationship between a sequence feature and a nucleic acid entity
-      it is localized to. The reference entity may be a chromosome,
-      chromosome region or information entity such as a contig.
-    slot_usage:
-      subject:
-        aliases: ['sequence feature']
-        range: nucleic acid entity
-      object:
-        aliases: ['reference']
-        range: nucleic acid entity # typically a chromosome use monochrom
-      predicate:
-        subproperty_of: has sequence location
-    slots:
-      - start interbase coordinate
-      - end interbase coordinate
-      - genome build
-      - strand
-      - phase
-    broad_mappings:
-      - dcid:Chromosome
-    exact_mappings:
-      - dcid:GenomeAnnotation
-
-  sequence feature relationship:
-    is_a: association
-    defining_slots:
-      - subject
-      - object
-    description: >-
-      For example, a particular exon is part of a particular transcript or gene
-    slot_usage:
-      subject:
-        range: nucleic acid entity
-      object:
-        range: nucleic acid entity # typically a chromosome
-    exact_mappings:
-      - CHADO:feature_relationship
-
-  transcript to gene relationship:
-    is_a: sequence feature relationship
-    defining_slots:
-      - subject
-      - object
-    description: >-
-      A gene is a collection of transcripts
-    slot_usage:
-      subject:
-        range: transcript
-      object:
-        range: gene
-
-  gene to gene product relationship:
-    is_a: sequence feature relationship
-    defining_slots:
-      - subject
-      - object
-    description: >-
-      A gene is transcribed and potentially translated to a gene product
-    slot_usage:
-      subject:
-        range: gene
-      object:
-        range: gene product mixin
-      predicate:
-        subproperty_of: has gene product
-
-  exon to transcript relationship:
-    is_a: sequence feature relationship
-    defining_slots:
-      - subject
-      - object
-    description: >-
-      A transcript is formed from multiple exons
-    slot_usage:
-      subject:
-        range: exon
-      object:
-        range: transcript
-
-  gene regulatory relationship:
-    is_a: association
-    description: >-
-      A regulatory relationship between two genes
-    slot_usage:
-      predicate:
-        # subproperty_of: ???
-        description: >-
-          the direction is always from regulator to regulated
-      subject:
-        range: gene or gene product
-        role: regulatory gene
-      object:
-        range: gene or gene product
-        role: regulated gene
-
-  anatomical entity to anatomical entity association:
-    # schema: gocam
-    is_a: association
-    abstract: true
-    defining_slots:
-      - subject
-      - object
-    slot_usage:
-      subject:
-        range: anatomical entity
-      object:
-        range: anatomical entity
-
-  anatomical entity to anatomical entity part of association:
-#      schema: gocam
-    is_a: anatomical entity to anatomical entity association
-    description: >-
-      A relationship between two anatomical entities where the relationship
-      is mereological, i.e the two entities are related by parthood. This
-      includes relationships between cellular components and cells, between
-      cells and tissues, tissues and whole organisms
-    defining_slots:
-      - predicate
-    slot_usage:
-      subject:
-        range: anatomical entity
-        description: >-
-          the part
-      object:
-        range: anatomical entity
-        description: >-
-          the whole
-      predicate:
-        subproperty_of: part of
-
-  anatomical entity to anatomical entity ontogenic association:
-    is_a: anatomical entity to anatomical entity association
-    description: >-
-      A relationship between two anatomical entities where the relationship
-      is ontogenic, i.e. the two entities are related by development. A number
-      of different relationship types can be used to specify the precise
-      nature of the relationship.
-    defining_slots:
-      - predicate
-    slot_usage:
-      subject:
-        range: anatomical entity
-        description: >-
-          the structure at a later time
-      object:
-        range: anatomical entity
-        description: >-
-          the structure at an earlier time
-      predicate:
-         subproperty_of: develops from
-
-  organism taxon to entity association:
-    mixin: true
-    description: >-
-      An association between an organism taxon and another entity
-    defining_slots:
-      - subject
-    slot_usage:
-      subject:
-        range: organism taxon
-        description: >-
-          organism taxon that is the subject of the association
-
-  organism taxon to organism taxon association:
-    is_a: association
-    abstract: true
-    mixins:
-      - organism taxon to entity association
-    description: >-
-      A relationship between two organism taxon nodes
-    defining_slots:
-      - subject
-      - object
-    slot_usage:
-      subject:
-        range: organism taxon
-      object:
-        range: organism taxon
-
-  organism taxon to organism taxon specialization:
-    is_a: organism taxon to organism taxon association
-    description: >-
-      A child-parent relationship between two taxa.
-      For example: Homo sapiens subclass_of Homo
-    defining_slots:
-      - predicate
-    slot_usage:
-      subject:
-        range: organism taxon
-        role: child taxon
-        description: >-
-          the more specific taxon
-      object:
-        range: organism taxon
-        role: parent taxon
-        description: >-
-          the more general taxon
-      predicate:
-         subproperty_of: subclass of
-
-  organism taxon to organism taxon interaction:
-    is_a: organism taxon to organism taxon association
-    description: >-
-      An interaction relationship between two taxa. This may be a symbiotic
-      relationship (encompassing mutualism and parasitism), or it may be non-symbiotic.
-      Example: plague transmitted_by flea; cattle domesticated_by Homo sapiens; plague infects Homo sapiens
-    defining_slots:
-      - predicate
-    slots:
-      - associated environmental context
-    slot_usage:
-      subject:
-        range: organism taxon
-        role: interactor taxon
-        description: >-
-          the taxon that is the subject of the association
-      object:
-        range: organism taxon
-        role: interactee taxon
-        description: >-
-          the taxon that is the subject of the association
-      predicate:
-         subproperty_of: interacts with
-      associated environmental context:
-         description: >-
-           the environment in which the two taxa interact
-
-  organism taxon to environment association:
-    is_a: association
-    abstract: true
-    mixins:
-      - organism taxon to entity association
-    slot_usage:
-      subject:
-        range: organism taxon
-        role: interactor taxon
-        description: >-
-          the taxon that is the subject of the association
-      object:
-        role: environmental context
-        description: >-
-          the environment in which the organism occurs
-      predicate:
-        description: >-
-          predicate describing the relationship between the taxon and the environment
diff --git a/biocypher/_config/test_config.yaml b/biocypher/_config/test_config.yaml
new file mode 100644
index 00000000..b1a6e631
--- /dev/null
+++ b/biocypher/_config/test_config.yaml
@@ -0,0 +1,5 @@
+# We test the quote detection
+
+valid: 'This is a valid string'
+also_valid: "This is also a valid string"
+invalid: "\t"
diff --git a/biocypher/_config/test_schema_config.yaml b/biocypher/_config/test_schema_config.yaml
index 7d2cf13f..54c03325 100644
--- a/biocypher/_config/test_schema_config.yaml
+++ b/biocypher/_config/test_schema_config.yaml
@@ -1,32 +1,13 @@
 Title: BioCypher graph schema configuration file
 
-# This configuration file establishes the hierarchy and connectivity in a newly
-# set-up BioCypher property graph database. Naming should adhere to Biolink
-# nomenclature (available at https://biolink.github.io/biolink-model/ or via
-# the python module 'biolink-model-toolkit').
-
-# The BioCypher YAML file specifies only the leaves of the hierarchy tree of
-# the desired graph; the hierarchical structure of entities will be derived
-# from the Biolink model. Thus, only the immediate constituents of the graph
-# need to be specified in the schema config.
-
-
 # ---
 # "Named Things"
 # ---
-# The implementation of named things is fairly straightforward, since they are
-# usually represented in node form, which is also the Biolink recommendation.
-# The same is not true for associations.
-#
-# A little more complex is the representation of aggregates of named things,
-# for instance in the case of functional protein complexes. These are represented
-# by so-called "mixins", which are not officially part of the hierarchy.
-
-# regular node
+
 protein:
   represented_as: node
   preferred_id: uniprot
-  label_in_input: protein
+  input_label: protein
   properties:
     name: str
     score: float
@@ -44,13 +25,11 @@ complex:
   preferred_id: complexportal
   label_in_input: complex
 
-# virtual leaves for multiple inputs
 pathway:
   represented_as: node
   preferred_id: [reactome, wikipathways]
-  label_in_input: [reactome, wikipathways]
+  input_label: [reactome, wikipathways]
 
-# merge muliple inputs
 gene:
   represented_as: node
   preferred_id: hgnc
@@ -62,7 +41,6 @@ disease:
   preferred_id: doid
   label_in_input: Disease
 
-# ad hoc child
 side effect:
   is_a: phenotypic feature
   represented_as: node
@@ -91,7 +69,6 @@ lethal variant:
   represented_as: node
   label_in_input: lethal
 
-# virtual leaves of ad hoc child
 snRNA sequence:
   is_a: nucleic acid entity
   represented_as: node
@@ -116,7 +93,6 @@ DNA sequence:
     preferredName: str
     sequence: str
 
-# virtual leaves of ad hoc multiple inheritance
 dsDNA sequence:
   is_a: [DNA sequence, nucleic acid entity]
   inherit_properties: True
@@ -128,49 +104,30 @@ dsDNA sequence:
 # ---
 # Associations
 # ---
-# Associations are not supposed to be represented in node form as per the
-# specifications of Biolink. However, in an analytic context, it often makes
-# sense to represent interactions as nodes in Neo4j, because it enables, for
-# instance, the annotation of a relationship with a publication as source of
-# evidence (also known as reification in the knowledge graph world).
 
-# The Biolink specifications for these types of relationships do
-# not go into depth; for example, the hierarchy for molecular interactions
-# (ie, "associations") ends at "PairwiseMolecularInteraction", there are no
-# explicit terms for protein-protein-interaction, phosphorylation, miRNA-
-# targeting, etc. Biolink proposes to use interaction identifiers from
-# ontologies, such as https://www.ebi.ac.uk/ols/ontologies/mi/.
-
-
-# added to custom biolink
 post translational interaction:
   is_a: pairwise molecular interaction
   represented_as: node
   label_as_edge: INTERACTS_POST_TRANSLATIONAL
   label_in_input: post_translational
 
-# auto label as edge
 phosphorylation:
   is_a: post translational interaction
   represented_as: edge
   label_in_input: phosphorylation
 
-# merge edges
 gene to disease association:
   represented_as: edge
   label_as_edge: PERTURBED_IN_DISEASE
-  label_in_input: [protein_disease, gene_disease]
+  input_label: [protein_disease, gene_disease]
   exclude_properties: accession
 
-# multiple inheritance
 mutation to tissue association:
   is_a: [genotype to tissue association, entity to tissue association, association]
   represented_as: edge
   label_as_edge: Is_Mutated_In
   label_in_input: Gene_Is_Mutated_In_Cell_Tissue
 
-
-# multiple input to multiple virtual leaves
 variant to gene association: # -> Known.... and Somatic....
   represented_as: edge
   source: [known.sequence variant, somatic.sequence variant]
@@ -180,7 +137,6 @@ variant to gene association: # -> Known.... and Somatic....
     VARIANT_FOUND_IN_GENE_Somatic_mutation_Gene
   ]
 
-# property filter
 gene to gene association:
   represented_as: edge
   label_in_input: gene_gene
diff --git a/test/__init__.py b/test/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/test/conftest.py b/test/conftest.py
new file mode 100644
index 00000000..9996fa3d
--- /dev/null
+++ b/test/conftest.py
@@ -0,0 +1,351 @@
+import os
+import random
+import string
+import tempfile
+
+import pytest
+
+from biocypher import config as bcy_config
+from biocypher._core import BioCypher
+from biocypher._write import _Neo4jBatchWriter
+from biocypher._create import BioCypherEdge, BioCypherNode
+from biocypher._connect import _Neo4jDriver
+from biocypher._mapping import OntologyMapping
+from biocypher._ontology import Ontology, OntologyAdapter
+from biocypher._translate import Translator
+
+
+# CLI option parser
+def pytest_addoption(parser):
+
+    options = (
+        ('database_name', 'The Neo4j database to be used for tests.'),
+        ('user', 'Tests access Neo4j as this user.'),
+        ('password', 'Password to access Neo4j.'),
+        ('uri', 'URI of the Neo4j server.'),
+    )
+
+    for name, help_ in options:
+
+        parser.addoption(
+            f'--{name}',
+            action='store',
+            default=None,
+            help=help_,
+        )
+
+
+# temporary output paths
+def get_random_string(length):
+    letters = string.ascii_lowercase
+    return ''.join(random.choice(letters) for _ in range(length))
+
+
+@pytest.fixture(name='path', scope='session')
+def path():
+    path = os.path.join(
+        tempfile.gettempdir(),
+        f'biocypher-test-{get_random_string(5)}',
+    )
+    os.makedirs(path, exist_ok=True)
+    return path
+
+
+@pytest.fixture(name='path_strict', scope='module')
+def path_strict():
+    path = os.path.join(
+        tempfile.gettempdir(),
+        f'biocypher-test-{get_random_string(5)}',
+    )
+    os.makedirs(path, exist_ok=True)
+    return path
+
+
+# biocypher node generator
+@pytest.fixture(scope='module')
+def _get_nodes(l: int) -> list:
+    nodes = []
+    for i in range(l):
+        bnp = BioCypherNode(
+            node_id=f'p{i+1}',
+            node_label='protein',
+            preferred_id='uniprot',
+            properties={
+                'score': 4 / (i + 1),
+                'name': 'StringProperty1',
+                'taxon': 9606,
+                'genes': ['gene1', 'gene2'],
+            },
+        )
+        nodes.append(bnp)
+        bnm = BioCypherNode(
+            node_id=f'm{i+1}',
+            node_label='microRNA',
+            preferred_id='mirbase',
+            properties={
+                'name': 'StringProperty1',
+                'taxon': 9606,
+            },
+        )
+        nodes.append(bnm)
+
+    return nodes
+
+
+# biocypher edge generator
+@pytest.fixture(scope='module')
+def _get_edges(l):
+    edges = []
+    for i in range(l):
+        e1 = BioCypherEdge(
+            source_id=f'p{i}',
+            target_id=f'p{i + 1}',
+            relationship_label='PERTURBED_IN_DISEASE',
+            properties={
+                'residue': 'T253',
+                'level': 4,
+            },
+            # we suppose the verb-form relationship label is created by
+            # translation functionality in translate.py
+        )
+        edges.append(e1)
+        e2 = BioCypherEdge(
+            source_id=f'm{i}',
+            target_id=f'p{i + 1}',
+            relationship_label='Is_Mutated_In',
+            properties={
+                'site': '3-UTR',
+                'confidence': 1,
+            },
+            # we suppose the verb-form relationship label is created by
+            # translation functionality in translate.py
+        )
+        edges.append(e2)
+    return edges
+
+
+@pytest.fixture(scope='module')
+def ontology_mapping():
+    return OntologyMapping(
+        config_file='biocypher/_config/test_schema_config.yaml'
+    )
+
+
+@pytest.fixture(scope='module')
+def translator(ontology_mapping):
+    return Translator(ontology_mapping)
+
+
+@pytest.fixture(scope='module')
+def biolink_adapter():
+    return OntologyAdapter(
+        'https://github.com/biolink/biolink-model/raw/master/biolink-model.owl.ttl',
+        'entity'
+    )
+
+
+@pytest.fixture(scope='module')
+def so_adapter():
+    return OntologyAdapter('test/so.owl', 'sequence_variant')
+
+
+@pytest.fixture(scope='module')
+def go_adapter():
+    return OntologyAdapter('test/go.owl', 'molecular_function')
+
+
+@pytest.fixture(scope='module')
+def mondo_adapter():
+    return OntologyAdapter('test/mondo.owl', 'disease')
+
+
+@pytest.fixture(scope='module')
+def hybrid_ontology(ontology_mapping):
+    return Ontology(
+        head_ontology={
+            'url':
+                'https://github.com/biolink/biolink-model/raw/master/biolink-model.owl.ttl',
+            'root_node':
+                'entity',
+        },
+        ontology_mapping=ontology_mapping,
+        tail_ontologies={
+            'so':
+                {
+                    'url': 'test/so.owl',
+                    'head_join_node': 'sequence variant',
+                    'tail_join_node': 'sequence_variant',
+                },
+            'mondo':
+                {
+                    'url': 'test/mondo.owl',
+                    'head_join_node': 'disease',
+                    'tail_join_node': 'disease',
+                }
+        },
+    )
+
+
+# neo4j batch writer fixtures
+@pytest.fixture(scope='function')
+def bw(hybrid_ontology, translator, path):
+
+    bw = _Neo4jBatchWriter(
+        ontology=hybrid_ontology,
+        translator=translator,
+        output_directory=path,
+        delimiter=';',
+        array_delimiter='|',
+        quote="'",
+    )
+
+    yield bw
+
+    # teardown
+    for f in os.listdir(path):
+        os.remove(os.path.join(path, f))
+    os.rmdir(path)
+
+
+@pytest.fixture(scope='function')
+def bw_strict(hybrid_ontology, translator, path_strict):
+
+    bw = _Neo4jBatchWriter(
+        ontology=hybrid_ontology,
+        translator=translator,
+        output_directory=path_strict,
+        delimiter=';',
+        array_delimiter='|',
+        quote="'",
+        strict_mode=True,
+    )
+
+    yield bw
+
+    # teardown
+    for f in os.listdir(path_strict):
+        os.remove(os.path.join(path_strict, f))
+    os.rmdir(path_strict)
+
+
+# core instance fixture
+@pytest.fixture(name='core', scope='module')
+def create_core(request, path):
+
+    marker = request.node.get_closest_marker('inject_core_args')
+
+    marker_args = {}
+    # check if marker has attribute param
+    if marker and hasattr(marker, 'param'):
+
+        marker_args = marker.param
+
+    if not marker_args and 'CORE' in globals():
+
+        c = globals()['CORE']
+
+    else:
+
+        core_args = {
+            'schema_config_path': 'biocypher/_config/test_schema_config.yaml',
+            'output_directory': path,
+        }
+        core_args.update(marker_args)
+
+        c = BioCypher(**core_args)
+
+        if not marker_args:
+
+            globals()['CORE'] = c
+
+    yield c
+
+
+# neo4j parameters
+@pytest.fixture(scope='module')
+def neo4j_param(request):
+
+    keys = (
+        'database_name',
+        'user',
+        'password',
+        'uri',
+    )
+
+    param = bcy_config('neo4j')
+
+    cli = {
+        key: request.config.getoption(f'--{key}') or param[key]
+        for key in keys
+    }
+
+    return cli
+
+
+# neo4j driver fixture
+@pytest.fixture(name='driver', scope='module')
+def create_driver(request, neo4j_param, translator, hybrid_ontology):
+
+    marker = request.node.get_closest_marker('inject_driver_args')
+
+    marker_args = {}
+    # check if marker has attribute param
+    if marker and hasattr(marker, 'param'):
+
+        marker_args = marker.param
+
+    if not marker_args and 'DRIVER' in globals():
+
+        d = globals()['DRIVER']
+
+    else:
+
+        driver_args = {
+            'wipe': True,
+            'multi_db': True,
+            'translator': translator,
+            'ontology': hybrid_ontology,
+        }
+        driver_args.update(marker_args)
+        driver_args.update(neo4j_param)
+
+        driver_args['database_name'] = 'test'
+
+        d = _Neo4jDriver(**driver_args)
+
+        if not marker_args:
+
+            globals()['DRIVER'] = d
+
+    yield d
+
+    # teardown
+    d._driver.query('MATCH (n:Test)'
+                    'DETACH DELETE n')
+    d._driver.query('MATCH (n:Int1)'
+                    'DETACH DELETE n')
+    d._driver.query('MATCH (n:Int2)'
+                    'DETACH DELETE n')
+
+    # to deal with merging on non-existing nodes
+    # see test_add_single_biocypher_edge_missing_nodes()
+    d._driver.query("MATCH (n2) WHERE n2.id = 'src'"
+                    'DETACH DELETE n2')
+    d._driver.query("MATCH (n3) WHERE n3.id = 'tar'"
+                    'DETACH DELETE n3')
+    d._driver.close()
+
+
+# skip test if neo4j is offline
+@pytest.fixture(autouse=True)
+def skip_if_offline(request):
+
+    marker = request.node.get_closest_marker('requires_neo4j')
+
+    if marker:
+
+        driver = request.getfixturevalue('driver')
+
+        if driver.status != 'db online':
+
+            pytest.skip('Requires connection to Neo4j server.')
diff --git a/test/profile_performance.py b/test/profile_performance.py
index 407d84f4..bee843cd 100644
--- a/test/profile_performance.py
+++ b/test/profile_performance.py
@@ -8,7 +8,7 @@
 from neo4j_utils._print import bcolors
 
 from biocypher._create import BioCypherEdge, BioCypherNode
-from biocypher._driver import Driver
+from biocypher._connect import _Neo4jDriver
 
 __all__ = [
     'create_network_by_gen',
@@ -24,7 +24,7 @@
 
 
 def create_network_by_gen(num_nodes, num_edges, profile=False, explain=False):
-    d = Driver(increment_version=False)
+    d = _Neo4jDriver(increment_version=False)
 
     def node_gen(num_nodes):
         for i in range(num_nodes):
@@ -77,7 +77,7 @@ def edge_gen(num_edges):
 
 
 def create_network_by_list(num_nodes, num_edges):
-    d = Driver(increment_version=False)
+    d = _Neo4jDriver(increment_version=False)
 
     def node_list(num_nodes):
         ls = []
@@ -102,7 +102,7 @@ def edge_list(num_edges):
 
 
 def setup_constraint():
-    d = Driver(increment_version=False)
+    d = _Neo4jDriver(increment_version=False)
     d.query(
         'CREATE CONSTRAINT test_id '
         'IF NOT EXISTS ON (n:test) '
@@ -112,13 +112,13 @@ def setup_constraint():
 
 
 def remove_constraint():
-    d = Driver(increment_version=False)
+    d = _Neo4jDriver(increment_version=False)
     d.query('DROP CONSTRAINT test_id')
     d.close()
 
 
 def delete_test_network():
-    d = Driver(increment_version=False)
+    d = _Neo4jDriver(increment_version=False)
     d.query('MATCH (n)-[:test]-() DETACH DELETE n')
     d.query('MATCH (n:test) DETACH DELETE n')
     d.close()
diff --git a/test/test_config.py b/test/test_config.py
new file mode 100644
index 00000000..e26ae474
--- /dev/null
+++ b/test/test_config.py
@@ -0,0 +1,15 @@
+import pytest
+
+from biocypher._config import _read_yaml
+
+
+def test_read_yaml():
+    schema_config = _read_yaml('biocypher/_config/test_schema_config.yaml')
+
+    assert 'protein' in schema_config
+
+
+def test_for_special_characters():
+
+    with pytest.warns(UserWarning):
+        _read_yaml('biocypher/_config/test_config.yaml')
diff --git a/test/test_core.py b/test/test_core.py
new file mode 100644
index 00000000..8ff54094
--- /dev/null
+++ b/test/test_core.py
@@ -0,0 +1,32 @@
+def test_biocypher(core):
+    assert core._dbms == 'neo4j'
+    assert core._offline == True
+    assert core._strict_mode == False
+
+
+def test_log_missing_bl_types(core, translator):
+    core._translator = translator
+    core._translator.notype = {}
+    assert core.log_missing_bl_types() == None
+
+    core._translator.notype = {'a': 1, 'b': 2}
+    mt = core.log_missing_bl_types()
+
+    assert mt.get('a') == 1 and mt.get('b') == 2
+
+
+# def test_access_translate(driver):
+
+#     driver.start_ontology()
+
+#     assert driver.translate_term('mirna') == 'MicroRNA'
+#     assert (driver.reverse_translate_term('SideEffect') == 'sider')
+#     assert (
+#         driver.translate_query('MATCH (n:reactome) RETURN n') ==
+#         'MATCH (n:Reactome.Pathway) RETURN n'
+#     )
+#     assert (
+#         driver.reverse_translate_query(
+#             'MATCH (n:Wikipathways.Pathway) RETURN n',
+#         ) == 'MATCH (n:wikipathways) RETURN n'
+#     )
diff --git a/test/test_create.py b/test/test_create.py
index b568dd5d..ce425c88 100644
--- a/test/test_create.py
+++ b/test/test_create.py
@@ -1,37 +1,8 @@
-from typing import Union
-
 from hypothesis import given
 from hypothesis import strategies as st
 import pytest
 
-from biocypher._create import (
-    VersionNode,
-    BioCypherEdge,
-    BioCypherNode,
-    BioCypherRelAsNode,
-)
-
-
-@pytest.fixture
-def version_node():
-    yield VersionNode(
-        offline=True,
-        from_config=True,
-        config_file='biocypher/_config/test_schema_config.yaml',
-    )
-
-
-def test_version_node(version_node):
-    assert version_node.get_label() == 'BioCypher'
-
-
-def test_virtual_leaves_node(version_node):
-    assert 'wikipathways.pathway' in version_node.extended_schema
-
-
-def test_getting_properties_via_config(version_node):
-    assert 'name' in version_node.extended_schema['protein'].get('properties'
-                                                                ).keys()
+from biocypher._create import BioCypherEdge, BioCypherNode, BioCypherRelAsNode
 
 
 @given(st.builds(BioCypherNode))
@@ -64,9 +35,3 @@ def test_rel_as_node(rel_as_node):
 def test_rel_as_node_invalid_node():
     with pytest.raises(TypeError):
         BioCypherRelAsNode('str', 1, 2.5122)
-
-
-def test_preferred_id_optional(version_node):
-    pti = version_node.extended_schema.get('post translational interaction')
-
-    assert pti.get('preferred_id') == 'id'
diff --git a/test/test_driver.py b/test/test_driver.py
index 564d435c..b89932f9 100644
--- a/test/test_driver.py
+++ b/test/test_driver.py
@@ -2,78 +2,34 @@
 import pytest
 
 from biocypher._create import BioCypherEdge, BioCypherNode, BioCypherRelAsNode
-from biocypher._driver import Driver
+from biocypher._connect import _Neo4jDriver
 
 
-@pytest.fixture
-def driver():
-    # neo4j database needs to be running!
-    # there needs to be a database called "test" in the neo4j instance
-    d = Driver(
-        offline=False,
-        db_name='test',
-        db_passwd='your_password_here',
-        wipe=True,
-        clear_cache=True,
-        increment_version=False,
-        user_schema_config_path='biocypher/_config/test_schema_config.yaml',
-    )
-    # create single node in case of empty DB for testing?
-    # d.add_biocypher_nodes(BioCypherNode("TestID", "Test"))
-    yield d
-
-    # teardown
-    d.query('MATCH (n:Test)'
-            'DETACH DELETE n', )
-    d.query('MATCH (n:Int1)'
-            'DETACH DELETE n', )
-    d.query('MATCH (n:Int2)'
-            'DETACH DELETE n', )
-
-    # to deal with merging on non-existing nodes
-    # see test_add_single_biocypher_edge_missing_nodes()
-    d.query("MATCH (n2) WHERE n2.id = 'src'"
-            'DETACH DELETE n2', )
-    d.query("MATCH (n3) WHERE n3.id = 'tar'"
-            'DETACH DELETE n3', )
-    d.close()
-
-
-def test_wipe():
-    # just convenience function to wipe the database in testing env
-    d = Driver(
-        db_name='test',
-        db_passwd='your_password_here',
-        wipe=True,
-        user_schema_config_path='biocypher/_config/test_schema_config.yaml',
-    )
-    d.close()
-
-    assert True
+def test_create_driver(driver):
 
+    assert isinstance(driver, _Neo4jDriver)
 
-def test_create_driver(driver):
 
-    assert isinstance(driver, Driver)
+def test_connect_to_db(driver):
 
+    assert isinstance(driver._driver.driver, neo4j.Neo4jDriver)
 
-def test_create_offline():
-    d = Driver(
-        offline=True,
-        user_schema_config_path='biocypher/_config/test_schema_config.yaml',
-    )
-    assert isinstance(d, Driver)
-    d.close()
 
+def test_increment_version(driver):
+    driver._driver.wipe_db()
+    query = "CREATE (n:BioCypher {id: 'v19700101-000000'})"
+    driver._driver.query(query)
+    driver._update_meta_graph()
 
-def test_connect_to_db(driver):
+    r, summary = driver._driver.query('MATCH (n:BioCypher) '
+                                      'RETURN n', )
 
-    assert isinstance(driver.driver, neo4j.Neo4jDriver)
+    assert len(r) == 2
 
 
 def test_explain(driver):
     query = 'MATCH (n) WITH n LIMIT 25 MATCH (n)--(m)--(f) RETURN n, m, f'
-    e = driver.explain(query)
+    e = driver._driver.explain(query)
     t = e[0]
 
     assert 'args' in t and 'identifiers' in t
@@ -81,7 +37,7 @@ def test_explain(driver):
 
 def test_profile(driver):
     query = 'MATCH (n) RETURN n LIMIT 100'
-    p = driver.profile(query)
+    p = driver._driver.profile(query)
     t = p[0]
 
     assert 'args' in t and 'identifiers' in t
@@ -101,7 +57,7 @@ def test_add_single_biocypher_node(driver):
     # neo4j database needs to be running!
     n = BioCypherNode(node_id='test_id1', node_label='Test')
     driver.add_biocypher_nodes(n)
-    r, summary = driver.query(
+    r, summary = driver._driver.query(
         'MATCH (n:Test) '
         'WITH n, n.id AS id '
         'RETURN id ',
@@ -114,7 +70,7 @@ def test_add_biocypher_node_list(driver):
     n1 = BioCypherNode(node_id='test_id1', node_label='Test')
     n2 = BioCypherNode(node_id='test_id2', node_label='Test')
     driver.add_biocypher_nodes([n1, n2])
-    r, summary = driver.query(
+    r, summary = driver._driver.query(
         'MATCH (n:Test) '
         'WITH n, n.id AS id '
         'RETURN id ',
@@ -132,20 +88,24 @@ def gen(nodes):
     g = gen([('test_id1', 'Test'), ('test_id2', 'Test')])
 
     driver.add_biocypher_nodes(g)
-    r, summary = driver.query(
+    r, summary = driver._driver.query(
         'MATCH (n:Test) '
         'WITH n, n.id AS id '
         'RETURN id ',
     )
-    assert r[0]['id'] == 'test_id1' and r[1]['id'] == 'test_id2'
+
+    ids = [n['id'] for n in r]
+
+    assert 'test_id1' in ids
+    assert 'test_id2' in ids
 
 
 def test_add_specific_id_node(driver):
     n = BioCypherNode(node_id='CHAT', node_label='Gene', preferred_id='hgnc')
     driver.add_biocypher_nodes(n)
 
-    r, summary = driver.query('MATCH (n:Gene) '
-                              'RETURN n', )
+    r, summary = driver._driver.query('MATCH (n:Gene) '
+                                      'RETURN n', )
 
     assert r[0]['n'].get('id') == 'CHAT'
     assert r[0]['n'].get('preferred_id') == 'hgnc'
@@ -155,8 +115,8 @@ def test_add_generic_id_node(driver):
     n = BioCypherNode(node_id='CHAT', node_label='Gene', preferred_id='HGNC')
     driver.add_biocypher_nodes(n)
 
-    r, summary = driver.query('MATCH (n:Gene) '
-                              'RETURN n', )
+    r, summary = driver._driver.query('MATCH (n:Gene) '
+                                      'RETURN n', )
 
     assert r[0]['n'].get('id') is not None
 
@@ -175,7 +135,7 @@ def test_add_single_biocypher_edge_explicit_node_creation(driver):
 
     e = BioCypherEdge('src', 'tar', 'Test')
     driver.add_biocypher_edges(e)
-    r, summary = driver.query(
+    r, summary = driver._driver.query(
         'MATCH (n1)-[r:Test]->(n2) '
         'WITH n1, n2, n1.id AS id1, n2.id AS id2, type(r) AS label '
         'RETURN id1, id2, label',
@@ -193,7 +153,7 @@ def test_add_single_biocypher_edge_missing_nodes(driver):
 
     e = BioCypherEdge('src', 'tar', 'Test')
     driver.add_biocypher_edges(e)
-    r, summary = driver.query(
+    r, summary = driver._driver.query(
         'MATCH (n1)-[r:Test]->(n2) '
         'WITH n1, n2, n1.id AS id1, n2.id AS id2, type(r) AS label '
         'RETURN id1, id2, label',
@@ -215,7 +175,7 @@ def test_add_biocypher_edge_list(driver):
     e1 = BioCypherEdge('src', 'tar1', 'Test1')
     e2 = BioCypherEdge('src', 'tar2', 'Test2')
     driver.add_biocypher_edges([e1, e2])
-    r, summary = driver.query(
+    r, summary = driver._driver.query(
         'MATCH (n3)<-[r2:Test2]-(n1)-[r1:Test1]->(n2) '
         'WITH n1, n2, n3, n1.id AS id1, n2.id AS id2, n3.id AS id3, '
         'type(r1) AS label1, type(r2) AS label2 '
@@ -250,7 +210,7 @@ def gen(edges):
     g = gen([e1, e2])
 
     driver.add_biocypher_edges(g)
-    r, summary = driver.query(
+    r, summary = driver._driver.query(
         'MATCH (n3)<-[r2:Test2]-(n1)-[r1:Test1]->(n2) '
         'WITH n1, n2, n3, n1.id AS id1, n2.id AS id2, n3.id AS id3, '
         'type(r1) AS label1, type(r2) AS label2 '
@@ -274,7 +234,7 @@ def test_add_biocypher_interaction_as_BioCypherRelAsNode_list(driver):
     e4 = BioCypherEdge('tar', 'int2', 'is_target_of')
     r1, r2 = BioCypherRelAsNode(i1, e1, e2), BioCypherRelAsNode(i2, e3, e4)
     driver.add_biocypher_edges([r1, r2])
-    r, summary = driver.query(
+    r, summary = driver._driver.query(
         'MATCH (n2)-[e4:is_target_of]->(i2:Int2)<-[e3:is_source_of]-'
         '(n1)-[e1:is_source_of]->(i1:Int1)<-[e2:is_target_of]-(n2)'
         'WITH n1, n2, i1, i2, n1.id AS id1, n2.id AS id2, '
@@ -309,7 +269,7 @@ def gen(lis):
             yield tup
 
     driver.add_biocypher_edges(gen(relasnode_list))
-    r, summary = driver.query(
+    r, summary = driver._driver.query(
         'MATCH (n2)-[e4:is_target_of]->(i2:Int2)<-[e3:is_source_of]-'
         '(n1)-[e1:is_source_of]->(i1:Int1)<-[e2:is_target_of]-(n2)'
         'WITH n1, n2, i1, i2, n1.id AS id1, n2.id AS id2, '
@@ -328,7 +288,7 @@ def gen(lis):
 
 
 def test_pretty_profile(driver):
-    prof, printout = driver.profile(
+    prof, printout = driver._driver.profile(
         'UNWIND [1,2,3,4,5] as id '
         'MERGE (n:Test {id: id}) '
         'MERGE (x:Test {id: id + 1})',
@@ -338,62 +298,10 @@ def test_pretty_profile(driver):
 
 
 def test_pretty_explain(driver):
-    plan, printout = driver.explain(
+    plan, printout = driver._driver.explain(
         'UNWIND [1,2,3,4,5] as id '
         'MERGE (n:Test {id: id}) '
         'MERGE (x:Test {id: id + 1})',
     )
 
     assert 'args' in plan and 'ProduceResults' in printout[0]
-
-
-# def test_access_translate(driver):
-
-#     driver.start_ontology()
-
-#     assert driver.translate_term('mirna') == 'MicroRNA'
-#     assert (driver.reverse_translate_term('SideEffect') == 'sider')
-#     assert (
-#         driver.translate_query('MATCH (n:reactome) RETURN n') ==
-#         'MATCH (n:Reactome.Pathway) RETURN n'
-#     )
-#     assert (
-#         driver.reverse_translate_query(
-#             'MATCH (n:Wikipathways.Pathway) RETURN n',
-#         ) == 'MATCH (n:wikipathways) RETURN n'
-#     )
-
-
-def test_log_missing_bl_types(driver):
-    driver.translator.notype = {}
-    assert driver.log_missing_bl_types() == None
-
-    driver.translator.notype = {'a': 1, 'b': 2}
-    mt = driver.log_missing_bl_types()
-
-    assert mt.get('a') == 1 and mt.get('b') == 2
-
-
-def test_schema_config_from_web():
-    driver = Driver(
-        offline=True,
-        user_schema_config_path=
-        'https://raw.githubusercontent.com/saezlab/BioCypher/main/biocypher/_config/test_schema_config.yaml'
-    )
-
-    assert driver.translator._ontology_mapping
-
-
-# def test_custom_biolink_schema():
-#     driver = Driver(
-#         offline=True,
-#         user_schema_config_path='biocypher/_config/test_schema_config.yaml',
-#         head_ontology='biocypher/_config/test-biolink-model.yaml',
-#     )
-#     driver.start_ontology()
-
-#     tk = driver.ontology.biolink_adapter.toolkit
-
-#     assert 'pairwise molecular interaction' in tk.get_ancestors(
-#         'post translational interaction'
-#     )
diff --git a/test/test_integration.py b/test/test_integration.py
new file mode 100644
index 00000000..96fe5865
--- /dev/null
+++ b/test/test_integration.py
@@ -0,0 +1,28 @@
+import os
+
+import pytest
+
+
+@pytest.mark.parametrize('l', [4], scope='module')
+def test_write_node_data_from_gen(core, path, _get_nodes):
+    nodes = _get_nodes
+
+    def node_gen(nodes):
+        yield from nodes
+
+    passed = core.write_nodes(node_gen(nodes))
+
+    p_csv = os.path.join(path, 'Protein-part000.csv')
+    m_csv = os.path.join(path, 'MicroRNA-part000.csv')
+
+    with open(p_csv) as f:
+        pr = f.read()
+
+    with open(m_csv) as f:
+        mi = f.read()
+
+    assert passed
+    assert "p1;'StringProperty1';4.0;9606;'gene1|gene2';'p1';'uniprot'" in pr
+    assert 'BiologicalEntity' in pr
+    assert "m1;'StringProperty1';9606;'m1';'mirbase'" in mi
+    assert 'ChemicalEntity' in mi
diff --git a/test/test_mapping.py b/test/test_mapping.py
index f54eacc3..1169f74f 100644
--- a/test/test_mapping.py
+++ b/test/test_mapping.py
@@ -1,7 +1,28 @@
 # TODO migrate as appropriate from test translate
 
-# def test_inheritance_loop(ontology):
 
-#     assert 'gene to variant association' in ontology.leaves.keys()
+def test_inheritance_loop(ontology_mapping):
 
-#     assert 'gene to variant association' not in ontology.biolink_leaves.keys()
+    assert 'gene to variant association' in ontology_mapping.schema.keys()
+
+    assert 'gene to variant association' not in ontology_mapping.extended_schema.keys(
+    )
+
+
+def test_virtual_leaves_node(ontology_mapping):
+
+    assert 'wikipathways.pathway' in ontology_mapping.extended_schema
+
+
+def test_getting_properties_via_config(ontology_mapping):
+
+    assert 'name' in ontology_mapping.extended_schema['protein'].get(
+        'properties'
+    ).keys()
+
+
+def test_preferred_id_optional(ontology_mapping):
+
+    pti = ontology_mapping.extended_schema.get('post translational interaction')
+
+    assert pti.get('preferred_id') == 'id'
diff --git a/test/test_ontology.py b/test/test_ontology.py
index 7cb5e496..098b8ff4 100644
--- a/test/test_ontology.py
+++ b/test/test_ontology.py
@@ -1,66 +1,8 @@
-import pytest
-import networkx as nx
-
-from biocypher import _misc
-from biocypher._mapping import OntologyMapping
-from biocypher._ontology import Ontology, OntologyAdapter
-
-
-@pytest.fixture
-def ontology_mapping():
-    return OntologyMapping(
-        config_file='biocypher/_config/test_schema_config.yaml'
-    )
-
-
-@pytest.fixture
-def biolink_adapter():
-    return OntologyAdapter(
-        'https://github.com/biolink/biolink-model/raw/master/biolink-model.owl.ttl',
-        'entity'
-    )
+import os
 
+import networkx as nx
 
-@pytest.fixture
-def so_adapter():
-    return OntologyAdapter('test/so.owl', 'sequence_variant')
-
-
-@pytest.fixture
-def go_adapter():
-    return OntologyAdapter('test/go.owl', 'molecular_function')
-
-
-@pytest.fixture
-def mondo_adapter():
-    return OntologyAdapter('test/mondo.owl', 'disease')
-
-
-@pytest.fixture
-def hybrid_ontology(ontology_mapping):
-    return Ontology(
-        head_ontology={
-            'url':
-                'https://github.com/biolink/biolink-model/raw/master/biolink-model.owl.ttl',
-            'root_node':
-                'entity',
-        },
-        mapping=ontology_mapping,
-        tail_ontologies={
-            'so':
-                {
-                    'url': 'test/so.owl',
-                    'head_join_node': 'sequence variant',
-                    'tail_join_node': 'sequence_variant',
-                },
-            'mondo':
-                {
-                    'url': 'test/mondo.owl',
-                    'head_join_node': 'disease',
-                    'tail_join_node': 'disease',
-                }
-        },
-    )
+from biocypher._ontology import Ontology
 
 
 def test_biolink_adapter(biolink_adapter):
@@ -156,3 +98,18 @@ def test_show_ontology(hybrid_ontology):
     treevis = hybrid_ontology.show_ontology_structure()
 
     assert treevis is not None
+
+
+def test_show_full_ontology(hybrid_ontology):
+    treevis = hybrid_ontology.show_ontology_structure(full=True)
+
+    assert treevis is not None
+
+
+def test_write_ontology(hybrid_ontology, path):
+    passed = hybrid_ontology.show_ontology_structure(to_disk=path)
+
+    f = os.path.join(path, 'ontology_structure.graphml')
+
+    assert passed
+    assert os.path.isfile(f)
diff --git a/test/test_translate.py b/test/test_translate.py
index 6034b94b..8b8dca16 100644
--- a/test/test_translate.py
+++ b/test/test_translate.py
@@ -1,47 +1,6 @@
 import pytest
 
 from biocypher._create import BioCypherEdge, BioCypherNode
-from biocypher._mapping import OntologyMapping
-from biocypher._ontology import Ontology
-from biocypher._translate import Translator
-
-
-@pytest.fixture
-def mapping():
-    return OntologyMapping(
-        config_file='biocypher/_config/test_schema_config.yaml',
-    )
-
-
-@pytest.fixture
-def translator(mapping):
-    return Translator(mapping.extended_schema)
-
-
-@pytest.fixture
-def ontology():
-    return Ontology(
-        head_ontology={
-            'url':
-                'https://raw.githubusercontent.com/biolink/biolink-model/master/biolink-model.owl.ttl',
-            'root_node':
-                'entity',
-        },
-        tail_ontologies={
-            'so':
-                {
-                    'url': 'test/so.obo',
-                    'head_join_node': 'sequence variant',
-                    'tail_join_node': 'sequence_variant',
-                },
-            'mondo':
-                {
-                    'url': 'test/mondo.obo',
-                    'head_join_node': 'disease',
-                    'tail_join_node': 'disease',
-                }
-        },
-    )
 
 
 def test_translate_nodes(translator):
@@ -210,7 +169,7 @@ def gen_edges():
 #     pass
 
 
-def test_merge_multiple_inputs_node(mapping, translator):
+def test_merge_multiple_inputs_node(ontology_mapping, translator):
     # Gene has two input labels and one preferred ID
     # no virtual leaves should be created
     # both inputs should lead to creation of the same node type
@@ -237,15 +196,19 @@ def test_merge_multiple_inputs_node(mapping, translator):
     assert t
 
     # check unique node type
-    assert not any([s for s in mapping.extended_schema.keys() if '.gene' in s])
-    assert any([s for s in mapping.extended_schema.keys() if '.pathway' in s])
+    assert not any(
+        [s for s in ontology_mapping.extended_schema.keys() if '.gene' in s]
+    )
+    assert any(
+        [s for s in ontology_mapping.extended_schema.keys() if '.pathway' in s]
+    )
 
     # check translator.translate_nodes for unique return type
     assert all([type(n) == BioCypherNode for n in t])
     assert all([n.get_label() == 'gene' for n in t])
 
 
-def test_merge_multiple_inputs_edge(mapping, translator):
+def test_merge_multiple_inputs_edge(ontology_mapping, translator):
     # GeneToDiseaseAssociation has two input labels and one preferred ID
     # no virtual leaves should be created
     # both inputs should lead to creation of the same edge type
@@ -275,12 +238,15 @@ def test_merge_multiple_inputs_edge(mapping, translator):
     # check unique edge type
     assert not any(
         [
-            s for s in mapping.extended_schema.keys()
+            s for s in ontology_mapping.extended_schema.keys()
             if '.gene to disease association' in s
         ],
     )
     assert any(
-        [s for s in mapping.extended_schema.keys() if '.sequence variant' in s],
+        [
+            s for s in ontology_mapping.extended_schema.keys()
+            if '.sequence variant' in s
+        ],
     )
 
     # check translator.translate_nodes for unique return type
@@ -288,14 +254,14 @@ def test_merge_multiple_inputs_edge(mapping, translator):
     assert all([e.get_label() == 'PERTURBED_IN_DISEASE' for e in t])
 
 
-def test_virtual_leaves_inherit_is_a(mapping):
+def test_virtual_leaves_inherit_is_a(ontology_mapping):
 
-    snrna = mapping.extended_schema.get('intact.snRNA sequence')
+    snrna = ontology_mapping.extended_schema.get('intact.snRNA sequence')
 
     assert 'is_a' in snrna.keys()
     assert snrna['is_a'] == ['snRNA sequence', 'nucleic acid entity']
 
-    dsdna = mapping.extended_schema.get('intact.dsDNA sequence')
+    dsdna = ontology_mapping.extended_schema.get('intact.dsDNA sequence')
 
     assert dsdna['is_a'] == [
         'dsDNA sequence',
@@ -304,17 +270,17 @@ def test_virtual_leaves_inherit_is_a(mapping):
     ]
 
 
-def test_virtual_leaves_inherit_properties(mapping):
+def test_virtual_leaves_inherit_properties(ontology_mapping):
 
-    snrna = mapping.extended_schema.get('intact.snRNA sequence')
+    snrna = ontology_mapping.extended_schema.get('intact.snRNA sequence')
 
     assert 'properties' in snrna.keys()
     assert 'exclude_properties' in snrna.keys()
 
 
-def test_inherit_properties(mapping):
+def test_inherit_properties(ontology_mapping):
 
-    dsdna = mapping.extended_schema.get('intact.dsDNA sequence')
+    dsdna = ontology_mapping.extended_schema.get('intact.dsDNA sequence')
 
     assert 'properties' in dsdna.keys()
     assert 'sequence' in dsdna['properties']
diff --git a/test/test_write.py b/test/test_write.py
index f7d269e7..43cffacb 100644
--- a/test/test_write.py
+++ b/test/test_write.py
@@ -1,151 +1,24 @@
 import os
-import random
-import string
-import tempfile
 
 from genericpath import isfile
 import pytest
 
-from biocypher._write import BatchWriter
+from biocypher._write import _Neo4jBatchWriter
 from biocypher._create import BioCypherEdge, BioCypherNode, BioCypherRelAsNode
-from biocypher._driver import Driver
-from biocypher._mapping import OntologyMapping
-from biocypher._ontology import Ontology
-from biocypher._translate import Translator
-
-
-def get_random_string(length):
-
-    # choose from all lowercase letter
-    letters = string.ascii_lowercase
-    return ''.join(random.choice(letters) for _ in range(length))
-
-
-# temporary output paths
-@pytest.fixture
-def path():
-    path = os.path.join(
-        tempfile.gettempdir(),
-        f'biocypher-test-{get_random_string(5)}',
-    )
-    os.makedirs(path, exist_ok=True)
-    return path
-
-
-@pytest.fixture
-def path_strict():
-    path = os.path.join(
-        tempfile.gettempdir(),
-        f'biocypher-test-{get_random_string(5)}',
-    )
-    os.makedirs(path, exist_ok=True)
-    return path
-
-
-@pytest.fixture
-def ontology_mapping():
-    return OntologyMapping(
-        config_file='biocypher/_config/test_schema_config.yaml',
-    )
-
-
-@pytest.fixture
-def translator(ontology_mapping):
-    return Translator(extended_schema=ontology_mapping.extended_schema)
-
-
-@pytest.fixture
-def ontology(ontology_mapping):
-    return Ontology(
-        head_ontology={
-            'url':
-                'https://github.com/biolink/biolink-model/raw/master/biolink-model.owl.ttl',
-            'root_node':
-                'entity',
-        },
-        mapping=ontology_mapping,
-        tail_ontologies={
-            'so':
-                {
-                    'url': 'test/so.owl',
-                    'head_join_node': 'sequence variant',
-                    'tail_join_node': 'sequence_variant'
-                },
-        },
-    )
-
-
-@pytest.fixture
-def bw(ontology, translator, path):
-
-    bw = BatchWriter(
-        ontology=ontology,
-        translator=translator,
-        dirname=path,
-        delimiter=';',
-        array_delimiter='|',
-        quote="'",
-    )
-
-    yield bw
-
-    # teardown
-    for f in os.listdir(path):
-        os.remove(os.path.join(path, f))
-    os.rmdir(path)
-
-
-@pytest.fixture
-def bw_strict(ontology, translator, path_strict):
-
-    bw = BatchWriter(
-        ontology=ontology,
-        translator=translator,
-        dirname=path_strict,
-        delimiter=';',
-        array_delimiter='|',
-        quote="'",
-        strict_mode=True,
-    )
-
-    yield bw
-
-    # teardown
-    for f in os.listdir(path_strict):
-        os.remove(os.path.join(path_strict, f))
-    os.rmdir(path_strict)
-
-
-@pytest.fixture
-def tab_bw(ontology, translator, path):
-
-    tab_bw = BatchWriter(
-        ontology=ontology,
-        translator=translator,
-        dirname=path,
-        delimiter='\t',
-        array_delimiter='|',
-        quote="'",
-    )
-
-    yield tab_bw
-
-    # teardown
-    for f in os.listdir(path):
-        os.remove(os.path.join(path, f))
-    os.rmdir(path)
 
 
 def test_writer_and_output_dir(bw, path):
 
     assert (
-        os.path.isdir(path) and isinstance(bw, BatchWriter) and bw.delim == ';'
+        os.path.isdir(path) and isinstance(bw, _Neo4jBatchWriter) and
+        bw.delim == ';'
     )
 
 
-def test_write_node_data_headers_import_call(bw, path):
+@pytest.mark.parametrize('l', [4], scope='module')
+def test_write_node_data_headers_import_call(bw, path, _get_nodes):
     # four proteins, four miRNAs
-    nodes = _get_nodes(8)
+    nodes = _get_nodes
 
     passed = bw.write_nodes(nodes[:4])
     passed = bw.write_nodes(nodes[4:])
@@ -216,56 +89,6 @@ def test_write_hybrid_ontology_nodes(bw, path):
     assert 'BiologicalEntity' in part
 
 
-def test_tab_delimiter(tab_bw, path):
-
-    nodes = _get_nodes(8)
-
-    passed = tab_bw.write_nodes(nodes[:4])
-    passed = tab_bw.write_nodes(nodes[4:])
-    tab_bw.write_import_call()
-
-    assert passed
-
-    call = os.path.join(path, 'neo4j-admin-import-call.sh')
-
-    with open(call) as f:
-        c = f.read()
-
-    assert (
-        c ==
-        f'bin/neo4j-admin import --database=neo4j --delimiter="\\t" --array-delimiter="|" --quote="\'" --force=true --nodes="{path}/Protein-header.csv,{path}/Protein-part.*" --nodes="{path}/MicroRNA-header.csv,{path}/MicroRNA-part.*" '
-    )
-
-
-def _get_nodes(l: int) -> list:
-    nodes = []
-    for i in range(l):
-        bnp = BioCypherNode(
-            node_id=f'p{i+1}',
-            node_label='protein',
-            preferred_id='uniprot',
-            properties={
-                'score': 4 / (i + 1),
-                'name': 'StringProperty1',
-                'taxon': 9606,
-                'genes': ['gene1', 'gene2'],
-            },
-        )
-        nodes.append(bnp)
-        bnm = BioCypherNode(
-            node_id=f'm{i+1}',
-            node_label='microRNA',
-            preferred_id='mirbase',
-            properties={
-                'name': 'StringProperty1',
-                'taxon': 9606,
-            },
-        )
-        nodes.append(bnm)
-
-    return nodes
-
-
 def test_property_types(bw, path):
     nodes = []
     for i in range(4):
@@ -298,8 +121,9 @@ def test_property_types(bw, path):
     assert 'BiologicalEntity' in data
 
 
-def test_write_node_data_from_list(bw, path):
-    nodes = _get_nodes(4)
+@pytest.mark.parametrize('l', [4], scope='module')
+def test_write_node_data_from_list(bw, path, _get_nodes):
+    nodes = _get_nodes
 
     passed = bw._write_node_data(nodes, batch_size=1e6)
 
@@ -319,8 +143,9 @@ def test_write_node_data_from_list(bw, path):
     assert 'ChemicalEntity' in mi
 
 
-def test_write_node_data_from_gen(bw, path):
-    nodes = _get_nodes(4)
+@pytest.mark.parametrize('l', [4], scope='module')
+def test_write_node_data_from_gen(bw, path, _get_nodes):
+    nodes = _get_nodes
 
     def node_gen(nodes):
         yield from nodes
@@ -385,8 +210,9 @@ def node_gen(nodes):
     assert 'ChemicalEntity' in mi
 
 
-def test_write_node_data_from_large_gen(bw, path):
-    nodes = _get_nodes(int(1e4 + 4))
+@pytest.mark.parametrize('l', [int(1e4 + 4)], scope='module')
+def test_write_node_data_from_large_gen(bw, path, _get_nodes):
+    nodes = _get_nodes
 
     def node_gen(nodes):
         yield from nodes
@@ -412,17 +238,18 @@ def node_gen(nodes):
     )
 
 
-def test_too_many_properties(bw):
-    nodes = _get_nodes(1)
+@pytest.mark.parametrize('l', [1], scope='module')
+def test_too_many_properties(bw, _get_nodes):
+    nodes = _get_nodes
 
     bn1 = BioCypherNode(
         node_id='p0',
         node_label='protein',
         properties={
-            'p1': get_random_string(4),
-            'p2': get_random_string(8),
-            'p3': get_random_string(16),
-            'p4': get_random_string(16),
+            'p1': 'StringProperty1',
+            'p2': 'StringProperty2',
+            'p3': 'StringProperty3',
+            'p4': 'StringProperty4',
         },
     )
     nodes.append(bn1)
@@ -438,13 +265,14 @@ def node_gen(nodes):
     assert not passed
 
 
-def test_not_enough_properties(bw, path):
-    nodes = _get_nodes(1)
+@pytest.mark.parametrize('l', [1], scope='module')
+def test_not_enough_properties(bw, path, _get_nodes):
+    nodes = _get_nodes
 
     bn1 = BioCypherNode(
         node_id='p0',
         node_label='protein',
-        properties={'p1': get_random_string(4)},
+        properties={'p1': 'StringProperty1'},
     )
     nodes.append(bn1)
 
@@ -514,8 +342,9 @@ def node_gen(nodes):
     assert 'BiologicalEntity' in p
 
 
-def test_accidental_exact_batch_size(bw, path):
-    nodes = _get_nodes(int(1e4))
+@pytest.mark.parametrize('l', [int(1e4)], scope='module')
+def test_accidental_exact_batch_size(bw, path, _get_nodes):
+    nodes = _get_nodes
 
     def node_gen(nodes):
         yield from nodes
@@ -549,8 +378,9 @@ def node_gen(nodes):
     )
 
 
-def test_write_edge_data_from_gen(bw, path):
-    edges = _get_edges(4)
+@pytest.mark.parametrize('l', [4], scope='module')
+def test_write_edge_data_from_gen(bw, path, _get_edges):
+    edges = _get_edges
 
     def edge_gen(edges):
         yield from edges
@@ -574,39 +404,10 @@ def edge_gen(edges):
     assert '\n' in c
 
 
-def _get_edges(l):
-    edges = []
-    for i in range(l):
-        e1 = BioCypherEdge(
-            source_id=f'p{i}',
-            target_id=f'p{i + 1}',
-            relationship_label='PERTURBED_IN_DISEASE',
-            properties={
-                'residue': 'T253',
-                'level': 4,
-            },
-            # we suppose the verb-form relationship label is created by
-            # translation functionality in translate.py
-        )
-        edges.append(e1)
-        e2 = BioCypherEdge(
-            source_id=f'm{i}',
-            target_id=f'p{i + 1}',
-            relationship_label='Is_Mutated_In',
-            properties={
-                'site': '3-UTR',
-                'confidence': 1,
-            },
-            # we suppose the verb-form relationship label is created by
-            # translation functionality in translate.py
-        )
-        edges.append(e2)
-    return edges
+@pytest.mark.parametrize('l', [int(1e4 + 4)], scope='module')
+def test_write_edge_data_from_large_gen(bw, path, _get_edges):
 
-
-def test_write_edge_data_from_large_gen(bw, path):
-
-    edges = _get_edges(int(1e4 + 4))
+    edges = _get_edges
 
     def edge_gen(edges):
         yield from edges
@@ -629,8 +430,9 @@ def edge_gen(edges):
     )
 
 
-def test_write_edge_data_from_list(bw, path):
-    edges = _get_edges(4)
+@pytest.mark.parametrize('l', [4], scope='module')
+def test_write_edge_data_from_list(bw, path, _get_edges):
+    edges = _get_edges
 
     passed = bw._write_edge_data(edges, batch_size=int(1e4))
 
@@ -687,10 +489,11 @@ def test_write_edge_data_from_list_no_props(bw, path):
     assert '\n' in c
 
 
-def test_write_edge_data_headers_import_call(bw, path):
-    edges = _get_edges(8)
+@pytest.mark.parametrize('l', [8], scope='module')
+def test_write_edge_data_headers_import_call(bw, path, _get_nodes, _get_edges):
+    edges = _get_edges
 
-    nodes = _get_nodes(8)
+    nodes = _get_nodes
 
     def edge_gen1(edges):
         yield from edges[:4]
@@ -722,8 +525,9 @@ def edge_gen2(edges):
     )
 
 
-def test_write_duplicate_edges(bw, path):
-    edges = _get_edges(4)
+@pytest.mark.parametrize('l', [4], scope='module')
+def test_write_duplicate_edges(bw, path, _get_edges):
+    edges = _get_edges
     edges.append(edges[0])
 
     passed = bw.write_edges(edges)
@@ -898,42 +702,6 @@ def gen(lis):
     )
 
 
-def test_write_offline(path):
-    # more of an integration test.. put in test_driver?
-    d = Driver(
-        offline=True,
-        user_schema_config_path='biocypher/_config/test_schema_config.yaml',
-        delimiter=',',
-        array_delimiter='|',
-        output_directory=path,
-        head_ontology={
-            'url':
-                'https://github.com/biolink/biolink-model/raw/master/biolink-model.owl.ttl',
-            'root_node':
-                'entity',
-        },
-    )
-
-    nodes = _get_nodes(4)
-
-    passed = d.write_nodes(nodes)
-
-    p_csv = os.path.join(path, 'Protein-part000.csv')
-    m_csv = os.path.join(path, 'MicroRNA-part000.csv')
-
-    with open(p_csv) as f:
-        pr = f.read()
-
-    with open(m_csv) as f:
-        mi = f.read()
-
-    assert passed
-    assert 'p1,"StringProperty1",4.0,9606,"gene1|gene2","p1","uniprot"' in pr
-    assert 'BiologicalEntity' in pr
-    assert 'm1,"StringProperty1",9606,"m1","mirbase"' in mi
-    assert 'ChemicalEntity' in mi
-
-
 def test_duplicate_id(bw, path):
     nodes = []
     csv = os.path.join(path, 'Protein-part000.csv')
@@ -990,8 +758,9 @@ def test_write_synonym(bw, path):
     assert 'Complex' in comp
 
 
-def test_duplicate_nodes(bw):
-    nodes = _get_nodes(4)
+@pytest.mark.parametrize('l', [4], scope='module')
+def test_duplicate_nodes(bw, _get_nodes):
+    nodes = _get_nodes
     nodes.append(
         BioCypherNode(
             node_id='p1',
@@ -1011,8 +780,9 @@ def test_duplicate_nodes(bw):
     assert 'p1' in bw.duplicate_node_ids
 
 
-def test_get_duplicate_nodes(bw):
-    nodes = _get_nodes(4)
+@pytest.mark.parametrize('l', [4], scope='module')
+def test_get_duplicate_nodes(bw, _get_nodes):
+    nodes = _get_nodes
     nodes.append(
         BioCypherNode(
             node_id='p1',
@@ -1036,8 +806,9 @@ def test_get_duplicate_nodes(bw):
     assert 'p1' in ids
 
 
-def test_duplicate_edges(bw):
-    edges = _get_edges(4)
+@pytest.mark.parametrize('l', [4], scope='module')
+def test_duplicate_edges(bw, _get_edges):
+    edges = _get_edges
     edges.append(
         BioCypherEdge(
             source_id='p1',
@@ -1052,8 +823,9 @@ def test_duplicate_edges(bw):
     assert 'p1_p2' in bw.duplicate_edge_ids
 
 
-def test_get_duplicate_edges(bw):
-    edges = _get_edges(4)
+@pytest.mark.parametrize('l', [4], scope='module')
+def test_get_duplicate_edges(bw, _get_edges):
+    edges = _get_edges
     edges.append(
         BioCypherEdge(
             source_id='p1',