From 64c6114093d6ddc361d6fa6a4939b64acfbb494f Mon Sep 17 00:00:00 2001 From: Chris Mungall Date: Wed, 24 Apr 2024 17:54:50 -0700 Subject: [PATCH] Adding option for non-redundant entialed relationships. (#740) * Adding option for non-redundant entialed relationships. Fixes #739 * tests * removing ---s with messed with CLI formattinh * Extended relationships notebook for entailed-direct * skip correct test --- notebooks/Commands/Relationships.ipynb | 792 +++--- notebooks/Commands/ValidateDefinitions.ipynb | 2164 +++++++++++++++-- .../output/trigeminal-ganglion-graph.png | Bin 0 -> 248946 bytes src/oaklib/cli.py | 244 +- src/oaklib/interfaces/obograph_interface.py | 32 + tests/__init__.py | 2 + tests/test_implementations/__init__.py | 39 + tests/test_implementations/test_simple_obo.py | 4 + tests/test_implementations/test_sqldb.py | 4 + 9 files changed, 2611 insertions(+), 670 deletions(-) create mode 100644 notebooks/Commands/output/trigeminal-ganglion-graph.png diff --git a/notebooks/Commands/Relationships.ipynb b/notebooks/Commands/Relationships.ipynb index 50037f3f9..b1ec428aa 100644 --- a/notebooks/Commands/Relationships.ipynb +++ b/notebooks/Commands/Relationships.ipynb @@ -10,7 +10,9 @@ "This notebook is intended as a supplement to the [main OAK CLI docs](https://incatools.github.io/ontology-access-kit/cli.html).\n", "\n", "This notebook provides examples for the `relationships` command, which can be used to lookup direct and inferred relationships\n", - "between entities in ontologies\n", + "between entities in ontologies.\n", + "\n", + "Overall background on the concepts here can be found in the [OAK Guide to Graphs and Relationships](https://incatools.github.io/ontology-access-kit/guide/relationships-and-graphs.html).\n", "\n", "## Help Option\n", "\n", @@ -19,9 +21,14 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 28, "id": "97ed8cee", - "metadata": {}, + "metadata": { + "ExecuteTime": { + "end_time": "2024-04-19T22:17:52.798918Z", + "start_time": "2024-04-19T22:17:50.223140Z" + } + }, "outputs": [ { "name": "stdout", @@ -68,8 +75,18 @@ " runoak -i uberon.db relationships -p RO:0002178 .desc//p=i \"artery\" .and\r\n", " .desc//p=i,p \"limb\"\r\n", "\r\n", + " More examples:\r\n", + "\r\n", + " https://github.com/INCATools/ontology-access-\r\n", + " kit/blob/main/notebooks/Commands/Relationships.ipynb\r\n", + "\r\n", + " Python API:\r\n", + "\r\n", + " https://incatools.github.io/ontology-access-kit/interfaces/basic\r\n", + "\r\n", "Options:\r\n", - " -p, --predicates TEXT A comma-separated list of predicates\r\n", + " -p, --predicates TEXT A comma-separated list of predicates. This\r\n", + " may be a shorthand (i, p) or CURIE\r\n", " --direction [up|down|both] direction of traversal over edges, which up\r\n", " is subject to object, down is object to\r\n", " subject.\r\n", @@ -85,6 +102,10 @@ " --include-entailed / --no-include-entailed\r\n", " Include entailed indirect relationships\r\n", " [default: no-include-entailed]\r\n", + " --non-redundant-entailed / --no-non-redundant-entailed\r\n", + " Include entailed but exclude entailed\r\n", + " redundant relationships [default: no-non-\r\n", + " redundant-entailed]\r\n", " --include-tbox / --no-include-tbox\r\n", " Include class-class relationships (subclass\r\n", " and existentials) [default: include-tbox]\r\n", @@ -92,6 +113,9 @@ " Include instance relationships (class and\r\n", " object property assertions) [default:\r\n", " include-abox]\r\n", + " --include-metadata / --no-include-metadata\r\n", + " Include metadata (axiom annotations)\r\n", + " [default: no-include-metadata]\r\n", " --help Show this message and exit.\r\n" ] } @@ -107,14 +131,19 @@ "source": [ "## Set up an alias\n", "\n", - "For convenience we will set up an alias for use in this notebook" + "For convenience we will set up an alias for use in this notebook. This will allow us to use `uberon ...` rather than `runoak -i sqlite:obo:uberon ...` for the rest of the notebook." ] }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 2, "id": "29d2249a", - "metadata": {}, + "metadata": { + "ExecuteTime": { + "end_time": "2024-04-19T19:06:44.192590Z", + "start_time": "2024-04-19T19:06:44.188656Z" + } + }, "outputs": [], "source": [ "alias uberon runoak -i sqlite:obo:uberon" @@ -125,25 +154,32 @@ "id": "1a7c69d7", "metadata": {}, "source": [ - "## Direct relationships for a subject term" + "## Direct relationships for a subject term\n", + "\n", + "First we will look up the direct [asserted](https://incatools.github.io/ontology-access-kit/glossary.html#term-Asserted) relationships in Uberon with `finger` as the subject term." ] }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 3, "id": "2c406bc1", - "metadata": {}, + "metadata": { + "ExecuteTime": { + "end_time": "2024-04-19T19:06:47.918434Z", + "start_time": "2024-04-19T19:06:44.193418Z" + } + }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "subject\tsubject_label\tpredicate\tpredicate_label\tobject\tobject_label\n", - "UBERON:0002389\tmanual digit\tBFO:0000050\tpart of\tUBERON:0002102\tforelimb\n", - "UBERON:0002389\tmanual digit\tBFO:0000050\tpart of\tUBERON:0002398\tmanus\n", - "UBERON:0002389\tmanual digit\tBFO:0000050\tpart of\tUBERON:0012141\tmanual digitopodium region\n", - "UBERON:0002389\tmanual digit\tBFO:0000050\tpart of\tUBERON:5002389\tmanual digit plus metapodial segment\n", - "UBERON:0002389\tmanual digit\trdfs:subClassOf\tNone\tUBERON:0002544\tdigit\n" + "subject\tsubject_label\tpredicate\tpredicate_label\tobject\tobject_label\r\n", + "UBERON:0002389\tmanual digit\tBFO:0000050\tpart of\tUBERON:0002102\tforelimb\r\n", + "UBERON:0002389\tmanual digit\tBFO:0000050\tpart of\tUBERON:0002398\tmanus\r\n", + "UBERON:0002389\tmanual digit\tBFO:0000050\tpart of\tUBERON:0012141\tmanual digitopodium region\r\n", + "UBERON:0002389\tmanual digit\tBFO:0000050\tpart of\tUBERON:5002389\tmanual digit plus metapodial segment\r\n", + "UBERON:0002389\tmanual digit\trdfs:subClassOf\tNone\tUBERON:0002544\tdigit\r\n" ] } ], @@ -151,36 +187,41 @@ "uberon relationships finger" ] }, + { + "cell_type": "markdown", + "source": [ + "Like most OAK commands, the `relationships` command can take lists of labels, lists of IDs, or even complex query terms (which might themselves involve graphs)." + ], + "metadata": { + "collapsed": false + }, + "id": "860ef175aa0e1bb8" + }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 5, "id": "70acf6ae", - "metadata": {}, + "metadata": { + "ExecuteTime": { + "end_time": "2024-04-19T19:10:02.524364Z", + "start_time": "2024-04-19T19:09:59.249190Z" + } + }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "subject\tsubject_label\tpredicate\tpredicate_label\tobject\tobject_label\r", - "\r\n", - "UBERON:0001466\tpedal digit\tBFO:0000050\tpart of\tUBERON:0002387\tpes\r", - "\r\n", - "UBERON:0001466\tpedal digit\tBFO:0000050\tpart of\tUBERON:0012142\tpedal digitopodium region\r", - "\r\n", - "UBERON:0001466\tpedal digit\tBFO:0000050\tpart of\tUBERON:5001466\tpedal digit plus metapodial segment\r", - "\r\n", - "UBERON:0001466\tpedal digit\trdfs:subClassOf\tNone\tUBERON:0002544\tdigit\r", - "\r\n", - "UBERON:0002389\tmanual digit\tBFO:0000050\tpart of\tUBERON:0002102\tforelimb\r", - "\r\n", - "UBERON:0002389\tmanual digit\tBFO:0000050\tpart of\tUBERON:0002398\tmanus\r", - "\r\n", - "UBERON:0002389\tmanual digit\tBFO:0000050\tpart of\tUBERON:0012141\tmanual digitopodium region\r", - "\r\n", - "UBERON:0002389\tmanual digit\tBFO:0000050\tpart of\tUBERON:5002389\tmanual digit plus metapodial segment\r", - "\r\n", - "UBERON:0002389\tmanual digit\trdfs:subClassOf\tNone\tUBERON:0002544\tdigit\r", - "\r\n" + "subject\tsubject_label\tpredicate\tpredicate_label\tobject\tobject_label\r\n", + "UBERON:0001466\tpedal digit\tBFO:0000050\tpart of\tUBERON:0002387\tpes\r\n", + "UBERON:0001466\tpedal digit\tBFO:0000050\tpart of\tUBERON:0012142\tpedal digitopodium region\r\n", + "UBERON:0001466\tpedal digit\tBFO:0000050\tpart of\tUBERON:5001466\tpedal digit plus metapodial segment\r\n", + "UBERON:0001466\tpedal digit\trdfs:subClassOf\tNone\tUBERON:0002544\tdigit\r\n", + "UBERON:0002389\tmanual digit\tBFO:0000050\tpart of\tUBERON:0002102\tforelimb\r\n", + "UBERON:0002389\tmanual digit\tBFO:0000050\tpart of\tUBERON:0002398\tmanus\r\n", + "UBERON:0002389\tmanual digit\tBFO:0000050\tpart of\tUBERON:0012141\tmanual digitopodium region\r\n", + "UBERON:0002389\tmanual digit\tBFO:0000050\tpart of\tUBERON:5002389\tmanual digit plus metapodial segment\r\n", + "UBERON:0002389\tmanual digit\trdfs:subClassOf\tNone\tUBERON:0002544\tdigit\r\n" ] } ], @@ -188,81 +229,96 @@ "uberon relationships finger toe" ] }, + { + "cell_type": "markdown", + "source": [ + "Next we will show all direct relationships for all is-a descendants of `finger`." + ], + "metadata": { + "collapsed": false + }, + "id": "747e2b9c7333997b" + }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 6, "id": "84dc3c97", - "metadata": {}, + "metadata": { + "ExecuteTime": { + "end_time": "2024-04-19T19:10:29.447982Z", + "start_time": "2024-04-19T19:10:24.216377Z" + } + }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "subject\tsubject_label\tpredicate\tpredicate_label\tobject\tobject_label\n", - "UBERON:0001463\tmanual digit 1\tBFO:0000050\tpart of\tUBERON:0002398\tmanus\n", - "UBERON:0001463\tmanual digit 1\tBFO:0000050\tpart of\tUBERON:0012141\tmanual digitopodium region\n", - "UBERON:0001463\tmanual digit 1\tBFO:0000050\tpart of\tUBERON:5001463\tmanual digit 1 plus metapodial segment\n", - "UBERON:0001463\tmanual digit 1\tBSPO:0001113\tpreaxialmost part of\tUBERON:0002398\tmanus\n", - "UBERON:0001463\tmanual digit 1\trdfs:subClassOf\tNone\tUBERON:0006048\tdigit 1\n", - "UBERON:0001463\tmanual digit 1\trdfs:subClassOf\tNone\tUBERON:0019231\tmanual digit 1 or 5\n", - "UBERON:0002389\tmanual digit\tBFO:0000050\tpart of\tUBERON:0002102\tforelimb\n", - "UBERON:0002389\tmanual digit\tBFO:0000050\tpart of\tUBERON:0002398\tmanus\n", - "UBERON:0002389\tmanual digit\tBFO:0000050\tpart of\tUBERON:0012141\tmanual digitopodium region\n", - "UBERON:0002389\tmanual digit\tBFO:0000050\tpart of\tUBERON:5002389\tmanual digit plus metapodial segment\n", - "UBERON:0002389\tmanual digit\trdfs:subClassOf\tNone\tUBERON:0002544\tdigit\n", - "UBERON:0003622\tmanual digit 2\tBFO:0000050\tpart of\tUBERON:0002398\tmanus\n", - "UBERON:0003622\tmanual digit 2\tBFO:0000050\tpart of\tUBERON:0012141\tmanual digitopodium region\n", - "UBERON:0003622\tmanual digit 2\tBFO:0000050\tpart of\tUBERON:5003622\tmanual digit 2 plus metapodial segment\n", - "UBERON:0003622\tmanual digit 2\trdfs:subClassOf\tNone\tUBERON:0006049\tdigit 2\n", - "UBERON:0003622\tmanual digit 2\trdfs:subClassOf\tNone\tUBERON:0019232\tmanual digit 2, 3 or 4\n", - "UBERON:0003623\tmanual digit 3\tBFO:0000050\tpart of\tUBERON:0002398\tmanus\n", - "UBERON:0003623\tmanual digit 3\tBFO:0000050\tpart of\tUBERON:0012141\tmanual digitopodium region\n", - "UBERON:0003623\tmanual digit 3\tBFO:0000050\tpart of\tUBERON:5003623\tmanual digit 3 plus metapodial segment\n", - "UBERON:0003623\tmanual digit 3\trdfs:subClassOf\tNone\tUBERON:0006050\tdigit 3\n", - "UBERON:0003623\tmanual digit 3\trdfs:subClassOf\tNone\tUBERON:0019232\tmanual digit 2, 3 or 4\n", - "UBERON:0003624\tmanual digit 4\tBFO:0000050\tpart of\tUBERON:0002398\tmanus\n", - "UBERON:0003624\tmanual digit 4\tBFO:0000050\tpart of\tUBERON:0012141\tmanual digitopodium region\n", - "UBERON:0003624\tmanual digit 4\tBFO:0000050\tpart of\tUBERON:5003624\tmanual digit 4 plus metapodial segment\n", - "UBERON:0003624\tmanual digit 4\trdfs:subClassOf\tNone\tUBERON:0006051\tdigit 4\n", - "UBERON:0003624\tmanual digit 4\trdfs:subClassOf\tNone\tUBERON:0019232\tmanual digit 2, 3 or 4\n", - "UBERON:0003625\tmanual digit 5\tBFO:0000050\tpart of\tUBERON:0002398\tmanus\n", - "UBERON:0003625\tmanual digit 5\tBFO:0000050\tpart of\tUBERON:0012141\tmanual digitopodium region\n", - "UBERON:0003625\tmanual digit 5\tBFO:0000050\tpart of\tUBERON:5003625\tmanual digit 5 plus metapodial segment\n", - "UBERON:0003625\tmanual digit 5\trdfs:subClassOf\tNone\tUBERON:0006052\tdigit 5\n", - "UBERON:0003625\tmanual digit 5\trdfs:subClassOf\tNone\tUBERON:0019231\tmanual digit 1 or 5\n", - "UBERON:0008444\twebbed manual digit\tBFO:0000050\tpart of\tUBERON:0008441\twebbed manus\n", - "UBERON:0008444\twebbed manual digit\trdfs:subClassOf\tNone\tUBERON:0002389\tmanual digit\n", - "UBERON:0008444\twebbed manual digit\trdfs:subClassOf\tNone\tUBERON:0008443\twebbed digit\n", - "UBERON:0011981\tmanual digit 6\tBFO:0000050\tpart of\tUBERON:5011981\tmanual digit 6 plus metapodial segment\n", - "UBERON:0011981\tmanual digit 6\trdfs:subClassOf\tNone\tUBERON:0002389\tmanual digit\n", - "UBERON:0011981\tmanual digit 6\trdfs:subClassOf\tNone\tUBERON:0016856\tdigit 6\n", - "UBERON:0011982\tmanual digit 7\tBFO:0000050\tpart of\tUBERON:5011982\tmanual digit 7 plus metapodial segment\n", - "UBERON:0011982\tmanual digit 7\trdfs:subClassOf\tNone\tUBERON:0002389\tmanual digit\n", - "UBERON:0011982\tmanual digit 7\trdfs:subClassOf\tNone\tUBERON:0016857\tdigit 7\n", - "UBERON:0011983\tmanual digit 8\tBFO:0000050\tpart of\tUBERON:5011983\tmanual digit 8 plus metapodial segment\n", - "UBERON:0011983\tmanual digit 8\trdfs:subClassOf\tNone\tUBERON:0002389\tmanual digit\n", - "UBERON:0011983\tmanual digit 8\trdfs:subClassOf\tNone\tUBERON:0016858\tdigit 8\n", - "UBERON:0012260\talular digit\tBFO:0000050\tpart of\tUBERON:5012260\talular digit plus metapodial segment\n", - "UBERON:0012260\talular digit\tBSPO:0001113\tpreaxialmost part of\tUBERON:0002398\tmanus\n", - "UBERON:0012260\talular digit\tRO:0002160\tonly in taxon\tNCBITaxon:8782\tAves\n", - "UBERON:0012260\talular digit\tRO:0002254\thas developmental contribution from\tUBERON:0005692\tmanual digit 2 mesenchyme\n", - "UBERON:0012260\talular digit\tRO:0002254\thas developmental contribution from\tUBERON:0010564\tmanual digit 1 mesenchyme\n", - "UBERON:0012260\talular digit\trdfs:subClassOf\tNone\tUBERON:0002389\tmanual digit\n", - "UBERON:0012261\tmanual major digit (Aves)\tBFO:0000050\tpart of\tUBERON:5012261\tmanual major digit (Aves) plus metapodial segment\n", - "UBERON:0012261\tmanual major digit (Aves)\tRO:0002160\tonly in taxon\tNCBITaxon:8782\tAves\n", - "UBERON:0012261\tmanual major digit (Aves)\tRO:0002254\thas developmental contribution from\tUBERON:0005693\tmanual digit 3 mesenchyme\n", - "UBERON:0012261\tmanual major digit (Aves)\trdfs:subClassOf\tNone\tUBERON:0002389\tmanual digit\n", - "UBERON:0012262\tmanual minor digit (Aves)\tBFO:0000050\tpart of\tUBERON:5012262\tmanual minor digit (Aves) plus metapodial segment\n", - "UBERON:0012262\tmanual minor digit (Aves)\tBSPO:0001115\tpostaxialmost part of\tUBERON:0002398\tmanus\n", - "UBERON:0012262\tmanual minor digit (Aves)\tRO:0002160\tonly in taxon\tNCBITaxon:8782\tAves\n", - "UBERON:0012262\tmanual minor digit (Aves)\tRO:0002254\thas developmental contribution from\tUBERON:0005694\tmanual digit 4 mesenchyme\n", - "UBERON:0012262\tmanual minor digit (Aves)\trdfs:subClassOf\tNone\tUBERON:0002389\tmanual digit\n", - "UBERON:0019231\tmanual digit 1 or 5\tBFO:0000050\tpart of\tUBERON:0002398\tmanus\n", - "UBERON:0019231\tmanual digit 1 or 5\trdfs:subClassOf\tNone\tUBERON:0002389\tmanual digit\n", - "UBERON:0019231\tmanual digit 1 or 5\trdfs:subClassOf\tNone\tUBERON:0019221\tdigit 1 or 5\n", - "UBERON:0019232\tmanual digit 2, 3 or 4\tBFO:0000050\tpart of\tUBERON:0002398\tmanus\n", - "UBERON:0019232\tmanual digit 2, 3 or 4\trdfs:subClassOf\tNone\tUBERON:0002389\tmanual digit\n", - "UBERON:0019232\tmanual digit 2, 3 or 4\trdfs:subClassOf\tNone\tUBERON:0019222\tdigit 2, 3 or 4\n" + "subject\tsubject_label\tpredicate\tpredicate_label\tobject\tobject_label\r\n", + "UBERON:0001463\tmanual digit 1\tBFO:0000050\tpart of\tUBERON:0002398\tmanus\r\n", + "UBERON:0001463\tmanual digit 1\tBFO:0000050\tpart of\tUBERON:0012141\tmanual digitopodium region\r\n", + "UBERON:0001463\tmanual digit 1\tBFO:0000050\tpart of\tUBERON:5001463\tmanual digit 1 plus metapodial segment\r\n", + "UBERON:0001463\tmanual digit 1\tBSPO:0001113\tpreaxialmost part of\tUBERON:0002398\tmanus\r\n", + "UBERON:0001463\tmanual digit 1\trdfs:subClassOf\tNone\tUBERON:0006048\tdigit 1\r\n", + "UBERON:0001463\tmanual digit 1\trdfs:subClassOf\tNone\tUBERON:0019231\tmanual digit 1 or 5\r\n", + "UBERON:0002389\tmanual digit\tBFO:0000050\tpart of\tUBERON:0002102\tforelimb\r\n", + "UBERON:0002389\tmanual digit\tBFO:0000050\tpart of\tUBERON:0002398\tmanus\r\n", + "UBERON:0002389\tmanual digit\tBFO:0000050\tpart of\tUBERON:0012141\tmanual digitopodium region\r\n", + "UBERON:0002389\tmanual digit\tBFO:0000050\tpart of\tUBERON:5002389\tmanual digit plus metapodial segment\r\n", + "UBERON:0002389\tmanual digit\trdfs:subClassOf\tNone\tUBERON:0002544\tdigit\r\n", + "UBERON:0003622\tmanual digit 2\tBFO:0000050\tpart of\tUBERON:0002398\tmanus\r\n", + "UBERON:0003622\tmanual digit 2\tBFO:0000050\tpart of\tUBERON:0012141\tmanual digitopodium region\r\n", + "UBERON:0003622\tmanual digit 2\tBFO:0000050\tpart of\tUBERON:5003622\tmanual digit 2 plus metapodial segment\r\n", + "UBERON:0003622\tmanual digit 2\trdfs:subClassOf\tNone\tUBERON:0006049\tdigit 2\r\n", + "UBERON:0003622\tmanual digit 2\trdfs:subClassOf\tNone\tUBERON:0019232\tmanual digit 2, 3 or 4\r\n", + "UBERON:0003623\tmanual digit 3\tBFO:0000050\tpart of\tUBERON:0002398\tmanus\r\n", + "UBERON:0003623\tmanual digit 3\tBFO:0000050\tpart of\tUBERON:0012141\tmanual digitopodium region\r\n", + "UBERON:0003623\tmanual digit 3\tBFO:0000050\tpart of\tUBERON:5003623\tmanual digit 3 plus metapodial segment\r\n", + "UBERON:0003623\tmanual digit 3\trdfs:subClassOf\tNone\tUBERON:0006050\tdigit 3\r\n", + "UBERON:0003623\tmanual digit 3\trdfs:subClassOf\tNone\tUBERON:0019232\tmanual digit 2, 3 or 4\r\n", + "UBERON:0003624\tmanual digit 4\tBFO:0000050\tpart of\tUBERON:0002398\tmanus\r\n", + "UBERON:0003624\tmanual digit 4\tBFO:0000050\tpart of\tUBERON:0012141\tmanual digitopodium region\r\n", + "UBERON:0003624\tmanual digit 4\tBFO:0000050\tpart of\tUBERON:5003624\tmanual digit 4 plus metapodial segment\r\n", + "UBERON:0003624\tmanual digit 4\trdfs:subClassOf\tNone\tUBERON:0006051\tdigit 4\r\n", + "UBERON:0003624\tmanual digit 4\trdfs:subClassOf\tNone\tUBERON:0019232\tmanual digit 2, 3 or 4\r\n", + "UBERON:0003625\tmanual digit 5\tBFO:0000050\tpart of\tUBERON:0002398\tmanus\r\n", + "UBERON:0003625\tmanual digit 5\tBFO:0000050\tpart of\tUBERON:0012141\tmanual digitopodium region\r\n", + "UBERON:0003625\tmanual digit 5\tBFO:0000050\tpart of\tUBERON:5003625\tmanual digit 5 plus metapodial segment\r\n", + "UBERON:0003625\tmanual digit 5\trdfs:subClassOf\tNone\tUBERON:0006052\tdigit 5\r\n", + "UBERON:0003625\tmanual digit 5\trdfs:subClassOf\tNone\tUBERON:0019231\tmanual digit 1 or 5\r\n", + "UBERON:0008444\twebbed manual digit\tBFO:0000050\tpart of\tUBERON:0008441\twebbed manus\r\n", + "UBERON:0008444\twebbed manual digit\trdfs:subClassOf\tNone\tUBERON:0002389\tmanual digit\r\n", + "UBERON:0008444\twebbed manual digit\trdfs:subClassOf\tNone\tUBERON:0008443\twebbed digit\r\n", + "UBERON:0011981\tmanual digit 6\tBFO:0000050\tpart of\tUBERON:5011981\tmanual digit 6 plus metapodial segment\r\n", + "UBERON:0011981\tmanual digit 6\trdfs:subClassOf\tNone\tUBERON:0002389\tmanual digit\r\n", + "UBERON:0011981\tmanual digit 6\trdfs:subClassOf\tNone\tUBERON:0016856\tdigit 6\r\n", + "UBERON:0011982\tmanual digit 7\tBFO:0000050\tpart of\tUBERON:5011982\tmanual digit 7 plus metapodial segment\r\n", + "UBERON:0011982\tmanual digit 7\trdfs:subClassOf\tNone\tUBERON:0002389\tmanual digit\r\n", + "UBERON:0011982\tmanual digit 7\trdfs:subClassOf\tNone\tUBERON:0016857\tdigit 7\r\n", + "UBERON:0011983\tmanual digit 8\tBFO:0000050\tpart of\tUBERON:5011983\tmanual digit 8 plus metapodial segment\r\n", + "UBERON:0011983\tmanual digit 8\trdfs:subClassOf\tNone\tUBERON:0002389\tmanual digit\r\n", + "UBERON:0011983\tmanual digit 8\trdfs:subClassOf\tNone\tUBERON:0016858\tdigit 8\r\n", + "UBERON:0012260\talular digit\tBFO:0000050\tpart of\tUBERON:5012260\talular digit plus metapodial segment\r\n", + "UBERON:0012260\talular digit\tBSPO:0001113\tpreaxialmost part of\tUBERON:0002398\tmanus\r\n", + "UBERON:0012260\talular digit\tRO:0002160\tonly in taxon\tNCBITaxon:8782\tAves\r\n", + "UBERON:0012260\talular digit\tRO:0002254\thas developmental contribution from\tUBERON:0005692\tmanual digit 2 mesenchyme\r\n", + "UBERON:0012260\talular digit\tRO:0002254\thas developmental contribution from\tUBERON:0010564\tmanual digit 1 mesenchyme\r\n", + "UBERON:0012260\talular digit\trdfs:subClassOf\tNone\tUBERON:0002389\tmanual digit\r\n", + "UBERON:0012261\tmanual major digit (Aves)\tBFO:0000050\tpart of\tUBERON:5012261\tmanual major digit (Aves) plus metapodial segment\r\n", + "UBERON:0012261\tmanual major digit (Aves)\tRO:0002160\tonly in taxon\tNCBITaxon:8782\tAves\r\n", + "UBERON:0012261\tmanual major digit (Aves)\tRO:0002254\thas developmental contribution from\tUBERON:0005693\tmanual digit 3 mesenchyme\r\n", + "UBERON:0012261\tmanual major digit (Aves)\trdfs:subClassOf\tNone\tUBERON:0002389\tmanual digit\r\n", + "UBERON:0012262\tmanual minor digit (Aves)\tBFO:0000050\tpart of\tUBERON:5012262\tmanual minor digit (Aves) plus metapodial segment\r\n", + "UBERON:0012262\tmanual minor digit (Aves)\tBSPO:0001115\tpostaxialmost part of\tUBERON:0002398\tmanus\r\n", + "UBERON:0012262\tmanual minor digit (Aves)\tRO:0002160\tonly in taxon\tNCBITaxon:8782\tAves\r\n", + "UBERON:0012262\tmanual minor digit (Aves)\tRO:0002254\thas developmental contribution from\tUBERON:0005694\tmanual digit 4 mesenchyme\r\n", + "UBERON:0012262\tmanual minor digit (Aves)\trdfs:subClassOf\tNone\tUBERON:0002389\tmanual digit\r\n", + "UBERON:0019231\tmanual digit 1 or 5\tBFO:0000050\tpart of\tUBERON:0002398\tmanus\r\n", + "UBERON:0019231\tmanual digit 1 or 5\trdfs:subClassOf\tNone\tUBERON:0002389\tmanual digit\r\n", + "UBERON:0019231\tmanual digit 1 or 5\trdfs:subClassOf\tNone\tUBERON:0019221\tdigit 1 or 5\r\n", + "UBERON:0019232\tmanual digit 2, 3 or 4\tBFO:0000050\tpart of\tUBERON:0002398\tmanus\r\n", + "UBERON:0019232\tmanual digit 2, 3 or 4\trdfs:subClassOf\tNone\tUBERON:0002389\tmanual digit\r\n", + "UBERON:0019232\tmanual digit 2, 3 or 4\trdfs:subClassOf\tNone\tUBERON:0019222\tdigit 2, 3 or 4\r\n" ] } ], @@ -270,11 +326,28 @@ "uberon relationships .desc//p=i finger" ] }, + { + "cell_type": "markdown", + "source": [ + "We can write this out to a file and explore it using pandas.\n", + "\n", + "(we use pandas here as this is convenient for Jupyter notebooks but if you were to execute this on the command line you could use any TSV or tabular tool you like)" + ], + "metadata": { + "collapsed": false + }, + "id": "edf4f8d768c91e3f" + }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 7, "id": "7d7574ba", - "metadata": {}, + "metadata": { + "ExecuteTime": { + "end_time": "2024-04-19T19:11:20.714954Z", + "start_time": "2024-04-19T19:11:15.352017Z" + } + }, "outputs": [], "source": [ "uberon relationships .desc//p=i finger -o output/finger-relationships.tsv" @@ -282,9 +355,14 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 8, "id": "cf691c34", - "metadata": {}, + "metadata": { + "ExecuteTime": { + "end_time": "2024-04-19T19:11:20.968690Z", + "start_time": "2024-04-19T19:11:20.715483Z" + } + }, "outputs": [], "source": [ "import pandas as pd" @@ -292,188 +370,21 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 9, "id": "c68535b0", - "metadata": {}, + "metadata": { + "ExecuteTime": { + "end_time": "2024-04-19T19:11:20.993998Z", + "start_time": "2024-04-19T19:11:20.969074Z" + } + }, "outputs": [ { "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
subjectsubject_labelpredicatepredicate_labelobjectobject_label
0UBERON:0001463manual digit 1BFO:0000050part ofUBERON:0002398manus
1UBERON:0001463manual digit 1BFO:0000050part ofUBERON:0012141manual digitopodium region
2UBERON:0001463manual digit 1BFO:0000050part ofUBERON:5001463manual digit 1 plus metapodial segment
3UBERON:0001463manual digit 1BSPO:0001113preaxialmost part ofUBERON:0002398manus
4UBERON:0001463manual digit 1rdfs:subClassOfNoneUBERON:0006048digit 1
.....................
59UBERON:0019231manual digit 1 or 5rdfs:subClassOfNoneUBERON:0002389manual digit
60UBERON:0019231manual digit 1 or 5rdfs:subClassOfNoneUBERON:0019221digit 1 or 5
61UBERON:0019232manual digit 2, 3 or 4BFO:0000050part ofUBERON:0002398manus
62UBERON:0019232manual digit 2, 3 or 4rdfs:subClassOfNoneUBERON:0002389manual digit
63UBERON:0019232manual digit 2, 3 or 4rdfs:subClassOfNoneUBERON:0019222digit 2, 3 or 4
\n", - "

64 rows × 6 columns

\n", - "
" - ], - "text/plain": [ - " subject subject_label predicate \\\n", - "0 UBERON:0001463 manual digit 1 BFO:0000050 \n", - "1 UBERON:0001463 manual digit 1 BFO:0000050 \n", - "2 UBERON:0001463 manual digit 1 BFO:0000050 \n", - "3 UBERON:0001463 manual digit 1 BSPO:0001113 \n", - "4 UBERON:0001463 manual digit 1 rdfs:subClassOf \n", - ".. ... ... ... \n", - "59 UBERON:0019231 manual digit 1 or 5 rdfs:subClassOf \n", - "60 UBERON:0019231 manual digit 1 or 5 rdfs:subClassOf \n", - "61 UBERON:0019232 manual digit 2, 3 or 4 BFO:0000050 \n", - "62 UBERON:0019232 manual digit 2, 3 or 4 rdfs:subClassOf \n", - "63 UBERON:0019232 manual digit 2, 3 or 4 rdfs:subClassOf \n", - "\n", - " predicate_label object \\\n", - "0 part of UBERON:0002398 \n", - "1 part of UBERON:0012141 \n", - "2 part of UBERON:5001463 \n", - "3 preaxialmost part of UBERON:0002398 \n", - "4 None UBERON:0006048 \n", - ".. ... ... \n", - "59 None UBERON:0002389 \n", - "60 None UBERON:0019221 \n", - "61 part of UBERON:0002398 \n", - "62 None UBERON:0002389 \n", - "63 None UBERON:0019222 \n", - "\n", - " object_label \n", - "0 manus \n", - "1 manual digitopodium region \n", - "2 manual digit 1 plus metapodial segment \n", - "3 manus \n", - "4 digit 1 \n", - ".. ... \n", - "59 manual digit \n", - "60 digit 1 or 5 \n", - "61 manus \n", - "62 manual digit \n", - "63 digit 2, 3 or 4 \n", - "\n", - "[64 rows x 6 columns]" - ] + "text/plain": " subject subject_label predicate \\\n0 UBERON:0001463 manual digit 1 BFO:0000050 \n1 UBERON:0001463 manual digit 1 BFO:0000050 \n2 UBERON:0001463 manual digit 1 BFO:0000050 \n3 UBERON:0001463 manual digit 1 BSPO:0001113 \n4 UBERON:0001463 manual digit 1 rdfs:subClassOf \n.. ... ... ... \n59 UBERON:0019231 manual digit 1 or 5 rdfs:subClassOf \n60 UBERON:0019231 manual digit 1 or 5 rdfs:subClassOf \n61 UBERON:0019232 manual digit 2, 3 or 4 BFO:0000050 \n62 UBERON:0019232 manual digit 2, 3 or 4 rdfs:subClassOf \n63 UBERON:0019232 manual digit 2, 3 or 4 rdfs:subClassOf \n\n predicate_label object \\\n0 part of UBERON:0002398 \n1 part of UBERON:0012141 \n2 part of UBERON:5001463 \n3 preaxialmost part of UBERON:0002398 \n4 NaN UBERON:0006048 \n.. ... ... \n59 NaN UBERON:0002389 \n60 NaN UBERON:0019221 \n61 part of UBERON:0002398 \n62 NaN UBERON:0002389 \n63 NaN UBERON:0019222 \n\n object_label \n0 manus \n1 manual digitopodium region \n2 manual digit 1 plus metapodial segment \n3 manus \n4 digit 1 \n.. ... \n59 manual digit \n60 digit 1 or 5 \n61 manus \n62 manual digit \n63 digit 2, 3 or 4 \n\n[64 rows x 6 columns]", + "text/html": "
\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
subjectsubject_labelpredicatepredicate_labelobjectobject_label
0UBERON:0001463manual digit 1BFO:0000050part ofUBERON:0002398manus
1UBERON:0001463manual digit 1BFO:0000050part ofUBERON:0012141manual digitopodium region
2UBERON:0001463manual digit 1BFO:0000050part ofUBERON:5001463manual digit 1 plus metapodial segment
3UBERON:0001463manual digit 1BSPO:0001113preaxialmost part ofUBERON:0002398manus
4UBERON:0001463manual digit 1rdfs:subClassOfNaNUBERON:0006048digit 1
.....................
59UBERON:0019231manual digit 1 or 5rdfs:subClassOfNaNUBERON:0002389manual digit
60UBERON:0019231manual digit 1 or 5rdfs:subClassOfNaNUBERON:0019221digit 1 or 5
61UBERON:0019232manual digit 2, 3 or 4BFO:0000050part ofUBERON:0002398manus
62UBERON:0019232manual digit 2, 3 or 4rdfs:subClassOfNaNUBERON:0002389manual digit
63UBERON:0019232manual digit 2, 3 or 4rdfs:subClassOfNaNUBERON:0019222digit 2, 3 or 4
\n

64 rows × 6 columns

\n
" }, - "execution_count": 10, + "execution_count": 9, "metadata": {}, "output_type": "execute_result" } @@ -488,34 +399,44 @@ "id": "9611f196", "metadata": {}, "source": [ - "## Entailments" + "## Entailments\n", + "\n", + "Next we will look at [Entailed](https://incatools.github.io/ontology-access-kit/glossary.html#term-Entailed) relationships.\n", + "\n", + "You are encouraged to consult the OAK guide and glossary here but the basic idea is that entailed relationships\n", + "encompasses \"walking up\" the relationship graph, following a specified set of [predicates](https://incatools.github.io/ontology-access-kit/glossary.html#term-Predicate).\n", + "\n", + "First we'll look at the is-a ancestors of `finger`. Note the results here should be the same as using the `ancestors` command:" ] }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 10, "id": "38a93c7d", - "metadata": {}, + "metadata": { + "ExecuteTime": { + "end_time": "2024-04-19T19:12:50.442368Z", + "start_time": "2024-04-19T19:12:48.002563Z" + } + }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "subject\tsubject_label\tpredicate\tpredicate_label\tobject\tobject_label\n", - "UBERON:0002389\tmanual digit\trdfs:subClassOf\tNone\tBFO:0000001\tentity\n", - "UBERON:0002389\tmanual digit\trdfs:subClassOf\tNone\tBFO:0000002\tcontinuant\n", - "UBERON:0002389\tmanual digit\trdfs:subClassOf\tNone\tBFO:0000004\tindependent continuant\n", - "UBERON:0002389\tmanual digit\trdfs:subClassOf\tNone\tBFO:0000040\tmaterial entity\n", - "UBERON:0002389\tmanual digit\trdfs:subClassOf\tNone\tCARO:0000000\tanatomical entity\n", - "UBERON:0002389\tmanual digit\trdfs:subClassOf\tNone\tCARO:0030000\tbiological entity\n", - "UBERON:0002389\tmanual digit\trdfs:subClassOf\tNone\tUBERON:0000061\tanatomical structure\n", - "UBERON:0002389\tmanual digit\trdfs:subClassOf\tNone\tUBERON:0000465\tmaterial anatomical entity\n", - "UBERON:0002389\tmanual digit\trdfs:subClassOf\tNone\tUBERON:0000475\torganism subdivision\n", - "UBERON:0002389\tmanual digit\trdfs:subClassOf\tNone\tUBERON:0001062\tanatomical entity\n", - "UBERON:0002389\tmanual digit\trdfs:subClassOf\tNone\tUBERON:0002389\tmanual digit\n", - "UBERON:0002389\tmanual digit\trdfs:subClassOf\tNone\tUBERON:0002544\tdigit\n", - "UBERON:0002389\tmanual digit\trdfs:subClassOf\tNone\tUBERON:0005881\tautopodial extension\n", - "UBERON:0002389\tmanual digit\trdfs:subClassOf\tNone\tUBERON:0010000\tmulticellular anatomical structure\n" + "subject\tsubject_label\tpredicate\tpredicate_label\tobject\tobject_label\r\n", + "UBERON:0002389\tmanual digit\trdfs:subClassOf\tNone\tBFO:0000001\tentity\r\n", + "UBERON:0002389\tmanual digit\trdfs:subClassOf\tNone\tBFO:0000002\tcontinuant\r\n", + "UBERON:0002389\tmanual digit\trdfs:subClassOf\tNone\tBFO:0000004\tindependent continuant\r\n", + "UBERON:0002389\tmanual digit\trdfs:subClassOf\tNone\tBFO:0000040\tmaterial entity\r\n", + "UBERON:0002389\tmanual digit\trdfs:subClassOf\tNone\tUBERON:0000061\tanatomical structure\r\n", + "UBERON:0002389\tmanual digit\trdfs:subClassOf\tNone\tUBERON:0000465\tmaterial anatomical entity\r\n", + "UBERON:0002389\tmanual digit\trdfs:subClassOf\tNone\tUBERON:0000475\torganism subdivision\r\n", + "UBERON:0002389\tmanual digit\trdfs:subClassOf\tNone\tUBERON:0001062\tanatomical entity\r\n", + "UBERON:0002389\tmanual digit\trdfs:subClassOf\tNone\tUBERON:0002389\tmanual digit\r\n", + "UBERON:0002389\tmanual digit\trdfs:subClassOf\tNone\tUBERON:0002544\tdigit\r\n", + "UBERON:0002389\tmanual digit\trdfs:subClassOf\tNone\tUBERON:0005881\tautopodial extension\r\n", + "UBERON:0002389\tmanual digit\trdfs:subClassOf\tNone\tUBERON:0010000\tmulticellular anatomical structure\r\n" ] } ], @@ -523,31 +444,280 @@ "uberon relationships finger --include-entailed -p i" ] }, + { + "cell_type": "markdown", + "source": [ + "Next we'll include a wider range of predicates. We'll also switch our example to be `trigeminal ganglion`" + ], + "metadata": { + "collapsed": false + }, + "id": "a94e156d1089947" + }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 18, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "subject\tsubject_label\tpredicate\tpredicate_label\tobject\tobject_label\r\n", + "UBERON:0001675\ttrigeminal ganglion\tBFO:0000050\tpart of\tBFO:0000001\tentity\r\n", + "UBERON:0001675\ttrigeminal ganglion\tBFO:0000050\tpart of\tBFO:0000002\tcontinuant\r\n", + "UBERON:0001675\ttrigeminal ganglion\tBFO:0000050\tpart of\tBFO:0000004\tindependent continuant\r\n", + "UBERON:0001675\ttrigeminal ganglion\tBFO:0000050\tpart of\tBFO:0000040\tmaterial entity\r\n", + "UBERON:0001675\ttrigeminal ganglion\tBFO:0000050\tpart of\tRO:0002577\tsystem\r\n", + "UBERON:0001675\ttrigeminal ganglion\tBFO:0000050\tpart of\tUBERON:0000033\thead\r\n", + "UBERON:0001675\ttrigeminal ganglion\tBFO:0000050\tpart of\tUBERON:0000061\tanatomical structure\r\n", + "UBERON:0001675\ttrigeminal ganglion\tBFO:0000050\tpart of\tUBERON:0000153\tanterior region of body\r\n", + "UBERON:0001675\ttrigeminal ganglion\tBFO:0000050\tpart of\tUBERON:0000465\tmaterial anatomical entity\r\n", + "UBERON:0001675\ttrigeminal ganglion\tBFO:0000050\tpart of\tUBERON:0000467\tanatomical system\r\n", + "UBERON:0001675\ttrigeminal ganglion\tBFO:0000050\tpart of\tUBERON:0000468\tmulticellular organism\r\n", + "UBERON:0001675\ttrigeminal ganglion\tBFO:0000050\tpart of\tUBERON:0000475\torganism subdivision\r\n", + "UBERON:0001675\ttrigeminal ganglion\tBFO:0000050\tpart of\tUBERON:0001016\tnervous system\r\n", + "UBERON:0001675\ttrigeminal ganglion\tBFO:0000050\tpart of\tUBERON:0001062\tanatomical entity\r\n", + "UBERON:0001675\ttrigeminal ganglion\tBFO:0000050\tpart of\tUBERON:0007811\tcraniocervical region\r\n", + "UBERON:0001675\ttrigeminal ganglion\tBFO:0000050\tpart of\tUBERON:0010000\tmulticellular anatomical structure\r\n", + "UBERON:0001675\ttrigeminal ganglion\tBFO:0000050\tpart of\tUBERON:0011676\tsubdivision of organism along main body axis\r\n", + "UBERON:0001675\ttrigeminal ganglion\tBFO:0000050\tpart of\tUBERON:0013701\tmain body axis\r\n", + "UBERON:0001675\ttrigeminal ganglion\tBFO:0000050\tpart of\tUBERON:0013702\tbody proper\r\n", + "UBERON:0001675\ttrigeminal ganglion\trdfs:subClassOf\tNone\tBFO:0000001\tentity\r\n", + "UBERON:0001675\ttrigeminal ganglion\trdfs:subClassOf\tNone\tBFO:0000002\tcontinuant\r\n", + "UBERON:0001675\ttrigeminal ganglion\trdfs:subClassOf\tNone\tBFO:0000004\tindependent continuant\r\n", + "UBERON:0001675\ttrigeminal ganglion\trdfs:subClassOf\tNone\tBFO:0000040\tmaterial entity\r\n", + "UBERON:0001675\ttrigeminal ganglion\trdfs:subClassOf\tNone\tUBERON:0000045\tganglion\r\n", + "UBERON:0001675\ttrigeminal ganglion\trdfs:subClassOf\tNone\tUBERON:0000061\tanatomical structure\r\n", + "UBERON:0001675\ttrigeminal ganglion\trdfs:subClassOf\tNone\tUBERON:0000465\tmaterial anatomical entity\r\n", + "UBERON:0001675\ttrigeminal ganglion\trdfs:subClassOf\tNone\tUBERON:0001062\tanatomical entity\r\n", + "UBERON:0001675\ttrigeminal ganglion\trdfs:subClassOf\tNone\tUBERON:0001675\ttrigeminal ganglion\r\n", + "UBERON:0001675\ttrigeminal ganglion\trdfs:subClassOf\tNone\tUBERON:0001714\tcranial ganglion\r\n", + "UBERON:0001675\ttrigeminal ganglion\trdfs:subClassOf\tNone\tUBERON:0001800\tsensory ganglion\r\n", + "UBERON:0001675\ttrigeminal ganglion\trdfs:subClassOf\tNone\tUBERON:0004121\tectoderm-derived structure\r\n", + "UBERON:0001675\ttrigeminal ganglion\trdfs:subClassOf\tNone\tUBERON:0010313\tneural crest-derived structure\r\n", + "UBERON:0001675\ttrigeminal ganglion\trdfs:subClassOf\tNone\tUBERON:0010314\tstructure with developmental contribution from neural crest\r\n" + ] + } + ], + "source": [ + "uberon relationships \"trigeminal ganglion\" --include-entailed -p i,p" + ], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2024-04-19T19:26:17.932863Z", + "start_time": "2024-04-19T19:26:15.284612Z" + } + }, + "id": "55d23e285bea8695" + }, + { + "cell_type": "markdown", + "source": [ + "We can see if the query above we get a lot of entailed relationships! Usually we wouldn't show this as a table to a user - instead we might use the `viz` command to show all individual direct relationships for all ancestors." + ], + "metadata": { + "collapsed": false + }, + "id": "788270cee6bad9ca" + }, + { + "cell_type": "code", + "execution_count": 19, + "outputs": [], + "source": [ + "uberon viz -p i,p \"trigeminal ganglion\" -o output/trigeminal-ganglion-graph.png" + ], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2024-04-19T19:27:47.848838Z", + "start_time": "2024-04-19T19:27:41.902477Z" + } + }, + "id": "60354b36cc783e26" + }, + { + "cell_type": "markdown", + "source": [ + "![img](output/trigeminal-ganglion-graph.png)" + ], + "metadata": { + "collapsed": false + }, + "id": "3fdad80da90a38aa" + }, + { + "cell_type": "markdown", + "source": [ + "This is a standard way of communicating a complex bundle of relationships. But is there a way of getting the *non-redundant* informative entailed relationships in a more concise way?" + ], + "metadata": { + "collapsed": false + }, + "id": "30177ec6b27b30c0" + }, + { + "cell_type": "markdown", + "source": [ + "## Non-redundant entailed relationships\n", + "\n", + "Is there a way to get the most relevant information in a more concise way, as a table.\n", + "\n", + "Let's consider the term \"trigeminal ganglion\" again. Let's look at direct relationships" + ], + "metadata": { + "collapsed": false + }, + "id": "914b45da1e52ef8d" + }, + { + "cell_type": "code", + "execution_count": 21, "id": "767d220d", - "metadata": {}, + "metadata": { + "ExecuteTime": { + "end_time": "2024-04-19T22:09:26.325020Z", + "start_time": "2024-04-19T22:09:22.451109Z" + } + }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "RO:0002131 ! overlaps\r\n" + "subject\tsubject_label\tpredicate\tpredicate_label\tobject\tobject_label\r\n", + "UBERON:0001675\ttrigeminal ganglion\trdfs:subClassOf\tNone\tUBERON:0001714\tcranial ganglion\r\n", + "UBERON:0001675\ttrigeminal ganglion\trdfs:subClassOf\tNone\tUBERON:0001800\tsensory ganglion\r\n", + "UBERON:0001675\ttrigeminal ganglion\trdfs:subClassOf\tNone\tUBERON:0010313\tneural crest-derived structure\r\n" ] } ], "source": [ - "uberon info overlaps" + "uberon relationships uberon relationships \"trigeminal ganglion\" -p i,p" ] }, + { + "cell_type": "markdown", + "source": [ + "These are all correct but don't tell us what this ganglion is a part of. Using the `--include-entailed` option above gives **too much** information.\n", + "\n", + "OAK now has a `--non-redundant-entailed` option which effectively \"rolls down\" the entailed relationships for each predicate:" + ], + "metadata": { + "collapsed": false + }, + "id": "cd462f9b9e3f413c" + }, + { + "cell_type": "code", + "execution_count": 22, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "subject\tsubject_label\tpredicate\tpredicate_label\tobject\tobject_label\r\n", + "UBERON:0001675\ttrigeminal ganglion\tBFO:0000050\tpart of\tRO:0002577\tsystem\r\n", + "UBERON:0001675\ttrigeminal ganglion\tBFO:0000050\tpart of\tUBERON:0000033\thead\r\n", + "UBERON:0001675\ttrigeminal ganglion\tBFO:0000050\tpart of\tUBERON:0001016\tnervous system\r\n", + "UBERON:0001675\ttrigeminal ganglion\trdfs:subClassOf\tNone\tUBERON:0001714\tcranial ganglion\r\n", + "UBERON:0001675\ttrigeminal ganglion\trdfs:subClassOf\tNone\tUBERON:0001800\tsensory ganglion\r\n", + "UBERON:0001675\ttrigeminal ganglion\trdfs:subClassOf\tNone\tUBERON:0010313\tneural crest-derived structure\r\n" + ] + } + ], + "source": [ + "uberon relationships uberon relationships --non-redundant-entailed \"trigeminal ganglion\" -p i,p" + ], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2024-04-19T22:09:41.578453Z", + "start_time": "2024-04-19T22:09:38.750423Z" + } + }, + "id": "23cee5fd3df60b5c" + }, + { + "cell_type": "markdown", + "source": [ + "Note that even though 3 part-parents are provided, these are all technically non-redundant, as they are all \"proper\" overlaps (the `system` term is odd, but this is an artefact of RO imports, and in fact uberon doesn't place 'nervous system' under 'system')" + ], + "metadata": { + "collapsed": false + }, + "id": "64031e20457ec269" + }, + { + "cell_type": "markdown", + "source": [ + "We can do this for other relationships too:" + ], + "metadata": { + "collapsed": false + }, + "id": "a550c9cc75bb8043" + }, + { + "cell_type": "code", + "execution_count": 26, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "subject\tsubject_label\tpredicate\tpredicate_label\tobject\tobject_label\r\n", + "UBERON:0001675\ttrigeminal ganglion\tBFO:0000050\tpart of\tRO:0002577\tsystem\r\n", + "UBERON:0001675\ttrigeminal ganglion\tBFO:0000051\thas part\tUBERON:0003714\tneural tissue\r\n", + "UBERON:0001675\ttrigeminal ganglion\tRO:0002131\toverlaps\tRO:0002577\tsystem\r\n", + "UBERON:0001675\ttrigeminal ganglion\tRO:0002131\toverlaps\tUBERON:0003714\tneural tissue\r\n", + "UBERON:0001675\ttrigeminal ganglion\tRO:0002162\tin taxon\tNCBITaxon:7742\tVertebrata \r\n", + "UBERON:0001675\ttrigeminal ganglion\tRO:0002170\tconnected to\tUBERON:0001027\tsensory nerve\r\n", + "UBERON:0001675\ttrigeminal ganglion\tRO:0002170\tconnected to\tUBERON:0001645\ttrigeminal nerve\r\n", + "UBERON:0001675\ttrigeminal ganglion\tRO:0002202\tdevelops from\tUBERON:0006304\tfuture trigeminal ganglion\r\n", + "UBERON:0001675\ttrigeminal ganglion\tRO:0002207\tdirectly develops from\tUBERON:0006304\tfuture trigeminal ganglion\r\n", + "UBERON:0001675\ttrigeminal ganglion\tRO:0002225\tdevelops from part of\tUBERON:0000922\tembryo\r\n", + "UBERON:0001675\ttrigeminal ganglion\tRO:0002254\thas developmental contribution from\tUBERON:0006304\tfuture trigeminal ganglion\r\n", + "UBERON:0001675\ttrigeminal ganglion\tRO:0002258\tdevelopmentally preceded by\tUBERON:0006304\tfuture trigeminal ganglion\r\n", + "UBERON:0001675\ttrigeminal ganglion\tRO:0002328\tfunctionally related to\tGO:0019226\ttransmission of nerve impulse\r\n", + "UBERON:0001675\ttrigeminal ganglion\tRO:0002329\tpart of structure that is capable of\tGO:0050877\tnervous system process\r\n", + "UBERON:0001675\ttrigeminal ganglion\tRO:0002473\tcomposed primarily of\tUBERON:0003714\tneural tissue\r\n", + "UBERON:0001675\ttrigeminal ganglion\tRO:0002494\ttransformation of\tUBERON:0006304\tfuture trigeminal ganglion\r\n", + "UBERON:0001675\ttrigeminal ganglion\tRO:0002495\timmediate transformation of\tUBERON:0006304\tfuture trigeminal ganglion\r\n", + "UBERON:0001675\ttrigeminal ganglion\tRO:0002496\texistence starts during or after\tUBERON:0000110\tneurula stage\r\n", + "UBERON:0001675\ttrigeminal ganglion\tRO:0002496\texistence starts during or after\tUBERON:0000111\torganogenesis stage\r\n", + "UBERON:0001675\ttrigeminal ganglion\tRO:0002497\texistence ends during or before\tUBERON:0000066\tfully formed stage\r\n", + "UBERON:0001675\ttrigeminal ganglion\tRO:0002584\thas part structure that is capable of\tGO:0019226\ttransmission of nerve impulse\r\n", + "UBERON:0001675\ttrigeminal ganglion\trdfs:subClassOf\tNone\tUBERON:0001714\tcranial ganglion\r\n", + "UBERON:0001675\ttrigeminal ganglion\trdfs:subClassOf\tNone\tUBERON:0001800\tsensory ganglion\r\n", + "UBERON:0001675\ttrigeminal ganglion\trdfs:subClassOf\tNone\tUBERON:0010313\tneural crest-derived structure\r\n", + "UBERON:0001675\ttrigeminal ganglion\tuberon/core#extends:fibers_into\tNone\tUBERON:0001027\tsensory nerve\r\n", + "UBERON:0001675\ttrigeminal ganglion\tuberon/core#extends:fibers_into\tNone\tUBERON:0001645\ttrigeminal nerve\r\n" + ] + } + ], + "source": [ + "uberon relationships uberon relationships --non-redundant-entailed \"trigeminal ganglion\" " + ], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2024-04-19T22:14:43.961052Z", + "start_time": "2024-04-19T22:14:40.508242Z" + } + }, + "id": "ffccb89f65f605c3" + }, { "cell_type": "code", "execution_count": null, - "id": "1f51f46a", - "metadata": {}, "outputs": [], - "source": [] + "source": [], + "metadata": { + "collapsed": false + }, + "id": "5dd76e24bdc3fea2" } ], "metadata": { diff --git a/notebooks/Commands/ValidateDefinitions.ipynb b/notebooks/Commands/ValidateDefinitions.ipynb index ee56f95d7..1852030a3 100644 --- a/notebooks/Commands/ValidateDefinitions.ipynb +++ b/notebooks/Commands/ValidateDefinitions.ipynb @@ -19,7 +19,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 16, "id": "c223f678-f82f-4b06-8e19-1a5b7323e571", "metadata": { "ExecuteTime": { @@ -32,64 +32,64 @@ "name": "stdout", "output_type": "stream", "text": [ - "Usage: runoak validate-definitions [OPTIONS] [TERMS]...\r\n", - "\r\n", - " Checks presence and structure of text definitions.\r\n", - "\r\n", - " To run:\r\n", - "\r\n", - " runoak validate-definitions -i db/uberon.db -o results.tsv\r\n", - "\r\n", - " By default this will apply basic text mining of text definitions to check\r\n", - " against machine actionable OBO text definition guideline rules. This can\r\n", - " result in an initial lag - to skip this, and ONLY perform checks for\r\n", - " *presence* of definitions, use --skip-text-annotation:\r\n", - "\r\n", - " Example: -------\r\n", - "\r\n", - " runoak validate-definitions -i db/uberon.db --skip-text-annotation\r\n", - "\r\n", - " Like most OAK commands, this accepts lists of terms or term queries as\r\n", - " arguments. You can pass in a CURIE list to selectively validate individual\r\n", - " classes\r\n", - "\r\n", - " Example: -------\r\n", - "\r\n", - " runoak validate-definitions -i db/cl.db CL:0002053\r\n", - "\r\n", - " Only on CL identifiers:\r\n", - "\r\n", - " runoak validate-definitions -i db/cl.db i^CL:\r\n", - "\r\n", - " Only on neuron hierarchy:\r\n", - "\r\n", - " runoak validate-definitions -i db/cl.db .desc//p=i neuron\r\n", - "\r\n", - " Output format:\r\n", - "\r\n", - " This command emits objects conforming to the OAK validation datamodel. See\r\n", - " https://incatools.github.io/ontology-access-kit/datamodels for more on OAK\r\n", - " datamodels.\r\n", - "\r\n", - " The default serialization of the datamodel is CSV.\r\n", - "\r\n", - " Notes: -----\r\n", - "\r\n", - " This command is largely redundant with the validate command, but is useful\r\n", - " for targeted validation focused solely on definitions\r\n", - "\r\n", - "Options:\r\n", - " --skip-text-annotation / --no-skip-text-annotation\r\n", - " If true, do not parse text annotations\r\n", - " [default: no-skip-text-annotation]\r\n", - " -C, --configuration-file TEXT Path to a configuration file. This is\r\n", - " typically a YAML file, but may be a JSON\r\n", - " file\r\n", - " --adapter-mapping TEXT Multiple prefix=selector pairs, e.g.\r\n", - " --adapter-mapping uberon=db/uberon.db\r\n", - " -O, --output-type TEXT Desired output type\r\n", - " -o, --output FILENAME Output file, e.g. obo file\r\n", - " --help Show this message and exit.\r\n" + "Usage: runoak validate-definitions [OPTIONS] [TERMS]...\n", + "\n", + " Checks presence and structure of text definitions.\n", + "\n", + " To run:\n", + "\n", + " runoak validate-definitions -i db/uberon.db -o results.tsv\n", + "\n", + " By default this will apply basic text mining of text definitions to check\n", + " against machine actionable OBO text definition guideline rules. This can\n", + " result in an initial lag - to skip this, and ONLY perform checks for\n", + " *presence* of definitions, use --skip-text-annotation:\n", + "\n", + " Example: -------\n", + "\n", + " runoak validate-definitions -i db/uberon.db --skip-text-annotation\n", + "\n", + " Like most OAK commands, this accepts lists of terms or term queries as\n", + " arguments. You can pass in a CURIE list to selectively validate individual\n", + " classes\n", + "\n", + " Example: -------\n", + "\n", + " runoak validate-definitions -i db/cl.db CL:0002053\n", + "\n", + " Only on CL identifiers:\n", + "\n", + " runoak validate-definitions -i db/cl.db i^CL:\n", + "\n", + " Only on neuron hierarchy:\n", + "\n", + " runoak validate-definitions -i db/cl.db .desc//p=i neuron\n", + "\n", + " Output format:\n", + "\n", + " This command emits objects conforming to the OAK validation datamodel. See\n", + " https://incatools.github.io/ontology-access-kit/datamodels for more on OAK\n", + " datamodels.\n", + "\n", + " The default serialization of the datamodel is CSV.\n", + "\n", + " Notes: -----\n", + "\n", + " This command is largely redundant with the validate command, but is useful\n", + " for targeted validation focused solely on definitions\n", + "\n", + "Options:\n", + " --skip-text-annotation / --no-skip-text-annotation\n", + " If true, do not parse text annotations\n", + " [default: no-skip-text-annotation]\n", + " -C, --configuration-file TEXT Path to a configuration file. This is\n", + " typically a YAML file, but may be a JSON\n", + " file\n", + " --adapter-mapping TEXT Multiple prefix=selector pairs, e.g.\n", + " --adapter-mapping uberon=db/uberon.db\n", + " -O, --output-type TEXT Desired output type\n", + " -o, --output FILENAME Output file, e.g. obo file\n", + " --help Show this message and exit.\n" ] } ], @@ -111,7 +111,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 17, "id": "c9b86e52-87a7-449c-baac-81981e7ce632", "metadata": { "ExecuteTime": { @@ -121,11 +121,18 @@ }, "outputs": [], "source": [ - "!runoak --stacktrace -i simpleobo:input/validate-defs-test.obo validate-definitions -C input/validate-definition-conf.yaml .desc//p=i \"cellular_component\" -o output/validate-definitions.output.tsv" + "!runoak -i simpleobo:input/validate-defs-test.obo validate-definitions -C input/validate-definition-conf.yaml .desc//p=i \"cellular_component\" -o output/validate-definitions.output.tsv" ] }, { "cell_type": "markdown", + "id": "27c1668fc8d1a8de", + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, "source": [ "The output is a TSV file with a summary of the issues found.\n", "\n", @@ -134,15 +141,11 @@ "\n", "If you were actually using this on the command line you may prefer to use your own TSV processing tools,\n", "or to simply load into google sheets." - ], - "metadata": { - "collapsed": false - }, - "id": "27c1668fc8d1a8de" + ] }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 18, "id": "5fc9b15d-cc81-400a-8660-f92491baa120", "metadata": { "ExecuteTime": { @@ -153,10 +156,665 @@ "outputs": [ { "data": { - "text/plain": " type subject subject_label \\\n0 oaklib.om:DCC#Any GO:0005634 nucleus \n1 oaklib.om:DCC#S3 GO:0043227 membrane-bounded organelle \n2 oaklib.om:DCC#S11 GO:0043227 membrane-bounded organelle \n3 oaklib.om:DCC#Any GO:0110165 cellular anatomical entity \n4 oaklib.om:DCC#S3 GO:0099568 cytoplasmic region \n5 oaklib.om:DCC#S1 GO:0005737 cytoplasm \n6 oaklib.om:DCC#S3 GO:0043229 intracellular organelle \n7 oaklib.om:DCC#S11 GO:0043229 intracellular organelle \n8 oaklib.om:DCC#S11 GO:0043229 intracellular organelle \n9 oaklib.om:DCC#Any GO:0005886 plasma membrane \n10 oaklib.om:DCC#Any GO:0098590 plasma membrane region \n11 oaklib.om:DCC#S3 GO:9999998 fake term for testing pmid type \n12 oaklib.om:DCC#S1 GO:0005773 vacuole \n13 oaklib.om:DCC#S3 GO:9999999 fake term for testing retraction \n14 oaklib.om:DCC#S3 GO:0031975 envelope \n15 oaklib.om:DCC#S3 GO:0005575 cellular_component \n16 oaklib.om:DCC#S11 GO:0031090 organelle membrane \n17 oaklib.om:DCC#Any GO:0034357 photosynthetic membrane \n18 oaklib.om:DCC#S11 GO:0031965 nuclear membrane \n19 oaklib.om:DCC#S11 GO:0005938 cell cortex \n20 oaklib.om:DCC#S11 GO:0005938 cell cortex \n21 oaklib.om:DCC#S0 GO:0012505 endomembrane system \n22 oaklib.om:DCC#S7 GO:0009579 thylakoid \n23 oaklib.om:DCC#S3 GO:0031967 organelle envelope \n24 oaklib.om:DCC#S3 GO:0043226 organelle \n25 oaklib.om:DCC#S3 GO:0071944 cell periphery \n26 oaklib.om:DCC#S3 GO:0043231 intracellular membrane-bounded organelle \n27 oaklib.om:DCC#S11 GO:0043231 intracellular membrane-bounded organelle \n28 oaklib.om:DCC#S11 GO:0043231 intracellular membrane-bounded organelle \n29 oaklib.om:DCC#S3 GO:0016020 membrane \n30 oaklib.om:DCC#S3 GO:0099738 cell cortex region \n31 oaklib.om:DCC#S11 GO:0099738 cell cortex region \n32 oaklib.om:DCC#Any GO:0005635 nuclear envelope \n33 oaklib.om:DCC#S3 GO:0005622 intracellular anatomical structure \n34 oaklib.om:DCC#S20.1 GO:9999998 fake term for testing pmid type \n35 oaklib.om:DCC#S20.2 GO:9999999 fake term for testing retraction \n\n severity instantiates predicate object \\\n0 INFO NaN IAO:0000115 NaN \n1 WARNING NaN IAO:0000115 NaN \n2 NaN NaN IAO:0000115 NaN \n3 INFO NaN IAO:0000115 NaN \n4 WARNING NaN IAO:0000115 NaN \n5 NaN NaN IAO:0000115 NaN \n6 WARNING NaN IAO:0000115 NaN \n7 NaN NaN IAO:0000115 NaN \n8 NaN NaN IAO:0000115 NaN \n9 INFO NaN IAO:0000115 NaN \n10 INFO NaN IAO:0000115 NaN \n11 WARNING NaN IAO:0000115 NaN \n12 NaN NaN IAO:0000115 NaN \n13 WARNING NaN IAO:0000115 NaN \n14 WARNING NaN IAO:0000115 NaN \n15 WARNING NaN IAO:0000115 NaN \n16 NaN NaN IAO:0000115 NaN \n17 INFO NaN IAO:0000115 NaN \n18 NaN NaN IAO:0000115 NaN \n19 NaN NaN IAO:0000115 NaN \n20 NaN NaN IAO:0000115 NaN \n21 ERROR NaN IAO:0000115 NaN \n22 NaN NaN IAO:0000115 NaN \n23 WARNING NaN IAO:0000115 NaN \n24 WARNING NaN IAO:0000115 NaN \n25 WARNING NaN IAO:0000115 NaN \n26 WARNING NaN IAO:0000115 NaN \n27 NaN NaN IAO:0000115 NaN \n28 NaN NaN IAO:0000115 NaN \n29 WARNING NaN IAO:0000115 NaN \n30 NaN NaN IAO:0000115 NaN \n31 NaN NaN IAO:0000115 NaN \n32 INFO NaN IAO:0000115 NaN \n33 WARNING NaN IAO:0000115 NaN \n34 ERROR NaN IAO:0000115 PMID:9999999999999 \n35 ERROR NaN IAO:0000115 PMID:19717156 \n\n object_str source \\\n0 A membrane-bounded organelle of eukaryotic cel... NaN \n1 Organized structure of distinctive morphology ... NaN \n2 NaN NaN \n3 A part of a cellular organism that is either a... NaN \n4 Any (proper) part of the cytoplasm of a single... NaN \n5 NaN NaN \n6 Organized structure of distinctive morphology ... NaN \n7 NaN NaN \n8 NaN NaN \n9 The membrane surrounding a cell that separates... NaN \n10 A membrane that is a (regional) part of the pl... NaN \n11 fake definition to test retracted typo in refe... NaN \n12 NaN NaN \n13 fake definition to test retracted reference NaN \n14 A multilayered structure surrounding all or pa... NaN \n15 A location, relative to cellular compartments ... NaN \n16 is one of the two lipid bilayers of an organel... NaN \n17 A membrane enriched in complexes formed of rea... NaN \n18 envelope NaN \n19 region of a cell NaN \n20 lies just beneath the plasma membrane and ofte... NaN \n21 NaN NaN \n22 The structure in a plant cell that is known as... NaN \n23 A double membrane structure enclosing an organ... NaN \n24 Organized structure of distinctive morphology ... NaN \n25 The part of a cell encompassing the cell corte... NaN \n26 Organized structure of distinctive morphology ... NaN \n27 NaN NaN \n28 NaN NaN \n29 A lipid bilayer along with all the proteins an... NaN \n30 complete extent of cell cortex NaN \n31 underlies some some region of the plasma membrane NaN \n32 A double lipid bilayer that is part of the nuc... NaN \n33 A component of a cell contained within (but no... NaN \n34 NaN NaN \n35 NaN NaN \n\n info \n0 No problems with definition \n1 Cannot parse genus and differentia \n2 Logical definition element not found in text: ... \n3 No problems with definition \n4 Cannot parse genus and differentia \n5 Definiendum should not appear at the start \n6 Cannot parse genus and differentia \n7 Logical definition element not found in text: ... \n8 Logical definition element not found in text: ... \n9 No problems with definition \n10 No problems with definition \n11 Cannot parse genus and differentia \n12 Definiendum should not appear at the start \n13 Cannot parse genus and differentia \n14 Cannot parse genus and differentia \n15 Cannot parse genus and differentia \n16 Logical definition element not found in text: ... \n17 No problems with definition \n18 Logical definition element not found in text: ... \n19 Logical definition element not found in text: ... \n20 Logical definition element not found in text: ... \n21 Missing text definition \n22 Circular, thylakoid (GO:0009579 in definition \n23 Cannot parse genus and differentia \n24 Cannot parse genus and differentia \n25 Cannot parse genus and differentia \n26 Cannot parse genus and differentia \n27 Logical definition element not found in text: ... \n28 Logical definition element not found in text: ... \n29 Cannot parse genus and differentia \n30 Did not match whole text: cell cortex < comple... \n31 Wrong position, 'cell cortex' not in 'underlie... \n32 No problems with definition \n33 Cannot parse genus and differentia \n34 publication not found: PMID:9999999999999 \n35 publication is retracted: A role for plasma tr... ", - "text/html": "
\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
typesubjectsubject_labelseverityinstantiatespredicateobjectobject_strsourceinfo
0oaklib.om:DCC#AnyGO:0005634nucleusINFONaNIAO:0000115NaNA membrane-bounded organelle of eukaryotic cel...NaNNo problems with definition
1oaklib.om:DCC#S3GO:0043227membrane-bounded organelleWARNINGNaNIAO:0000115NaNOrganized structure of distinctive morphology ...NaNCannot parse genus and differentia
2oaklib.om:DCC#S11GO:0043227membrane-bounded organelleNaNNaNIAO:0000115NaNNaNNaNLogical definition element not found in text: ...
3oaklib.om:DCC#AnyGO:0110165cellular anatomical entityINFONaNIAO:0000115NaNA part of a cellular organism that is either a...NaNNo problems with definition
4oaklib.om:DCC#S3GO:0099568cytoplasmic regionWARNINGNaNIAO:0000115NaNAny (proper) part of the cytoplasm of a single...NaNCannot parse genus and differentia
5oaklib.om:DCC#S1GO:0005737cytoplasmNaNNaNIAO:0000115NaNNaNNaNDefiniendum should not appear at the start
6oaklib.om:DCC#S3GO:0043229intracellular organelleWARNINGNaNIAO:0000115NaNOrganized structure of distinctive morphology ...NaNCannot parse genus and differentia
7oaklib.om:DCC#S11GO:0043229intracellular organelleNaNNaNIAO:0000115NaNNaNNaNLogical definition element not found in text: ...
8oaklib.om:DCC#S11GO:0043229intracellular organelleNaNNaNIAO:0000115NaNNaNNaNLogical definition element not found in text: ...
9oaklib.om:DCC#AnyGO:0005886plasma membraneINFONaNIAO:0000115NaNThe membrane surrounding a cell that separates...NaNNo problems with definition
10oaklib.om:DCC#AnyGO:0098590plasma membrane regionINFONaNIAO:0000115NaNA membrane that is a (regional) part of the pl...NaNNo problems with definition
11oaklib.om:DCC#S3GO:9999998fake term for testing pmid typeWARNINGNaNIAO:0000115NaNfake definition to test retracted typo in refe...NaNCannot parse genus and differentia
12oaklib.om:DCC#S1GO:0005773vacuoleNaNNaNIAO:0000115NaNNaNNaNDefiniendum should not appear at the start
13oaklib.om:DCC#S3GO:9999999fake term for testing retractionWARNINGNaNIAO:0000115NaNfake definition to test retracted referenceNaNCannot parse genus and differentia
14oaklib.om:DCC#S3GO:0031975envelopeWARNINGNaNIAO:0000115NaNA multilayered structure surrounding all or pa...NaNCannot parse genus and differentia
15oaklib.om:DCC#S3GO:0005575cellular_componentWARNINGNaNIAO:0000115NaNA location, relative to cellular compartments ...NaNCannot parse genus and differentia
16oaklib.om:DCC#S11GO:0031090organelle membraneNaNNaNIAO:0000115NaNis one of the two lipid bilayers of an organel...NaNLogical definition element not found in text: ...
17oaklib.om:DCC#AnyGO:0034357photosynthetic membraneINFONaNIAO:0000115NaNA membrane enriched in complexes formed of rea...NaNNo problems with definition
18oaklib.om:DCC#S11GO:0031965nuclear membraneNaNNaNIAO:0000115NaNenvelopeNaNLogical definition element not found in text: ...
19oaklib.om:DCC#S11GO:0005938cell cortexNaNNaNIAO:0000115NaNregion of a cellNaNLogical definition element not found in text: ...
20oaklib.om:DCC#S11GO:0005938cell cortexNaNNaNIAO:0000115NaNlies just beneath the plasma membrane and ofte...NaNLogical definition element not found in text: ...
21oaklib.om:DCC#S0GO:0012505endomembrane systemERRORNaNIAO:0000115NaNNaNNaNMissing text definition
22oaklib.om:DCC#S7GO:0009579thylakoidNaNNaNIAO:0000115NaNThe structure in a plant cell that is known as...NaNCircular, thylakoid (GO:0009579 in definition
23oaklib.om:DCC#S3GO:0031967organelle envelopeWARNINGNaNIAO:0000115NaNA double membrane structure enclosing an organ...NaNCannot parse genus and differentia
24oaklib.om:DCC#S3GO:0043226organelleWARNINGNaNIAO:0000115NaNOrganized structure of distinctive morphology ...NaNCannot parse genus and differentia
25oaklib.om:DCC#S3GO:0071944cell peripheryWARNINGNaNIAO:0000115NaNThe part of a cell encompassing the cell corte...NaNCannot parse genus and differentia
26oaklib.om:DCC#S3GO:0043231intracellular membrane-bounded organelleWARNINGNaNIAO:0000115NaNOrganized structure of distinctive morphology ...NaNCannot parse genus and differentia
27oaklib.om:DCC#S11GO:0043231intracellular membrane-bounded organelleNaNNaNIAO:0000115NaNNaNNaNLogical definition element not found in text: ...
28oaklib.om:DCC#S11GO:0043231intracellular membrane-bounded organelleNaNNaNIAO:0000115NaNNaNNaNLogical definition element not found in text: ...
29oaklib.om:DCC#S3GO:0016020membraneWARNINGNaNIAO:0000115NaNA lipid bilayer along with all the proteins an...NaNCannot parse genus and differentia
30oaklib.om:DCC#S3GO:0099738cell cortex regionNaNNaNIAO:0000115NaNcomplete extent of cell cortexNaNDid not match whole text: cell cortex < comple...
31oaklib.om:DCC#S11GO:0099738cell cortex regionNaNNaNIAO:0000115NaNunderlies some some region of the plasma membraneNaNWrong position, 'cell cortex' not in 'underlie...
32oaklib.om:DCC#AnyGO:0005635nuclear envelopeINFONaNIAO:0000115NaNA double lipid bilayer that is part of the nuc...NaNNo problems with definition
33oaklib.om:DCC#S3GO:0005622intracellular anatomical structureWARNINGNaNIAO:0000115NaNA component of a cell contained within (but no...NaNCannot parse genus and differentia
34oaklib.om:DCC#S20.1GO:9999998fake term for testing pmid typeERRORNaNIAO:0000115PMID:9999999999999NaNNaNpublication not found: PMID:9999999999999
35oaklib.om:DCC#S20.2GO:9999999fake term for testing retractionERRORNaNIAO:0000115PMID:19717156NaNNaNpublication is retracted: A role for plasma tr...
\n
" + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
typesubjectsubject_labelseverityinstantiatespredicateobjectobject_strsourceinfo
0oaklib.om:DCC#S3GO:0043231intracellular membrane-bounded organelleWARNINGNaNIAO:0000115NaNOrganized structure of distinctive morphology ...NaNCannot parse genus and differentia
1oaklib.om:DCC#S11GO:0043231intracellular membrane-bounded organelleNaNNaNIAO:0000115NaNNaNNaNLogical definition element not found in text: ...
2oaklib.om:DCC#S11GO:0043231intracellular membrane-bounded organelleNaNNaNIAO:0000115NaNNaNNaNLogical definition element not found in text: ...
3oaklib.om:DCC#S3GO:0099568cytoplasmic regionWARNINGNaNIAO:0000115NaNAny (proper) part of the cytoplasm of a single...NaNCannot parse genus and differentia
4oaklib.om:DCC#S3GO:0099738cell cortex regionNaNNaNIAO:0000115NaNcomplete extent of cell cortexNaNDid not match whole text: cell cortex < comple...
5oaklib.om:DCC#S11GO:0099738cell cortex regionNaNNaNIAO:0000115NaNunderlies some some region of the plasma membraneNaNWrong position, 'cell cortex' not in 'underlie...
6oaklib.om:DCC#S3GO:0071944cell peripheryWARNINGNaNIAO:0000115NaNThe part of a cell encompassing the cell corte...NaNCannot parse genus and differentia
7oaklib.om:DCC#S11GO:0031090organelle membraneNaNNaNIAO:0000115NaNis one of the two lipid bilayers of an organel...NaNLogical definition element not found in text: ...
8oaklib.om:DCC#S3GO:0043229intracellular organelleWARNINGNaNIAO:0000115NaNOrganized structure of distinctive morphology ...NaNCannot parse genus and differentia
9oaklib.om:DCC#S11GO:0043229intracellular organelleNaNNaNIAO:0000115NaNNaNNaNLogical definition element not found in text: ...
10oaklib.om:DCC#S11GO:0043229intracellular organelleNaNNaNIAO:0000115NaNNaNNaNLogical definition element not found in text: ...
11oaklib.om:DCC#S3GO:0031967organelle envelopeWARNINGNaNIAO:0000115NaNA double membrane structure enclosing an organ...NaNCannot parse genus and differentia
12oaklib.om:DCC#S3GO:0031975envelopeWARNINGNaNIAO:0000115NaNA multilayered structure surrounding all or pa...NaNCannot parse genus and differentia
13oaklib.om:DCC#AnyGO:0098590plasma membrane regionINFONaNIAO:0000115NaNA membrane that is a (regional) part of the pl...NaNNo problems with definition
14oaklib.om:DCC#S0GO:0012505endomembrane systemERRORNaNIAO:0000115NaNNaNNaNMissing text definition
15oaklib.om:DCC#S3GO:0005622intracellular anatomical structureWARNINGNaNIAO:0000115NaNA component of a cell contained within (but no...NaNCannot parse genus and differentia
16oaklib.om:DCC#S3GO:9999998fake term for testing pmid typeWARNINGNaNIAO:0000115NaNfake definition to test retracted typo in refe...NaNCannot parse genus and differentia
17oaklib.om:DCC#S3GO:0043227membrane-bounded organelleWARNINGNaNIAO:0000115NaNOrganized structure of distinctive morphology ...NaNCannot parse genus and differentia
18oaklib.om:DCC#S11GO:0043227membrane-bounded organelleNaNNaNIAO:0000115NaNNaNNaNLogical definition element not found in text: ...
19oaklib.om:DCC#S11GO:0005938cell cortexNaNNaNIAO:0000115NaNregion of a cellNaNLogical definition element not found in text: ...
20oaklib.om:DCC#S11GO:0005938cell cortexNaNNaNIAO:0000115NaNlies just beneath the plasma membrane and ofte...NaNLogical definition element not found in text: ...
21oaklib.om:DCC#S7GO:0009579thylakoidNaNNaNIAO:0000115NaNThe structure in a plant cell that is known as...NaNCircular, thylakoid (GO:0009579 in definition
22oaklib.om:DCC#S3GO:9999999fake term for testing retractionWARNINGNaNIAO:0000115NaNfake definition to test retracted referenceNaNCannot parse genus and differentia
23oaklib.om:DCC#S3GO:0005575cellular_componentWARNINGNaNIAO:0000115NaNA location, relative to cellular compartments ...NaNCannot parse genus and differentia
24oaklib.om:DCC#AnyGO:0005634nucleusINFONaNIAO:0000115NaNA membrane-bounded organelle of eukaryotic cel...NaNNo problems with definition
25oaklib.om:DCC#S3GO:0016020membraneWARNINGNaNIAO:0000115NaNA lipid bilayer along with all the proteins an...NaNCannot parse genus and differentia
26oaklib.om:DCC#AnyGO:0110165cellular anatomical entityINFONaNIAO:0000115NaNA part of a cellular organism that is either a...NaNNo problems with definition
27oaklib.om:DCC#AnyGO:0005635nuclear envelopeINFONaNIAO:0000115NaNA double lipid bilayer that is part of the nuc...NaNNo problems with definition
28oaklib.om:DCC#AnyGO:0005886plasma membraneINFONaNIAO:0000115NaNThe membrane surrounding a cell that separates...NaNNo problems with definition
29oaklib.om:DCC#S1GO:0005773vacuoleNaNNaNIAO:0000115NaNNaNNaNDefiniendum should not appear at the start
30oaklib.om:DCC#S11GO:0031965nuclear membraneNaNNaNIAO:0000115NaNenvelopeNaNLogical definition element not found in text: ...
31oaklib.om:DCC#S1GO:0005737cytoplasmNaNNaNIAO:0000115NaNNaNNaNDefiniendum should not appear at the start
32oaklib.om:DCC#AnyGO:0034357photosynthetic membraneINFONaNIAO:0000115NaNA membrane enriched in complexes formed of rea...NaNNo problems with definition
33oaklib.om:DCC#S3GO:0043226organelleWARNINGNaNIAO:0000115NaNOrganized structure of distinctive morphology ...NaNCannot parse genus and differentia
34oaklib.om:DCC#S20.1GO:9999998fake term for testing pmid typeERRORNaNIAO:0000115PMID:9999999999999fake definition to test retracted typo in refe...NaNpublication not found: PMID:9999999999999
35oaklib.om:DCC#S20.2GO:9999999fake term for testing retractionERRORNaNIAO:0000115PMID:19717156NaNNaNpublication is retracted: A role for plasma tr...
\n", + "
" + ], + "text/plain": [ + " type subject subject_label \\\n", + "0 oaklib.om:DCC#S3 GO:0043231 intracellular membrane-bounded organelle \n", + "1 oaklib.om:DCC#S11 GO:0043231 intracellular membrane-bounded organelle \n", + "2 oaklib.om:DCC#S11 GO:0043231 intracellular membrane-bounded organelle \n", + "3 oaklib.om:DCC#S3 GO:0099568 cytoplasmic region \n", + "4 oaklib.om:DCC#S3 GO:0099738 cell cortex region \n", + "5 oaklib.om:DCC#S11 GO:0099738 cell cortex region \n", + "6 oaklib.om:DCC#S3 GO:0071944 cell periphery \n", + "7 oaklib.om:DCC#S11 GO:0031090 organelle membrane \n", + "8 oaklib.om:DCC#S3 GO:0043229 intracellular organelle \n", + "9 oaklib.om:DCC#S11 GO:0043229 intracellular organelle \n", + "10 oaklib.om:DCC#S11 GO:0043229 intracellular organelle \n", + "11 oaklib.om:DCC#S3 GO:0031967 organelle envelope \n", + "12 oaklib.om:DCC#S3 GO:0031975 envelope \n", + "13 oaklib.om:DCC#Any GO:0098590 plasma membrane region \n", + "14 oaklib.om:DCC#S0 GO:0012505 endomembrane system \n", + "15 oaklib.om:DCC#S3 GO:0005622 intracellular anatomical structure \n", + "16 oaklib.om:DCC#S3 GO:9999998 fake term for testing pmid type \n", + "17 oaklib.om:DCC#S3 GO:0043227 membrane-bounded organelle \n", + "18 oaklib.om:DCC#S11 GO:0043227 membrane-bounded organelle \n", + "19 oaklib.om:DCC#S11 GO:0005938 cell cortex \n", + "20 oaklib.om:DCC#S11 GO:0005938 cell cortex \n", + "21 oaklib.om:DCC#S7 GO:0009579 thylakoid \n", + "22 oaklib.om:DCC#S3 GO:9999999 fake term for testing retraction \n", + "23 oaklib.om:DCC#S3 GO:0005575 cellular_component \n", + "24 oaklib.om:DCC#Any GO:0005634 nucleus \n", + "25 oaklib.om:DCC#S3 GO:0016020 membrane \n", + "26 oaklib.om:DCC#Any GO:0110165 cellular anatomical entity \n", + "27 oaklib.om:DCC#Any GO:0005635 nuclear envelope \n", + "28 oaklib.om:DCC#Any GO:0005886 plasma membrane \n", + "29 oaklib.om:DCC#S1 GO:0005773 vacuole \n", + "30 oaklib.om:DCC#S11 GO:0031965 nuclear membrane \n", + "31 oaklib.om:DCC#S1 GO:0005737 cytoplasm \n", + "32 oaklib.om:DCC#Any GO:0034357 photosynthetic membrane \n", + "33 oaklib.om:DCC#S3 GO:0043226 organelle \n", + "34 oaklib.om:DCC#S20.1 GO:9999998 fake term for testing pmid type \n", + "35 oaklib.om:DCC#S20.2 GO:9999999 fake term for testing retraction \n", + "\n", + " severity instantiates predicate object \\\n", + "0 WARNING NaN IAO:0000115 NaN \n", + "1 NaN NaN IAO:0000115 NaN \n", + "2 NaN NaN IAO:0000115 NaN \n", + "3 WARNING NaN IAO:0000115 NaN \n", + "4 NaN NaN IAO:0000115 NaN \n", + "5 NaN NaN IAO:0000115 NaN \n", + "6 WARNING NaN IAO:0000115 NaN \n", + "7 NaN NaN IAO:0000115 NaN \n", + "8 WARNING NaN IAO:0000115 NaN \n", + "9 NaN NaN IAO:0000115 NaN \n", + "10 NaN NaN IAO:0000115 NaN \n", + "11 WARNING NaN IAO:0000115 NaN \n", + "12 WARNING NaN IAO:0000115 NaN \n", + "13 INFO NaN IAO:0000115 NaN \n", + "14 ERROR NaN IAO:0000115 NaN \n", + "15 WARNING NaN IAO:0000115 NaN \n", + "16 WARNING NaN IAO:0000115 NaN \n", + "17 WARNING NaN IAO:0000115 NaN \n", + "18 NaN NaN IAO:0000115 NaN \n", + "19 NaN NaN IAO:0000115 NaN \n", + "20 NaN NaN IAO:0000115 NaN \n", + "21 NaN NaN IAO:0000115 NaN \n", + "22 WARNING NaN IAO:0000115 NaN \n", + "23 WARNING NaN IAO:0000115 NaN \n", + "24 INFO NaN IAO:0000115 NaN \n", + "25 WARNING NaN IAO:0000115 NaN \n", + "26 INFO NaN IAO:0000115 NaN \n", + "27 INFO NaN IAO:0000115 NaN \n", + "28 INFO NaN IAO:0000115 NaN \n", + "29 NaN NaN IAO:0000115 NaN \n", + "30 NaN NaN IAO:0000115 NaN \n", + "31 NaN NaN IAO:0000115 NaN \n", + "32 INFO NaN IAO:0000115 NaN \n", + "33 WARNING NaN IAO:0000115 NaN \n", + "34 ERROR NaN IAO:0000115 PMID:9999999999999 \n", + "35 ERROR NaN IAO:0000115 PMID:19717156 \n", + "\n", + " object_str source \\\n", + "0 Organized structure of distinctive morphology ... NaN \n", + "1 NaN NaN \n", + "2 NaN NaN \n", + "3 Any (proper) part of the cytoplasm of a single... NaN \n", + "4 complete extent of cell cortex NaN \n", + "5 underlies some some region of the plasma membrane NaN \n", + "6 The part of a cell encompassing the cell corte... NaN \n", + "7 is one of the two lipid bilayers of an organel... NaN \n", + "8 Organized structure of distinctive morphology ... NaN \n", + "9 NaN NaN \n", + "10 NaN NaN \n", + "11 A double membrane structure enclosing an organ... NaN \n", + "12 A multilayered structure surrounding all or pa... NaN \n", + "13 A membrane that is a (regional) part of the pl... NaN \n", + "14 NaN NaN \n", + "15 A component of a cell contained within (but no... NaN \n", + "16 fake definition to test retracted typo in refe... NaN \n", + "17 Organized structure of distinctive morphology ... NaN \n", + "18 NaN NaN \n", + "19 region of a cell NaN \n", + "20 lies just beneath the plasma membrane and ofte... NaN \n", + "21 The structure in a plant cell that is known as... NaN \n", + "22 fake definition to test retracted reference NaN \n", + "23 A location, relative to cellular compartments ... NaN \n", + "24 A membrane-bounded organelle of eukaryotic cel... NaN \n", + "25 A lipid bilayer along with all the proteins an... NaN \n", + "26 A part of a cellular organism that is either a... NaN \n", + "27 A double lipid bilayer that is part of the nuc... NaN \n", + "28 The membrane surrounding a cell that separates... NaN \n", + "29 NaN NaN \n", + "30 envelope NaN \n", + "31 NaN NaN \n", + "32 A membrane enriched in complexes formed of rea... NaN \n", + "33 Organized structure of distinctive morphology ... NaN \n", + "34 fake definition to test retracted typo in refe... NaN \n", + "35 NaN NaN \n", + "\n", + " info \n", + "0 Cannot parse genus and differentia \n", + "1 Logical definition element not found in text: ... \n", + "2 Logical definition element not found in text: ... \n", + "3 Cannot parse genus and differentia \n", + "4 Did not match whole text: cell cortex < comple... \n", + "5 Wrong position, 'cell cortex' not in 'underlie... \n", + "6 Cannot parse genus and differentia \n", + "7 Logical definition element not found in text: ... \n", + "8 Cannot parse genus and differentia \n", + "9 Logical definition element not found in text: ... \n", + "10 Logical definition element not found in text: ... \n", + "11 Cannot parse genus and differentia \n", + "12 Cannot parse genus and differentia \n", + "13 No problems with definition \n", + "14 Missing text definition \n", + "15 Cannot parse genus and differentia \n", + "16 Cannot parse genus and differentia \n", + "17 Cannot parse genus and differentia \n", + "18 Logical definition element not found in text: ... \n", + "19 Logical definition element not found in text: ... \n", + "20 Logical definition element not found in text: ... \n", + "21 Circular, thylakoid (GO:0009579 in definition \n", + "22 Cannot parse genus and differentia \n", + "23 Cannot parse genus and differentia \n", + "24 No problems with definition \n", + "25 Cannot parse genus and differentia \n", + "26 No problems with definition \n", + "27 No problems with definition \n", + "28 No problems with definition \n", + "29 Definiendum should not appear at the start \n", + "30 Logical definition element not found in text: ... \n", + "31 Definiendum should not appear at the start \n", + "32 No problems with definition \n", + "33 Cannot parse genus and differentia \n", + "34 publication not found: PMID:9999999999999 \n", + "35 publication is retracted: A role for plasma tr... " + ] }, - "execution_count": 3, + "execution_count": 18, "metadata": {}, "output_type": "execute_result" } @@ -181,7 +839,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 19, "id": "421c556c-df3e-4281-914b-613e3d467036", "metadata": { "ExecuteTime": { @@ -192,9 +850,13 @@ "outputs": [ { "data": { - "text/plain": "array(['oaklib.om:DCC#Any', 'oaklib.om:DCC#S3', 'oaklib.om:DCC#S11',\n 'oaklib.om:DCC#S1', 'oaklib.om:DCC#S0', 'oaklib.om:DCC#S7',\n 'oaklib.om:DCC#S20.1', 'oaklib.om:DCC#S20.2'], dtype=object)" + "text/plain": [ + "array(['oaklib.om:DCC#S3', 'oaklib.om:DCC#S11', 'oaklib.om:DCC#Any',\n", + " 'oaklib.om:DCC#S0', 'oaklib.om:DCC#S7', 'oaklib.om:DCC#S1',\n", + " 'oaklib.om:DCC#S20.1', 'oaklib.om:DCC#S20.2'], dtype=object)" + ] }, - "execution_count": 4, + "execution_count": 19, "metadata": {}, "output_type": "execute_result" } @@ -205,7 +867,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 20, "id": "aea2cfe0-70bf-4b76-89e2-2bfdbdd3a084", "metadata": { "ExecuteTime": { @@ -216,10 +878,87 @@ "outputs": [ { "data": { - "text/plain": " type counts\n0 oaklib.om:DCC#Any 6\n1 oaklib.om:DCC#S0 1\n2 oaklib.om:DCC#S1 2\n3 oaklib.om:DCC#S11 10\n4 oaklib.om:DCC#S20.1 1\n5 oaklib.om:DCC#S20.2 1\n6 oaklib.om:DCC#S3 14\n7 oaklib.om:DCC#S7 1", - "text/html": "
\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
typecounts
0oaklib.om:DCC#Any6
1oaklib.om:DCC#S01
2oaklib.om:DCC#S12
3oaklib.om:DCC#S1110
4oaklib.om:DCC#S20.11
5oaklib.om:DCC#S20.21
6oaklib.om:DCC#S314
7oaklib.om:DCC#S71
\n
" + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
typecounts
0oaklib.om:DCC#Any6
1oaklib.om:DCC#S01
2oaklib.om:DCC#S12
3oaklib.om:DCC#S1110
4oaklib.om:DCC#S20.11
5oaklib.om:DCC#S20.21
6oaklib.om:DCC#S314
7oaklib.om:DCC#S71
\n", + "
" + ], + "text/plain": [ + " type counts\n", + "0 oaklib.om:DCC#Any 6\n", + "1 oaklib.om:DCC#S0 1\n", + "2 oaklib.om:DCC#S1 2\n", + "3 oaklib.om:DCC#S11 10\n", + "4 oaklib.om:DCC#S20.1 1\n", + "5 oaklib.om:DCC#S20.2 1\n", + "6 oaklib.om:DCC#S3 14\n", + "7 oaklib.om:DCC#S7 1" + ] }, - "execution_count": 5, + "execution_count": 20, "metadata": {}, "output_type": "execute_result" } @@ -230,24 +969,470 @@ }, { "cell_type": "markdown", - "source": [ - "Next we'll filter out less informative columns" - ], + "id": "f28d70f482239b30", "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, - "id": "f28d70f482239b30" + "source": [ + "Next we'll filter out less informative columns" + ] }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 21, + "id": "c1df05dd32082e69", + "metadata": { + "ExecuteTime": { + "end_time": "2024-04-15T00:50:30.994801Z", + "start_time": "2024-04-15T00:50:30.971926Z" + }, + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, "outputs": [ { "data": { - "text/plain": " type subject subject_label \\\n0 oaklib.om:DCC#Any GO:0005634 nucleus \n1 oaklib.om:DCC#S3 GO:0043227 membrane-bounded organelle \n2 oaklib.om:DCC#S11 GO:0043227 membrane-bounded organelle \n3 oaklib.om:DCC#Any GO:0110165 cellular anatomical entity \n4 oaklib.om:DCC#S3 GO:0099568 cytoplasmic region \n5 oaklib.om:DCC#S1 GO:0005737 cytoplasm \n6 oaklib.om:DCC#S3 GO:0043229 intracellular organelle \n7 oaklib.om:DCC#S11 GO:0043229 intracellular organelle \n8 oaklib.om:DCC#S11 GO:0043229 intracellular organelle \n9 oaklib.om:DCC#Any GO:0005886 plasma membrane \n10 oaklib.om:DCC#Any GO:0098590 plasma membrane region \n11 oaklib.om:DCC#S3 GO:9999998 fake term for testing pmid type \n12 oaklib.om:DCC#S1 GO:0005773 vacuole \n13 oaklib.om:DCC#S3 GO:9999999 fake term for testing retraction \n14 oaklib.om:DCC#S3 GO:0031975 envelope \n15 oaklib.om:DCC#S3 GO:0005575 cellular_component \n16 oaklib.om:DCC#S11 GO:0031090 organelle membrane \n17 oaklib.om:DCC#Any GO:0034357 photosynthetic membrane \n18 oaklib.om:DCC#S11 GO:0031965 nuclear membrane \n19 oaklib.om:DCC#S11 GO:0005938 cell cortex \n20 oaklib.om:DCC#S11 GO:0005938 cell cortex \n21 oaklib.om:DCC#S0 GO:0012505 endomembrane system \n22 oaklib.om:DCC#S7 GO:0009579 thylakoid \n23 oaklib.om:DCC#S3 GO:0031967 organelle envelope \n24 oaklib.om:DCC#S3 GO:0043226 organelle \n25 oaklib.om:DCC#S3 GO:0071944 cell periphery \n26 oaklib.om:DCC#S3 GO:0043231 intracellular membrane-bounded organelle \n27 oaklib.om:DCC#S11 GO:0043231 intracellular membrane-bounded organelle \n28 oaklib.om:DCC#S11 GO:0043231 intracellular membrane-bounded organelle \n29 oaklib.om:DCC#S3 GO:0016020 membrane \n30 oaklib.om:DCC#S3 GO:0099738 cell cortex region \n31 oaklib.om:DCC#S11 GO:0099738 cell cortex region \n32 oaklib.om:DCC#Any GO:0005635 nuclear envelope \n33 oaklib.om:DCC#S3 GO:0005622 intracellular anatomical structure \n34 oaklib.om:DCC#S20.1 GO:9999998 fake term for testing pmid type \n35 oaklib.om:DCC#S20.2 GO:9999999 fake term for testing retraction \n\n object_str \\\n0 A membrane-bounded organelle of eukaryotic cel... \n1 Organized structure of distinctive morphology ... \n2 NaN \n3 A part of a cellular organism that is either a... \n4 Any (proper) part of the cytoplasm of a single... \n5 NaN \n6 Organized structure of distinctive morphology ... \n7 NaN \n8 NaN \n9 The membrane surrounding a cell that separates... \n10 A membrane that is a (regional) part of the pl... \n11 fake definition to test retracted typo in refe... \n12 NaN \n13 fake definition to test retracted reference \n14 A multilayered structure surrounding all or pa... \n15 A location, relative to cellular compartments ... \n16 is one of the two lipid bilayers of an organel... \n17 A membrane enriched in complexes formed of rea... \n18 envelope \n19 region of a cell \n20 lies just beneath the plasma membrane and ofte... \n21 NaN \n22 The structure in a plant cell that is known as... \n23 A double membrane structure enclosing an organ... \n24 Organized structure of distinctive morphology ... \n25 The part of a cell encompassing the cell corte... \n26 Organized structure of distinctive morphology ... \n27 NaN \n28 NaN \n29 A lipid bilayer along with all the proteins an... \n30 complete extent of cell cortex \n31 underlies some some region of the plasma membrane \n32 A double lipid bilayer that is part of the nuc... \n33 A component of a cell contained within (but no... \n34 NaN \n35 NaN \n\n info \n0 No problems with definition \n1 Cannot parse genus and differentia \n2 Logical definition element not found in text: ... \n3 No problems with definition \n4 Cannot parse genus and differentia \n5 Definiendum should not appear at the start \n6 Cannot parse genus and differentia \n7 Logical definition element not found in text: ... \n8 Logical definition element not found in text: ... \n9 No problems with definition \n10 No problems with definition \n11 Cannot parse genus and differentia \n12 Definiendum should not appear at the start \n13 Cannot parse genus and differentia \n14 Cannot parse genus and differentia \n15 Cannot parse genus and differentia \n16 Logical definition element not found in text: ... \n17 No problems with definition \n18 Logical definition element not found in text: ... \n19 Logical definition element not found in text: ... \n20 Logical definition element not found in text: ... \n21 Missing text definition \n22 Circular, thylakoid (GO:0009579 in definition \n23 Cannot parse genus and differentia \n24 Cannot parse genus and differentia \n25 Cannot parse genus and differentia \n26 Cannot parse genus and differentia \n27 Logical definition element not found in text: ... \n28 Logical definition element not found in text: ... \n29 Cannot parse genus and differentia \n30 Did not match whole text: cell cortex < comple... \n31 Wrong position, 'cell cortex' not in 'underlie... \n32 No problems with definition \n33 Cannot parse genus and differentia \n34 publication not found: PMID:9999999999999 \n35 publication is retracted: A role for plasma tr... ", - "text/html": "
\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
typesubjectsubject_labelobject_strinfo
0oaklib.om:DCC#AnyGO:0005634nucleusA membrane-bounded organelle of eukaryotic cel...No problems with definition
1oaklib.om:DCC#S3GO:0043227membrane-bounded organelleOrganized structure of distinctive morphology ...Cannot parse genus and differentia
2oaklib.om:DCC#S11GO:0043227membrane-bounded organelleNaNLogical definition element not found in text: ...
3oaklib.om:DCC#AnyGO:0110165cellular anatomical entityA part of a cellular organism that is either a...No problems with definition
4oaklib.om:DCC#S3GO:0099568cytoplasmic regionAny (proper) part of the cytoplasm of a single...Cannot parse genus and differentia
5oaklib.om:DCC#S1GO:0005737cytoplasmNaNDefiniendum should not appear at the start
6oaklib.om:DCC#S3GO:0043229intracellular organelleOrganized structure of distinctive morphology ...Cannot parse genus and differentia
7oaklib.om:DCC#S11GO:0043229intracellular organelleNaNLogical definition element not found in text: ...
8oaklib.om:DCC#S11GO:0043229intracellular organelleNaNLogical definition element not found in text: ...
9oaklib.om:DCC#AnyGO:0005886plasma membraneThe membrane surrounding a cell that separates...No problems with definition
10oaklib.om:DCC#AnyGO:0098590plasma membrane regionA membrane that is a (regional) part of the pl...No problems with definition
11oaklib.om:DCC#S3GO:9999998fake term for testing pmid typefake definition to test retracted typo in refe...Cannot parse genus and differentia
12oaklib.om:DCC#S1GO:0005773vacuoleNaNDefiniendum should not appear at the start
13oaklib.om:DCC#S3GO:9999999fake term for testing retractionfake definition to test retracted referenceCannot parse genus and differentia
14oaklib.om:DCC#S3GO:0031975envelopeA multilayered structure surrounding all or pa...Cannot parse genus and differentia
15oaklib.om:DCC#S3GO:0005575cellular_componentA location, relative to cellular compartments ...Cannot parse genus and differentia
16oaklib.om:DCC#S11GO:0031090organelle membraneis one of the two lipid bilayers of an organel...Logical definition element not found in text: ...
17oaklib.om:DCC#AnyGO:0034357photosynthetic membraneA membrane enriched in complexes formed of rea...No problems with definition
18oaklib.om:DCC#S11GO:0031965nuclear membraneenvelopeLogical definition element not found in text: ...
19oaklib.om:DCC#S11GO:0005938cell cortexregion of a cellLogical definition element not found in text: ...
20oaklib.om:DCC#S11GO:0005938cell cortexlies just beneath the plasma membrane and ofte...Logical definition element not found in text: ...
21oaklib.om:DCC#S0GO:0012505endomembrane systemNaNMissing text definition
22oaklib.om:DCC#S7GO:0009579thylakoidThe structure in a plant cell that is known as...Circular, thylakoid (GO:0009579 in definition
23oaklib.om:DCC#S3GO:0031967organelle envelopeA double membrane structure enclosing an organ...Cannot parse genus and differentia
24oaklib.om:DCC#S3GO:0043226organelleOrganized structure of distinctive morphology ...Cannot parse genus and differentia
25oaklib.om:DCC#S3GO:0071944cell peripheryThe part of a cell encompassing the cell corte...Cannot parse genus and differentia
26oaklib.om:DCC#S3GO:0043231intracellular membrane-bounded organelleOrganized structure of distinctive morphology ...Cannot parse genus and differentia
27oaklib.om:DCC#S11GO:0043231intracellular membrane-bounded organelleNaNLogical definition element not found in text: ...
28oaklib.om:DCC#S11GO:0043231intracellular membrane-bounded organelleNaNLogical definition element not found in text: ...
29oaklib.om:DCC#S3GO:0016020membraneA lipid bilayer along with all the proteins an...Cannot parse genus and differentia
30oaklib.om:DCC#S3GO:0099738cell cortex regioncomplete extent of cell cortexDid not match whole text: cell cortex < comple...
31oaklib.om:DCC#S11GO:0099738cell cortex regionunderlies some some region of the plasma membraneWrong position, 'cell cortex' not in 'underlie...
32oaklib.om:DCC#AnyGO:0005635nuclear envelopeA double lipid bilayer that is part of the nuc...No problems with definition
33oaklib.om:DCC#S3GO:0005622intracellular anatomical structureA component of a cell contained within (but no...Cannot parse genus and differentia
34oaklib.om:DCC#S20.1GO:9999998fake term for testing pmid typeNaNpublication not found: PMID:9999999999999
35oaklib.om:DCC#S20.2GO:9999999fake term for testing retractionNaNpublication is retracted: A role for plasma tr...
\n
" + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
typesubjectsubject_labelobject_strinfo
0oaklib.om:DCC#S3GO:0043231intracellular membrane-bounded organelleOrganized structure of distinctive morphology ...Cannot parse genus and differentia
1oaklib.om:DCC#S11GO:0043231intracellular membrane-bounded organelleNaNLogical definition element not found in text: ...
2oaklib.om:DCC#S11GO:0043231intracellular membrane-bounded organelleNaNLogical definition element not found in text: ...
3oaklib.om:DCC#S3GO:0099568cytoplasmic regionAny (proper) part of the cytoplasm of a single...Cannot parse genus and differentia
4oaklib.om:DCC#S3GO:0099738cell cortex regioncomplete extent of cell cortexDid not match whole text: cell cortex < comple...
5oaklib.om:DCC#S11GO:0099738cell cortex regionunderlies some some region of the plasma membraneWrong position, 'cell cortex' not in 'underlie...
6oaklib.om:DCC#S3GO:0071944cell peripheryThe part of a cell encompassing the cell corte...Cannot parse genus and differentia
7oaklib.om:DCC#S11GO:0031090organelle membraneis one of the two lipid bilayers of an organel...Logical definition element not found in text: ...
8oaklib.om:DCC#S3GO:0043229intracellular organelleOrganized structure of distinctive morphology ...Cannot parse genus and differentia
9oaklib.om:DCC#S11GO:0043229intracellular organelleNaNLogical definition element not found in text: ...
10oaklib.om:DCC#S11GO:0043229intracellular organelleNaNLogical definition element not found in text: ...
11oaklib.om:DCC#S3GO:0031967organelle envelopeA double membrane structure enclosing an organ...Cannot parse genus and differentia
12oaklib.om:DCC#S3GO:0031975envelopeA multilayered structure surrounding all or pa...Cannot parse genus and differentia
13oaklib.om:DCC#AnyGO:0098590plasma membrane regionA membrane that is a (regional) part of the pl...No problems with definition
14oaklib.om:DCC#S0GO:0012505endomembrane systemNaNMissing text definition
15oaklib.om:DCC#S3GO:0005622intracellular anatomical structureA component of a cell contained within (but no...Cannot parse genus and differentia
16oaklib.om:DCC#S3GO:9999998fake term for testing pmid typefake definition to test retracted typo in refe...Cannot parse genus and differentia
17oaklib.om:DCC#S3GO:0043227membrane-bounded organelleOrganized structure of distinctive morphology ...Cannot parse genus and differentia
18oaklib.om:DCC#S11GO:0043227membrane-bounded organelleNaNLogical definition element not found in text: ...
19oaklib.om:DCC#S11GO:0005938cell cortexregion of a cellLogical definition element not found in text: ...
20oaklib.om:DCC#S11GO:0005938cell cortexlies just beneath the plasma membrane and ofte...Logical definition element not found in text: ...
21oaklib.om:DCC#S7GO:0009579thylakoidThe structure in a plant cell that is known as...Circular, thylakoid (GO:0009579 in definition
22oaklib.om:DCC#S3GO:9999999fake term for testing retractionfake definition to test retracted referenceCannot parse genus and differentia
23oaklib.om:DCC#S3GO:0005575cellular_componentA location, relative to cellular compartments ...Cannot parse genus and differentia
24oaklib.om:DCC#AnyGO:0005634nucleusA membrane-bounded organelle of eukaryotic cel...No problems with definition
25oaklib.om:DCC#S3GO:0016020membraneA lipid bilayer along with all the proteins an...Cannot parse genus and differentia
26oaklib.om:DCC#AnyGO:0110165cellular anatomical entityA part of a cellular organism that is either a...No problems with definition
27oaklib.om:DCC#AnyGO:0005635nuclear envelopeA double lipid bilayer that is part of the nuc...No problems with definition
28oaklib.om:DCC#AnyGO:0005886plasma membraneThe membrane surrounding a cell that separates...No problems with definition
29oaklib.om:DCC#S1GO:0005773vacuoleNaNDefiniendum should not appear at the start
30oaklib.om:DCC#S11GO:0031965nuclear membraneenvelopeLogical definition element not found in text: ...
31oaklib.om:DCC#S1GO:0005737cytoplasmNaNDefiniendum should not appear at the start
32oaklib.om:DCC#AnyGO:0034357photosynthetic membraneA membrane enriched in complexes formed of rea...No problems with definition
33oaklib.om:DCC#S3GO:0043226organelleOrganized structure of distinctive morphology ...Cannot parse genus and differentia
34oaklib.om:DCC#S20.1GO:9999998fake term for testing pmid typefake definition to test retracted typo in refe...publication not found: PMID:9999999999999
35oaklib.om:DCC#S20.2GO:9999999fake term for testing retractionNaNpublication is retracted: A role for plasma tr...
\n", + "
" + ], + "text/plain": [ + " type subject subject_label \\\n", + "0 oaklib.om:DCC#S3 GO:0043231 intracellular membrane-bounded organelle \n", + "1 oaklib.om:DCC#S11 GO:0043231 intracellular membrane-bounded organelle \n", + "2 oaklib.om:DCC#S11 GO:0043231 intracellular membrane-bounded organelle \n", + "3 oaklib.om:DCC#S3 GO:0099568 cytoplasmic region \n", + "4 oaklib.om:DCC#S3 GO:0099738 cell cortex region \n", + "5 oaklib.om:DCC#S11 GO:0099738 cell cortex region \n", + "6 oaklib.om:DCC#S3 GO:0071944 cell periphery \n", + "7 oaklib.om:DCC#S11 GO:0031090 organelle membrane \n", + "8 oaklib.om:DCC#S3 GO:0043229 intracellular organelle \n", + "9 oaklib.om:DCC#S11 GO:0043229 intracellular organelle \n", + "10 oaklib.om:DCC#S11 GO:0043229 intracellular organelle \n", + "11 oaklib.om:DCC#S3 GO:0031967 organelle envelope \n", + "12 oaklib.om:DCC#S3 GO:0031975 envelope \n", + "13 oaklib.om:DCC#Any GO:0098590 plasma membrane region \n", + "14 oaklib.om:DCC#S0 GO:0012505 endomembrane system \n", + "15 oaklib.om:DCC#S3 GO:0005622 intracellular anatomical structure \n", + "16 oaklib.om:DCC#S3 GO:9999998 fake term for testing pmid type \n", + "17 oaklib.om:DCC#S3 GO:0043227 membrane-bounded organelle \n", + "18 oaklib.om:DCC#S11 GO:0043227 membrane-bounded organelle \n", + "19 oaklib.om:DCC#S11 GO:0005938 cell cortex \n", + "20 oaklib.om:DCC#S11 GO:0005938 cell cortex \n", + "21 oaklib.om:DCC#S7 GO:0009579 thylakoid \n", + "22 oaklib.om:DCC#S3 GO:9999999 fake term for testing retraction \n", + "23 oaklib.om:DCC#S3 GO:0005575 cellular_component \n", + "24 oaklib.om:DCC#Any GO:0005634 nucleus \n", + "25 oaklib.om:DCC#S3 GO:0016020 membrane \n", + "26 oaklib.om:DCC#Any GO:0110165 cellular anatomical entity \n", + "27 oaklib.om:DCC#Any GO:0005635 nuclear envelope \n", + "28 oaklib.om:DCC#Any GO:0005886 plasma membrane \n", + "29 oaklib.om:DCC#S1 GO:0005773 vacuole \n", + "30 oaklib.om:DCC#S11 GO:0031965 nuclear membrane \n", + "31 oaklib.om:DCC#S1 GO:0005737 cytoplasm \n", + "32 oaklib.om:DCC#Any GO:0034357 photosynthetic membrane \n", + "33 oaklib.om:DCC#S3 GO:0043226 organelle \n", + "34 oaklib.om:DCC#S20.1 GO:9999998 fake term for testing pmid type \n", + "35 oaklib.om:DCC#S20.2 GO:9999999 fake term for testing retraction \n", + "\n", + " object_str \\\n", + "0 Organized structure of distinctive morphology ... \n", + "1 NaN \n", + "2 NaN \n", + "3 Any (proper) part of the cytoplasm of a single... \n", + "4 complete extent of cell cortex \n", + "5 underlies some some region of the plasma membrane \n", + "6 The part of a cell encompassing the cell corte... \n", + "7 is one of the two lipid bilayers of an organel... \n", + "8 Organized structure of distinctive morphology ... \n", + "9 NaN \n", + "10 NaN \n", + "11 A double membrane structure enclosing an organ... \n", + "12 A multilayered structure surrounding all or pa... \n", + "13 A membrane that is a (regional) part of the pl... \n", + "14 NaN \n", + "15 A component of a cell contained within (but no... \n", + "16 fake definition to test retracted typo in refe... \n", + "17 Organized structure of distinctive morphology ... \n", + "18 NaN \n", + "19 region of a cell \n", + "20 lies just beneath the plasma membrane and ofte... \n", + "21 The structure in a plant cell that is known as... \n", + "22 fake definition to test retracted reference \n", + "23 A location, relative to cellular compartments ... \n", + "24 A membrane-bounded organelle of eukaryotic cel... \n", + "25 A lipid bilayer along with all the proteins an... \n", + "26 A part of a cellular organism that is either a... \n", + "27 A double lipid bilayer that is part of the nuc... \n", + "28 The membrane surrounding a cell that separates... \n", + "29 NaN \n", + "30 envelope \n", + "31 NaN \n", + "32 A membrane enriched in complexes formed of rea... \n", + "33 Organized structure of distinctive morphology ... \n", + "34 fake definition to test retracted typo in refe... \n", + "35 NaN \n", + "\n", + " info \n", + "0 Cannot parse genus and differentia \n", + "1 Logical definition element not found in text: ... \n", + "2 Logical definition element not found in text: ... \n", + "3 Cannot parse genus and differentia \n", + "4 Did not match whole text: cell cortex < comple... \n", + "5 Wrong position, 'cell cortex' not in 'underlie... \n", + "6 Cannot parse genus and differentia \n", + "7 Logical definition element not found in text: ... \n", + "8 Cannot parse genus and differentia \n", + "9 Logical definition element not found in text: ... \n", + "10 Logical definition element not found in text: ... \n", + "11 Cannot parse genus and differentia \n", + "12 Cannot parse genus and differentia \n", + "13 No problems with definition \n", + "14 Missing text definition \n", + "15 Cannot parse genus and differentia \n", + "16 Cannot parse genus and differentia \n", + "17 Cannot parse genus and differentia \n", + "18 Logical definition element not found in text: ... \n", + "19 Logical definition element not found in text: ... \n", + "20 Logical definition element not found in text: ... \n", + "21 Circular, thylakoid (GO:0009579 in definition \n", + "22 Cannot parse genus and differentia \n", + "23 Cannot parse genus and differentia \n", + "24 No problems with definition \n", + "25 Cannot parse genus and differentia \n", + "26 No problems with definition \n", + "27 No problems with definition \n", + "28 No problems with definition \n", + "29 Definiendum should not appear at the start \n", + "30 Logical definition element not found in text: ... \n", + "31 Definiendum should not appear at the start \n", + "32 No problems with definition \n", + "33 Cannot parse genus and differentia \n", + "34 publication not found: PMID:9999999999999 \n", + "35 publication is retracted: A role for plasma tr... " + ] }, - "execution_count": 6, + "execution_count": 21, "metadata": {}, "output_type": "execute_result" } @@ -255,264 +1440,731 @@ "source": [ "df = df[[\"type\", \"subject\", \"subject_label\", \"object_str\", \"info\"]]\n", "df" - ], + ] + }, + { + "cell_type": "markdown", + "id": "8ad6ef24d0daf11f", "metadata": { "collapsed": false, - "ExecuteTime": { - "end_time": "2024-04-15T00:50:30.994801Z", - "start_time": "2024-04-15T00:50:30.971926Z" + "jupyter": { + "outputs_hidden": false } }, - "id": "c1df05dd32082e69" - }, - { - "cell_type": "markdown", "source": [ "## Missing Definitions\n", "\n", "This is the most trivial way to fail a definition check - not to include one. We can see all the missing definitions:\n" - ], - "metadata": { - "collapsed": false - }, - "id": "8ad6ef24d0daf11f" + ] }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 22, + "id": "381e7c7da587668e", + "metadata": { + "ExecuteTime": { + "end_time": "2024-04-15T00:50:31.048081Z", + "start_time": "2024-04-15T00:50:30.979466Z" + }, + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, "outputs": [ { "data": { - "text/plain": " type subject subject_label object_str \\\n21 oaklib.om:DCC#S0 GO:0012505 endomembrane system NaN \n\n info \n21 Missing text definition ", - "text/html": "
\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
typesubjectsubject_labelobject_strinfo
21oaklib.om:DCC#S0GO:0012505endomembrane systemNaNMissing text definition
\n
" + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
typesubjectsubject_labelobject_strinfo
14oaklib.om:DCC#S0GO:0012505endomembrane systemNaNMissing text definition
\n", + "
" + ], + "text/plain": [ + " type subject subject_label object_str \\\n", + "14 oaklib.om:DCC#S0 GO:0012505 endomembrane system NaN \n", + "\n", + " info \n", + "14 Missing text definition " + ] }, - "execution_count": 7, + "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df[df[\"type\"] == \"oaklib.om:DCC#S0\"]\n" - ], + ] + }, + { + "cell_type": "markdown", + "id": "f8844c7876451383", "metadata": { "collapsed": false, - "ExecuteTime": { - "end_time": "2024-04-15T00:50:31.048081Z", - "start_time": "2024-04-15T00:50:30.979466Z" + "jupyter": { + "outputs_hidden": false } }, - "id": "381e7c7da587668e" - }, - { - "cell_type": "markdown", "source": [ "Of course, in the real ontology this term has a definition" - ], - "metadata": { - "collapsed": false - }, - "id": "f8844c7876451383" + ] }, { "cell_type": "markdown", + "id": "c098cdf7a5665add", + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, "source": [ "## Non genus-differentia structure\n", "\n", "The OAK validate definitions command follows [SRS]( https://philpapers.org/archive/SEPGFW.pdf) and assumes good definitions follow genus-differentia structure.\n", "\n", "We can see the ones that fail this (S3):" - ], - "metadata": { - "collapsed": false - }, - "id": "c098cdf7a5665add" + ] }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 23, + "id": "9cf1490c83491596", + "metadata": { + "ExecuteTime": { + "end_time": "2024-04-15T00:50:31.052182Z", + "start_time": "2024-04-15T00:50:30.987744Z" + }, + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, "outputs": [ { "data": { - "text/plain": " type subject subject_label \\\n1 oaklib.om:DCC#S3 GO:0043227 membrane-bounded organelle \n4 oaklib.om:DCC#S3 GO:0099568 cytoplasmic region \n6 oaklib.om:DCC#S3 GO:0043229 intracellular organelle \n11 oaklib.om:DCC#S3 GO:9999998 fake term for testing pmid type \n13 oaklib.om:DCC#S3 GO:9999999 fake term for testing retraction \n14 oaklib.om:DCC#S3 GO:0031975 envelope \n15 oaklib.om:DCC#S3 GO:0005575 cellular_component \n23 oaklib.om:DCC#S3 GO:0031967 organelle envelope \n24 oaklib.om:DCC#S3 GO:0043226 organelle \n25 oaklib.om:DCC#S3 GO:0071944 cell periphery \n26 oaklib.om:DCC#S3 GO:0043231 intracellular membrane-bounded organelle \n29 oaklib.om:DCC#S3 GO:0016020 membrane \n30 oaklib.om:DCC#S3 GO:0099738 cell cortex region \n33 oaklib.om:DCC#S3 GO:0005622 intracellular anatomical structure \n\n object_str \\\n1 Organized structure of distinctive morphology ... \n4 Any (proper) part of the cytoplasm of a single... \n6 Organized structure of distinctive morphology ... \n11 fake definition to test retracted typo in refe... \n13 fake definition to test retracted reference \n14 A multilayered structure surrounding all or pa... \n15 A location, relative to cellular compartments ... \n23 A double membrane structure enclosing an organ... \n24 Organized structure of distinctive morphology ... \n25 The part of a cell encompassing the cell corte... \n26 Organized structure of distinctive morphology ... \n29 A lipid bilayer along with all the proteins an... \n30 complete extent of cell cortex \n33 A component of a cell contained within (but no... \n\n info \n1 Cannot parse genus and differentia \n4 Cannot parse genus and differentia \n6 Cannot parse genus and differentia \n11 Cannot parse genus and differentia \n13 Cannot parse genus and differentia \n14 Cannot parse genus and differentia \n15 Cannot parse genus and differentia \n23 Cannot parse genus and differentia \n24 Cannot parse genus and differentia \n25 Cannot parse genus and differentia \n26 Cannot parse genus and differentia \n29 Cannot parse genus and differentia \n30 Did not match whole text: cell cortex < comple... \n33 Cannot parse genus and differentia ", - "text/html": "
\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
typesubjectsubject_labelobject_strinfo
1oaklib.om:DCC#S3GO:0043227membrane-bounded organelleOrganized structure of distinctive morphology ...Cannot parse genus and differentia
4oaklib.om:DCC#S3GO:0099568cytoplasmic regionAny (proper) part of the cytoplasm of a single...Cannot parse genus and differentia
6oaklib.om:DCC#S3GO:0043229intracellular organelleOrganized structure of distinctive morphology ...Cannot parse genus and differentia
11oaklib.om:DCC#S3GO:9999998fake term for testing pmid typefake definition to test retracted typo in refe...Cannot parse genus and differentia
13oaklib.om:DCC#S3GO:9999999fake term for testing retractionfake definition to test retracted referenceCannot parse genus and differentia
14oaklib.om:DCC#S3GO:0031975envelopeA multilayered structure surrounding all or pa...Cannot parse genus and differentia
15oaklib.om:DCC#S3GO:0005575cellular_componentA location, relative to cellular compartments ...Cannot parse genus and differentia
23oaklib.om:DCC#S3GO:0031967organelle envelopeA double membrane structure enclosing an organ...Cannot parse genus and differentia
24oaklib.om:DCC#S3GO:0043226organelleOrganized structure of distinctive morphology ...Cannot parse genus and differentia
25oaklib.om:DCC#S3GO:0071944cell peripheryThe part of a cell encompassing the cell corte...Cannot parse genus and differentia
26oaklib.om:DCC#S3GO:0043231intracellular membrane-bounded organelleOrganized structure of distinctive morphology ...Cannot parse genus and differentia
29oaklib.om:DCC#S3GO:0016020membraneA lipid bilayer along with all the proteins an...Cannot parse genus and differentia
30oaklib.om:DCC#S3GO:0099738cell cortex regioncomplete extent of cell cortexDid not match whole text: cell cortex < comple...
33oaklib.om:DCC#S3GO:0005622intracellular anatomical structureA component of a cell contained within (but no...Cannot parse genus and differentia
\n
" + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
typesubjectsubject_labelobject_strinfo
0oaklib.om:DCC#S3GO:0043231intracellular membrane-bounded organelleOrganized structure of distinctive morphology ...Cannot parse genus and differentia
3oaklib.om:DCC#S3GO:0099568cytoplasmic regionAny (proper) part of the cytoplasm of a single...Cannot parse genus and differentia
4oaklib.om:DCC#S3GO:0099738cell cortex regioncomplete extent of cell cortexDid not match whole text: cell cortex < comple...
6oaklib.om:DCC#S3GO:0071944cell peripheryThe part of a cell encompassing the cell corte...Cannot parse genus and differentia
8oaklib.om:DCC#S3GO:0043229intracellular organelleOrganized structure of distinctive morphology ...Cannot parse genus and differentia
11oaklib.om:DCC#S3GO:0031967organelle envelopeA double membrane structure enclosing an organ...Cannot parse genus and differentia
12oaklib.om:DCC#S3GO:0031975envelopeA multilayered structure surrounding all or pa...Cannot parse genus and differentia
15oaklib.om:DCC#S3GO:0005622intracellular anatomical structureA component of a cell contained within (but no...Cannot parse genus and differentia
16oaklib.om:DCC#S3GO:9999998fake term for testing pmid typefake definition to test retracted typo in refe...Cannot parse genus and differentia
17oaklib.om:DCC#S3GO:0043227membrane-bounded organelleOrganized structure of distinctive morphology ...Cannot parse genus and differentia
22oaklib.om:DCC#S3GO:9999999fake term for testing retractionfake definition to test retracted referenceCannot parse genus and differentia
23oaklib.om:DCC#S3GO:0005575cellular_componentA location, relative to cellular compartments ...Cannot parse genus and differentia
25oaklib.om:DCC#S3GO:0016020membraneA lipid bilayer along with all the proteins an...Cannot parse genus and differentia
33oaklib.om:DCC#S3GO:0043226organelleOrganized structure of distinctive morphology ...Cannot parse genus and differentia
\n", + "
" + ], + "text/plain": [ + " type subject subject_label \\\n", + "0 oaklib.om:DCC#S3 GO:0043231 intracellular membrane-bounded organelle \n", + "3 oaklib.om:DCC#S3 GO:0099568 cytoplasmic region \n", + "4 oaklib.om:DCC#S3 GO:0099738 cell cortex region \n", + "6 oaklib.om:DCC#S3 GO:0071944 cell periphery \n", + "8 oaklib.om:DCC#S3 GO:0043229 intracellular organelle \n", + "11 oaklib.om:DCC#S3 GO:0031967 organelle envelope \n", + "12 oaklib.om:DCC#S3 GO:0031975 envelope \n", + "15 oaklib.om:DCC#S3 GO:0005622 intracellular anatomical structure \n", + "16 oaklib.om:DCC#S3 GO:9999998 fake term for testing pmid type \n", + "17 oaklib.om:DCC#S3 GO:0043227 membrane-bounded organelle \n", + "22 oaklib.om:DCC#S3 GO:9999999 fake term for testing retraction \n", + "23 oaklib.om:DCC#S3 GO:0005575 cellular_component \n", + "25 oaklib.om:DCC#S3 GO:0016020 membrane \n", + "33 oaklib.om:DCC#S3 GO:0043226 organelle \n", + "\n", + " object_str \\\n", + "0 Organized structure of distinctive morphology ... \n", + "3 Any (proper) part of the cytoplasm of a single... \n", + "4 complete extent of cell cortex \n", + "6 The part of a cell encompassing the cell corte... \n", + "8 Organized structure of distinctive morphology ... \n", + "11 A double membrane structure enclosing an organ... \n", + "12 A multilayered structure surrounding all or pa... \n", + "15 A component of a cell contained within (but no... \n", + "16 fake definition to test retracted typo in refe... \n", + "17 Organized structure of distinctive morphology ... \n", + "22 fake definition to test retracted reference \n", + "23 A location, relative to cellular compartments ... \n", + "25 A lipid bilayer along with all the proteins an... \n", + "33 Organized structure of distinctive morphology ... \n", + "\n", + " info \n", + "0 Cannot parse genus and differentia \n", + "3 Cannot parse genus and differentia \n", + "4 Did not match whole text: cell cortex < comple... \n", + "6 Cannot parse genus and differentia \n", + "8 Cannot parse genus and differentia \n", + "11 Cannot parse genus and differentia \n", + "12 Cannot parse genus and differentia \n", + "15 Cannot parse genus and differentia \n", + "16 Cannot parse genus and differentia \n", + "17 Cannot parse genus and differentia \n", + "22 Cannot parse genus and differentia \n", + "23 Cannot parse genus and differentia \n", + "25 Cannot parse genus and differentia \n", + "33 Cannot parse genus and differentia " + ] }, - "execution_count": 8, + "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df[df[\"type\"] == \"oaklib.om:DCC#S3\"]" - ], + ] + }, + { + "cell_type": "markdown", + "id": "27f9e7b747b071de", "metadata": { "collapsed": false, - "ExecuteTime": { - "end_time": "2024-04-15T00:50:31.052182Z", - "start_time": "2024-04-15T00:50:30.987744Z" + "jupyter": { + "outputs_hidden": false } }, - "id": "9cf1490c83491596" - }, - { - "cell_type": "markdown", "source": [ "Many of these are actual definitions rather than ones manipulated for test purposes.\n", "\n", "There is room for valid disagreement about whether rewriting some of these following genus-differentia form would improve things for either users or annotators. Arguably at least the subtypes of organelle could simply state how they are differentiated from organelles in general rather than repeating the somewhat wordy _\"Organized structure of distinctive morphology...\"_" - ], - "metadata": { - "collapsed": false - }, - "id": "27f9e7b747b071de" + ] }, { "cell_type": "markdown", - "source": [ - "## Circular definitions" - ], + "id": "c56d3a9c531e5a09", "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, - "id": "c56d3a9c531e5a09" + "source": [ + "## Circular definitions" + ] }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 24, + "id": "adcbad5fae63e7fb", + "metadata": { + "ExecuteTime": { + "end_time": "2024-04-15T00:50:31.052559Z", + "start_time": "2024-04-15T00:50:30.994899Z" + }, + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, "outputs": [ { "data": { - "text/plain": " type subject subject_label \\\n22 oaklib.om:DCC#S7 GO:0009579 thylakoid \n\n object_str \\\n22 The structure in a plant cell that is known as... \n\n info \n22 Circular, thylakoid (GO:0009579 in definition ", - "text/html": "
\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
typesubjectsubject_labelobject_strinfo
22oaklib.om:DCC#S7GO:0009579thylakoidThe structure in a plant cell that is known as...Circular, thylakoid (GO:0009579 in definition
\n
" + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
typesubjectsubject_labelobject_strinfo
21oaklib.om:DCC#S7GO:0009579thylakoidThe structure in a plant cell that is known as...Circular, thylakoid (GO:0009579 in definition
\n", + "
" + ], + "text/plain": [ + " type subject subject_label \\\n", + "21 oaklib.om:DCC#S7 GO:0009579 thylakoid \n", + "\n", + " object_str \\\n", + "21 The structure in a plant cell that is known as... \n", + "\n", + " info \n", + "21 Circular, thylakoid (GO:0009579 in definition " + ] }, - "execution_count": 9, + "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df[df[\"type\"] == \"oaklib.om:DCC#S7\"]" - ], + ] + }, + { + "cell_type": "markdown", + "id": "34eb55cf06afa332", "metadata": { "collapsed": false, - "ExecuteTime": { - "end_time": "2024-04-15T00:50:31.052559Z", - "start_time": "2024-04-15T00:50:30.994899Z" + "jupyter": { + "outputs_hidden": false } }, - "id": "adcbad5fae63e7fb" - }, - { - "cell_type": "markdown", "source": [ "## Not following convention" - ], - "metadata": { - "collapsed": false - }, - "id": "34eb55cf06afa332" + ] }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 25, + "id": "cf4d18796842b46", + "metadata": { + "ExecuteTime": { + "end_time": "2024-04-15T00:50:31.062863Z", + "start_time": "2024-04-15T00:50:31.004181Z" + }, + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, "outputs": [ { "data": { - "text/plain": " type subject subject_label object_str \\\n5 oaklib.om:DCC#S1 GO:0005737 cytoplasm NaN \n12 oaklib.om:DCC#S1 GO:0005773 vacuole NaN \n\n info \n5 Definiendum should not appear at the start \n12 Definiendum should not appear at the start ", - "text/html": "
\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
typesubjectsubject_labelobject_strinfo
5oaklib.om:DCC#S1GO:0005737cytoplasmNaNDefiniendum should not appear at the start
12oaklib.om:DCC#S1GO:0005773vacuoleNaNDefiniendum should not appear at the start
\n
" + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
typesubjectsubject_labelobject_strinfo
29oaklib.om:DCC#S1GO:0005773vacuoleNaNDefiniendum should not appear at the start
31oaklib.om:DCC#S1GO:0005737cytoplasmNaNDefiniendum should not appear at the start
\n", + "
" + ], + "text/plain": [ + " type subject subject_label object_str \\\n", + "29 oaklib.om:DCC#S1 GO:0005773 vacuole NaN \n", + "31 oaklib.om:DCC#S1 GO:0005737 cytoplasm NaN \n", + "\n", + " info \n", + "29 Definiendum should not appear at the start \n", + "31 Definiendum should not appear at the start " + ] }, - "execution_count": 10, + "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df[df[\"type\"] == \"oaklib.om:DCC#S1\"]" - ], + ] + }, + { + "cell_type": "markdown", + "id": "4c5189bd46804bd8", "metadata": { "collapsed": false, - "ExecuteTime": { - "end_time": "2024-04-15T00:50:31.062863Z", - "start_time": "2024-04-15T00:50:31.004181Z" + "jupyter": { + "outputs_hidden": false } }, - "id": "cf4d18796842b46" - }, - { - "cell_type": "markdown", "source": [ "## Definition Reference Issues\n", "\n", "### Typos in PMIDs\n" - ], - "metadata": { - "collapsed": false - }, - "id": "4c5189bd46804bd8" + ] }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 26, + "id": "35e1f10deba2c6c9", + "metadata": { + "ExecuteTime": { + "end_time": "2024-04-15T00:51:38.780848Z", + "start_time": "2024-04-15T00:51:38.770256Z" + }, + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, "outputs": [ { "data": { - "text/plain": " type subject subject_label \\\n34 oaklib.om:DCC#S20.1 GO:9999998 fake term for testing pmid type \n\n object_str info \n34 NaN publication not found: PMID:9999999999999 ", - "text/html": "
\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
typesubjectsubject_labelobject_strinfo
34oaklib.om:DCC#S20.1GO:9999998fake term for testing pmid typeNaNpublication not found: PMID:9999999999999
\n
" + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
typesubjectsubject_labelobject_strinfo
34oaklib.om:DCC#S20.1GO:9999998fake term for testing pmid typefake definition to test retracted typo in refe...publication not found: PMID:9999999999999
\n", + "
" + ], + "text/plain": [ + " type subject subject_label \\\n", + "34 oaklib.om:DCC#S20.1 GO:9999998 fake term for testing pmid type \n", + "\n", + " object_str \\\n", + "34 fake definition to test retracted typo in refe... \n", + "\n", + " info \n", + "34 publication not found: PMID:9999999999999 " + ] }, - "execution_count": 11, + "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df[df[\"type\"] == \"oaklib.om:DCC#S20.1\"]\n" - ], + ] + }, + { + "cell_type": "markdown", + "id": "7a288d8fc507acc4", "metadata": { "collapsed": false, - "ExecuteTime": { - "end_time": "2024-04-15T00:51:38.780848Z", - "start_time": "2024-04-15T00:51:38.770256Z" + "jupyter": { + "outputs_hidden": false } }, - "id": "35e1f10deba2c6c9" - }, - { - "cell_type": "markdown", "source": [ "### Retracted publications" - ], - "metadata": { - "collapsed": false - }, - "id": "7a288d8fc507acc4" + ] }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 27, + "id": "f5245d99ab0864d5", + "metadata": { + "ExecuteTime": { + "end_time": "2024-04-15T00:52:02.693591Z", + "start_time": "2024-04-15T00:52:02.687692Z" + }, + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, "outputs": [ { "data": { - "text/plain": " type subject subject_label \\\n35 oaklib.om:DCC#S20.2 GO:9999999 fake term for testing retraction \n\n object_str info \n35 NaN publication is retracted: A role for plasma tr... ", - "text/html": "
\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
typesubjectsubject_labelobject_strinfo
35oaklib.om:DCC#S20.2GO:9999999fake term for testing retractionNaNpublication is retracted: A role for plasma tr...
\n
" + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
typesubjectsubject_labelobject_strinfo
35oaklib.om:DCC#S20.2GO:9999999fake term for testing retractionNaNpublication is retracted: A role for plasma tr...
\n", + "
" + ], + "text/plain": [ + " type subject subject_label \\\n", + "35 oaklib.om:DCC#S20.2 GO:9999999 fake term for testing retraction \n", + "\n", + " object_str info \n", + "35 NaN publication is retracted: A role for plasma tr... " + ] }, - "execution_count": 12, + "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df[df[\"type\"] == \"oaklib.om:DCC#S20.2\"]\n" - ], + ] + }, + { + "cell_type": "markdown", + "id": "7e8d97bc6e6c20b0", "metadata": { "collapsed": false, - "ExecuteTime": { - "end_time": "2024-04-15T00:52:02.693591Z", - "start_time": "2024-04-15T00:52:02.687692Z" + "jupyter": { + "outputs_hidden": false } }, - "id": "f5245d99ab0864d5" - }, - { - "cell_type": "markdown", "source": [ "# Using LLMs to validate definitions\n", "\n", @@ -539,48 +2191,61 @@ "\n", " - the publication [PMID:9708911](https://pubmed.ncbi.nlm.nih.gov/9708911/)\n", " - the RHEA reaction [RHEA:27794](https://www.rhea-db.org/reaction?id=27794)" - ], - "metadata": { - "collapsed": false - }, - "id": "7e8d97bc6e6c20b0" + ] }, { "cell_type": "code", - "execution_count": 5, - "outputs": [], - "source": [ - "!runoak --stacktrace -i llm:{claude-3-opus}:simpleobo:input/validate-defs-test.obo validate-definitions -C input/validate-definition-conf.yaml GO:0000010 -O yaml -o output/validate-definitions.llm.yaml" - ], + "execution_count": 13, + "id": "4e29eb9d8ff5df4c", "metadata": { - "collapsed": false, "ExecuteTime": { "end_time": "2024-04-15T01:00:28.475900Z", "start_time": "2024-04-15T01:00:13.437742Z" + }, + "collapsed": false, + "jupyter": { + "outputs_hidden": false } }, - "id": "4e29eb9d8ff5df4c" + "outputs": [], + "source": [ + "!runoak --stacktrace -i llm:{claude-3-opus}:simpleobo:input/validate-defs-test.obo validate-definitions -C input/validate-definition-conf.yaml GO:0000010 -O yaml -o output/validate-definitions.llm.yaml" + ] }, { "cell_type": "code", - "execution_count": 7, - "outputs": [], - "source": [ - "import yaml\n", - "report = yaml.safe_load(open(\"output/validate-definitions.llm.yaml\"))" - ], + "execution_count": 14, + "id": "69f6da5532285cf9", "metadata": { - "collapsed": false, "ExecuteTime": { "end_time": "2024-04-15T01:01:41.771699Z", "start_time": "2024-04-15T01:01:41.744373Z" + }, + "collapsed": false, + "jupyter": { + "outputs_hidden": false } }, - "id": "69f6da5532285cf9" + "outputs": [], + "source": [ + "import yaml\n", + "report = yaml.safe_load(open(\"output/validate-definitions.llm.yaml\"))" + ] }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 15, + "id": "b35f8ffab12b1b6b", + "metadata": { + "ExecuteTime": { + "end_time": "2024-04-15T01:09:34.475682Z", + "start_time": "2024-04-15T01:09:34.465369Z" + }, + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, "outputs": [ { "name": "stdout", @@ -588,7 +2253,7 @@ "text": [ "type: https://w3id.org/oak/ontology-metadata/DCC.S20\n", "subject: GO:0000010\n", - "severity: ERROR\n", + "severity: INFO\n", "predicate: IAO:0000115\n", "object_str: \n", " id: PMID:9708911\n", @@ -611,13 +2276,15 @@ " \n", "\n", "info: \n", - " The definition for the term \"trans-hexaprenyltranstransferase activity\" has a LOW level of alignment with the cited reference PMID:9708911.\n", + " The term \"trans-hexaprenyltranstransferase activity\" has a HIGH level of alignment with the cited reference PMID:9708911. The abstract supports the definition well, as evidenced by these key points:\n", + " \n", + " 1. The study examines the importance of the side chain length of ubiquinone (UQ) in Saccharomyces cerevisiae, which directly relates to the activity of trans-hexaprenyltranstransferase.\n", " \n", - " The abstract does not specifically mention the term \"trans-hexaprenyltranstransferase activity\". It discusses the biological significance of the side chain length of ubiquinone in Saccharomyces cerevisiae, and how different prenyl diphosphate synthases were expressed in a COQ1 mutant defective for hexaprenyl diphosphate synthesis to produce UQs with different isoprenoid chain lengths.\n", + " 2. The abstract mentions \"hexaprenyl diphosphate synthesis\" in S. cerevisiae, which is the product of trans-hexaprenyltranstransferase activity.\n", " \n", - " While the study involves manipulating the synthesis of hexaprenyl diphosphate, which is likely catalyzed by trans-hexaprenyltranstransferase, the enzyme itself is not explicitly mentioned or studied in the abstract.\n", + " 3. The study found that the original species of UQ (UQ-6) had maximum functionality in yeast cells, suggesting a preference for the hexaprenyl side chain length produced by trans-hexaprenyltranstransferase.\n", " \n", - " The definition seems too specific for the cited reference, as the abstract does not directly investigate or discuss the activity of trans-hexaprenyltranstransferase.\n", + " No sections of the abstract misalign with or contradict the term definition. The definition is appropriately specific, focusing on the enzyme's activity without providing additional details about its structure or cellular role.\n", "\n", "definition: \n", " Catalysis of the reaction: (2E,6E)-farnesyl diphosphate + 4 isopentenyl diphosphate = 4 diphosphate + all-trans-heptaprenyl diphosphate.\n", @@ -636,25 +2303,32 @@ " print(f\"{k}: {v}\")\n", "\n", " " - ], + ] + }, + { + "cell_type": "markdown", + "id": "233f8a645b3517f2", "metadata": { "collapsed": false, - "ExecuteTime": { - "end_time": "2024-04-15T01:09:34.475682Z", - "start_time": "2024-04-15T01:09:34.465369Z" + "jupyter": { + "outputs_hidden": false } }, - "id": "b35f8ffab12b1b6b" + "source": [ + "__COMMENTARY__\n", + "\n", + "Note that as this is an LLM the output differs every time!\n", + "\n", + "In some cases, the LLM is failing to see that the paper is indeed about trans-hexaprenyltranstransferase activity, the output is useful as it shows us that the abstract is not directly about this activity." + ] }, { - "cell_type": "markdown", - "source": [ - "While in this case, the LLM is failing to see that the paper is indeed about trans-hexaprenyltranstransferase activity, the output is useful as it shows us that the abstract is not directly about this activity." - ], - "metadata": { - "collapsed": false - }, - "id": "233f8a645b3517f2" + "cell_type": "code", + "execution_count": null, + "id": "df16f8ef-a274-4c8c-a1a5-bbef76597842", + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { diff --git a/notebooks/Commands/output/trigeminal-ganglion-graph.png b/notebooks/Commands/output/trigeminal-ganglion-graph.png new file mode 100644 index 0000000000000000000000000000000000000000..07ad6b2bc759a0af2047970a632db4e012cb3fa6 GIT binary patch literal 248946 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 z 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 is installed. Example: - ------- + runoak -i sqlite:cl.db viz CL:4023094 Same query on ubergraph: @@ -1983,7 +1983,7 @@ def tree( For general instructions, see the viz command, which this is analogous too. Example: - ------- + runoak -i envo.db tree ENVO:00000372 -p i,p This produces output like: @@ -2002,7 +2002,7 @@ def tree( You can use the --gap-fill option to create a minimal tree: Example: - ------- + runoak -i envo.db tree --gap-fill 'pyroclastic shield volcano' 'subglacial volcano' volcano -p i This will show the tree containing only these terms, and the most direct inferred relationships between them. @@ -2011,7 +2011,7 @@ def tree( the most informative intermediate classes: Example: - ------- + runoak -i envo.db tree --add-mrcas --gap-fill 'pyroclastic shield volcano'\ 'subglacial volcano' 'mud volcano' -p i @@ -2126,7 +2126,7 @@ def ancestors( a parent includes all relationship types, not just is-a. Example: - ------- + runoak -i cl.owl ancestors CL:4023094 This will show ancestry over the full relationship graph. Like any relational @@ -2250,19 +2250,19 @@ def paths( List all paths between one or more start curies. Example: - ------- + runoak -i sqlite:obo:go paths -p i,p 'nuclear membrane' This shows all shortest paths from nuclear membrane to all ancestors Example: - ------- + runoak -i sqlite:obo:go paths -p i,p 'nuclear membrane' --target cytoplasm This shows shortest paths between two nodes Example: - ------- + runoak -i sqlite:obo:go paths -p i,p 'nuclear membrane' 'thylakoid' --target cytoplasm 'thylakoid membrane' This shows all shortest paths between 4 combinations of starts and ends @@ -2276,7 +2276,7 @@ def paths( You can also pass in weights for each predicate, used when calculating shortest paths. Example: - ------- + runoak -i sqlite:obo:go paths -p i,p 'nuclear membrane' --target cytoplasm \ --predicate-weights "{i: 0.0001, p: 999}" @@ -2287,7 +2287,7 @@ def paths( This command can be combined with others to visualize the paths. Example: - ------- + alias go="runoak -i sqlite:obo:go" go paths -p i,p 'nuclear membrane' --target cytoplasm --narrow | go viz --fill-gaps - @@ -2436,7 +2436,7 @@ def siblings(terms, predicates, output_type: str, output: str): List all siblings of a specified term or terms Example: - ------- + runoak -i cl.owl siblings CL:4023094 Note that siblings is by default over ALL relationship types, so we recommend @@ -2477,11 +2477,11 @@ def descendants( List all descendants of a term Example: - ------- + runoak -i sqlite:obo:obi descendants assay -p i Example: - ------- + runoak -i sqlite:obo:uberon descendants heart -p i,p This is the inverse of the 'ancestors' command; see the documentation for @@ -2531,11 +2531,11 @@ def dump(terms, output, output_type: str, config_file: str = None, **kwargs): Exports (dumps) the entire contents of an ontology. Example: - ------- + runoak -i pato.obo dump -o pato.json -O json Example: - ------- + runoak -i pato.owl dump -o pato.ttl -O turtle You can also pass in a JSON configuration file to parameterize the dump process. @@ -2545,7 +2545,7 @@ def dump(terms, output, output_type: str, config_file: str = None, **kwargs): https://incatools.github.io/ontology-access-kit/converters/obo-graph-to-fhir.html Example: - ------- + runoak -i pato.owl dump -o pato.ttl -O fhirjson -c fhir_config.json -o pato.fhir.json Currently each implementation only supports a subset of formats. @@ -2590,11 +2590,11 @@ def transform(terms, transform, output, output_type: str, config_file: str = Non Transforms an ontology Example: - ------- + runoak -i pato.obo dump -o pato.json -O json Example: - ------- + runoak -i pato.owl dump -o pato.ttl -O turtle You can also pass in a JSON configuration file to parameterize the dump process. @@ -2604,7 +2604,7 @@ def transform(terms, transform, output, output_type: str, config_file: str = Non https://incatools.github.io/ontology-access-kit/converters/obo-graph-to-fhir.html Example: - ------- + runoak -i pato.owl dump -o pato.ttl -O fhirjson -c fhir_config.json -o pato.fhir.json Currently each implementation only supports a subset of formats. @@ -2679,7 +2679,7 @@ def prefixes(terms, used_only: bool, output, output_type: str): prefix maps. Example: - ------- + runoak --named-prefix-map prefixcc prefixes If an ontology is loaded, then --used-only can be used to restrict to @@ -2789,7 +2789,7 @@ def similarity_pair(terms, predicates, autolabel: bool, output: TextIO, output_t Note: We recommend always specifying explicit predicate lists Example: - ------- + runoak -i ubergraph: similarity-pair -p i,p CL:0000540 CL:0000000 You can omit predicates if you like but be warned this may yield @@ -2895,7 +2895,7 @@ def similarity( - via explicit lists of terms or queries Example: - ------- + runoak -i hp.db similarity -p i --set1-file HPO-TERMS1 --set2-file HPO-TERMS2 -O csv This will compare every term in TERMS1 vs TERMS2 @@ -2903,13 +2903,13 @@ def similarity( Alternatively standard OAK term queries can be used, with "@" separating the two lists Example: - ------- + runoak -i hp.db similarity -p i TERM_1 TERM_2 ... TERM_N @ TERM_N+1 ... TERM_M The .all term syntax can be used to select all terms in an ontology Example: - ------- + runoak -i ma.db similarity -p i,p .all @ .all This can be mixed with other term selectors; for example to calculate the similarity of "neuron" @@ -3012,7 +3012,7 @@ def termset_similarity( This calculates a similarity matrix for two sets of terms. Example: - ------- + runoak -i go.db termset-similarity -p i,p nucleus membrane @ "nuclear membrane" vacuole -p i,p Python API: @@ -3067,7 +3067,7 @@ def information_content( Show information content for term or list of terms Example: - ------- + runoak -i cl.db information-content -p i .all Like all OAK commands that operate over graphs, the graph traversal is controlled @@ -3116,7 +3116,7 @@ def info(terms, output: TextIO, display: str, output_type: str): Show information on term or set of terms Example: - ------- + runoak -i sqlite:obo:cl info CL:4023094 The default output is minimal, showing only ID and label @@ -3175,7 +3175,7 @@ def languages(): Show available languages Example: - ------- + runoak languages """ @@ -3209,13 +3209,13 @@ def labels( Show labels for term or list of terms Example: - ------- + runoak -i cl.owl labels CL:4023093 CL:4023094 You can use the ".all" selector to show all labels: Example: - ------- + runoak -i cl.owl labels .all (this may be blocked for remote endpoints) @@ -3231,13 +3231,13 @@ def labels( a particular language. Example: - ------- + runoak --preferred-language fr -i sqlite:obo:hpinternational labels .ancestors HP:0020110 You can also query for all languages, and see these pivoted: Example: - ------- + runoak -i sqlite:obo:hpinternational labels .ancestors HP:0020110 --pivot-languages Python API: @@ -3321,14 +3321,14 @@ def definitions( Show textual definitions for term or set of terms Example: - ------- + runoak -i sqlite:obo:envo definitions 'tropical biome' 'temperate biome' You can use the ".all" selector to show all definitions for all terms in the ontology: Example: - ------- + runoak -i sqlite:obo:envo definitions .all @@ -3409,6 +3409,12 @@ def definitions( show_default=True, help="Include entailed indirect relationships", ) +@click.option( + "--non-redundant-entailed/--no-non-redundant-entailed", + default=False, + show_default=True, + help="Include entailed but exclude entailed redundant relationships", +) @click.option( "--include-tbox/--no-include-tbox", default=True, @@ -3439,6 +3445,7 @@ def relationships( include_entailed: bool, include_tbox: bool, include_abox: bool, + non_redundant_entailed: bool, include_metadata: bool, ): """ @@ -3447,25 +3454,25 @@ def relationships( By default, this shows all relationships where the input term(s) are the *subjects* Example: - ------- + runoak -i cl.db relationships CL:4023094 Like all OAK commands, a label can be passed instead of a CURIE Example: - ------- + runoak -i cl.db relationships neuron To reverse the direction, and query where the search term(s) are *objects*, use the --direction flag: Example: - ------- + runoak -i cl.db relationships --direction down neuron Multiple terms can be passed Example: - ------- + runoak -i uberon.db relationships heart liver lung And like all OAK commands, a query can be passed rather than an explicit term list @@ -3509,6 +3516,15 @@ def relationships( include_tbox=include_tbox, include_entailed=include_entailed, ) + if non_redundant_entailed: + if not isinstance(impl, OboGraphInterface): + raise NotImplementedError(f"Cannot execute this using {impl} of type {type(impl)}") + up_it = impl.non_redundant_entailed_relationships( + subjects=curies, + predicates=actual_predicates, + include_abox=include_abox, + include_tbox=include_tbox, + ) if direction is None or direction == Direction.up.value: it = up_it elif direction == Direction.down.value: @@ -3615,7 +3631,7 @@ def logical_definitions( You can also specify CSV to generate a flattened form of this. Example: - ------- + pato logical-definitions .all --output-type csv You can optionally choose to "--matrix-axes" to transform the output to a matrix form. @@ -3623,12 +3639,12 @@ def logical_definitions( type: "f" for filler, "p" for predicate, "g" for genus, "d" for defined class. Example: - ------- + - Each property/predicate is a column - For repeated properties, columns of the form prop_1, prop_2, ... are generated Example: - ------- + pato logical-definitions .all --matrix-axes d,p --output-type csv This will generate a row for each defined class with a logical definition, with columns @@ -3752,7 +3768,7 @@ def disjoints( serialization: Example: - ------- + runoak -i sqlite:obo:uberon disjoints Note that this will include pairwise disjoints, setwise disjoints, @@ -3761,13 +3777,13 @@ def disjoints( A tabular format can be easier to browse, and includes labels by default: Example: - ------- + runoak -i sqlite:obo:uberon disjoints --autolabel -O csv To perform this on a subset: Example: - ------- + runoak -i sqlite:obo:cl disjoints --autolabel -O csv .desc//p=i "immune cell" Data model: @@ -3869,7 +3885,7 @@ def terms(output: str, owl_type, filter_obsoletes: bool): List all terms in the ontology Example: - ------- + runoak -i db/cob.db terms All terms without obsoletes: @@ -3921,7 +3937,7 @@ def roots(output: str, output_type: str, predicates: str, has_prefix: str, annot and parameterizing Example: - ------- + runoak -i db/cob.db roots This command is a wrapper onto the "roots" command in the BasicOntologyInterface. @@ -3958,7 +3974,7 @@ def leafs(output: str, predicates: str, filter_obsoletes: bool): Note that the default is to return the roots of the relation graph over *all* predicates Example: - ------- + runoak -i db/cob.db leafs This command is a wrapper onto the "leafs" command in the BasicOntologyInterface. @@ -3990,7 +4006,7 @@ def singletons(output: str, predicates: str, filter_obsoletes: bool): Obsoletes are filtered by default Example: - ------- + runoak -i db/cob.db singletons This command is a wrapper onto the "singletons" command in the BasicOntologyInterface. @@ -4027,7 +4043,7 @@ def mappings(terms, maps_to_source, autolabel: bool, output, output_type, mapper List all mappings encoded in the ontology Example: - ------- + runoak -i sqlite:obo:envo mappings The default output is SSSOM YAML. To use the (canonical) csv format: @@ -4099,7 +4115,7 @@ def normalize(terms, maps_to_source, autolabel: bool, output, output_type): Normalize all input identifiers. Example: - ------- + runoak -i translator: normalize HGNC:1 HGNC:2 -M NCBIGene Python API: @@ -4142,7 +4158,7 @@ def aliases(terms, output, output_type, obo_model): List aliases for a term or set of terms. Example: - ------- + runoak -i ubergraph:uberon aliases UBERON:0001988 TERMS should be either an explicit list of terms or queries, or can be a selector query, @@ -4200,7 +4216,7 @@ def term_subsets(terms, output, output_type): List subsets for a term or set of terms. Example: - ------- + runoak -i sqlite:obo:uberon term-subsets heart lung Python API: @@ -4228,7 +4244,7 @@ def expand_subsets(subsets: list, output, predicates): For each subset provide a mapping of each term in the ontology to a subset Example: - ------- + runoak -i db/pato.db expand-subsets attribute_slim value_slim """ @@ -4287,7 +4303,7 @@ def axioms(terms, output: str, output_type: str, axiom_type: str, about: str, re Filters axioms Example: - ------- + runoak -i cl.ofn axiom The above will write all axioms. @@ -4295,7 +4311,7 @@ def axioms(terms, output: str, output_type: str, axiom_type: str, about: str, re You can filter by axiom type: Example: - ------- + runoak -i cl.ofn axiom --axiom-type SubClassOf Note this currently only works with the funowl adapter, on functional syntax files @@ -4366,11 +4382,11 @@ def taxon_constraints( of NCBI Taxonomy Example: - ------- + runoak -i db/go.db taxon-constraints GO:0034357 --include-redundant -p i,p Example: - ------- + runoak -i sqlite:obo:uberon taxon-constraints UBERON:0003884 UBERON:0003941 -p i,p More examples: @@ -4432,7 +4448,7 @@ def apply_taxon_constraints( separated by periods. Example: - ------- + runoak -i db/go.db apply-taxon-constraints -p i,p GO:0005743 only NCBITaxon:2759 never NCBITaxon:2 . GO:0005634 only NCBITaxon:2 @@ -4444,7 +4460,7 @@ def apply_taxon_constraints( GO:0000229,Gain|NCBITaxon:1(root);>Loss|NCBITaxon:2759(Eukaryota); Example: - ------- + runoak -i db/go.db eval-taxon-constraints -p i,p -E tests/input/go-evo-gains-losses.csv More examples: @@ -4544,7 +4560,7 @@ def associations( Lookup associations from or to entities. Example: - ------- + runoak -i sqlite:obo:hp -g test.hpoa -G hpoa associations The above will show all associations @@ -4553,7 +4569,7 @@ def associations( terms or term queries, plus the closure predicate(s), e.g. Example: - ------- + runoak -i sqlite:obo:hp -g test.hpoa -G hpoa associations -p i HP:0001392 This shows all annotations either to "Abnormality of the liver" (HP:0001392), or @@ -4567,7 +4583,7 @@ def associations( For example, the go-dictybase-input-spec combines go plus dictybase associations. Example: - ------- + runoak --i src/oaklib/conf/go-dictybase-input-spec.yaml associations -p i,p GO:0008104 More examples: @@ -4702,7 +4718,7 @@ def associations_counts( Count associations, grouped by subject or object Example: - ------- + runoak -i sqlite:obo:hp -g test.hpoa -G hpoa associations-counts This will default to summarzing by objects (HPO term), showing the number @@ -4712,13 +4728,13 @@ def associations_counts( the closure predicate(s), e.g. Example: - ------- + runoak -i sqlite:obo:hp -g test.hpoa -G hpoa associations -p i You can also group by other fields Example: - ------- + runoak -i sqlite:obo:hp -g test.hpoa -G hpoa associations-counts --group-by subject This will show the number of associations for each disease. @@ -4820,7 +4836,7 @@ def associations_matrix( See: Wood V., Carbon S., et al, https://royalsocietypublishing.org/doi/10.1098/rsob.200149 Example: - ------- + runoak -i amigo:NCBITaxon:9606 associations-matrix -p i,p GO:0042416 GO:0014046 @@ -4892,7 +4908,7 @@ def rollup( sub-groups. Example: - ------- + runoak -i sqlite:go.db -g wb.gaf -G gaf rollup \ --object-group GO:0032502,GO:0007568,GO:0048869,GO:0098727 \ --object-group GO:0008152,GO:0009056,GO:0044238,GO:1901275 \ @@ -5042,7 +5058,7 @@ def enrichment( associations, return the terms that are over-represented in the sample set. Example: - ------- + runoak -i sqlite:obo:uberon -g gene2anat.txt -G g2t enrichment -U my-genes.txt -O csv This runs an enrichment using Uberon on my-genes.txt, using the gene2anat.txt file as the @@ -5131,7 +5147,7 @@ def diff_associations( Diffs two association sources. Example: - ------- + runoak -i sqlite:obo:go -G gaf diff-associations \ --old-date ${date1} --new-date ${date2} \ -g "${download_dir}/${group}-${date1}.gaf" \ @@ -5230,7 +5246,7 @@ def validate( Implementation notes: Currently only works on SQLite Example: - ------- + runoak -i db/ecto.db validate -o results.tsv The default validation performed is structural (conformance to the ontology_metadata schema) @@ -5241,7 +5257,7 @@ def validate( To run these, pass --no-skip-ontology-rules Example: - ------- + runoak -i db/uberon.db validate --skip-structural-validation --no-skip-ontology-rules For more information, see the OAK how-to guide: @@ -5383,7 +5399,7 @@ def validate_definitions( checks for *presence* of definitions, use --skip-text-annotation: Example: - ------- + runoak validate-definitions -i db/uberon.db --skip-text-annotation @@ -5392,7 +5408,7 @@ def validate_definitions( individual classes Example: - ------- + runoak validate-definitions -i db/cl.db CL:0002053 @@ -5633,7 +5649,7 @@ def migrate_curies(curie_pairs, replace: bool, output_type, output: str): source and the target Example: - ------- + runoak -i db/uberon.db migrate-curies --replace SRC1=TGT1 SRC2=TGT2 This command is a wrapper onto the "migrate_curies" command in the PatcherInterface @@ -5665,7 +5681,7 @@ def set_apikey(endpoint, keyval): Sets an API key Example: - ------- + oak set-apikey -e bioportal MY-KEY-VALUE This is stored in an OS-dependent path @@ -5757,7 +5773,7 @@ def lexmatch( Performs lexical matching between pairs of terms in one more more ontologies. Examples - -------- + - runoak -i foo.obo lexmatch -o foo.sssom.tsv In this example, the input ontology file is assumed to contain all pairs of terms to be mapped. @@ -5935,7 +5951,7 @@ def diff( Compute difference between two ontologies. Example: - ------- + runoak -i foo.obo diff -X bar.obo -o diff.yaml This will produce a list of Changes that are required to go from the main input ontology (--input) @@ -5963,7 +5979,7 @@ def diff( the GO uses the oio:hasOBONamespace property to partition classes into 3 categories. Example: - ------- + runoak -i go.obo diff -X go-new.obo -o diff.yaml --statistics --group-by-property oio:hasOBONamespace This will produce a YAML dictionary, with outer keys being the values of the oio:hasOBONamespace property, @@ -6068,7 +6084,7 @@ def apply( https://github.com/INCATools/kgcl Example: - ------- + runoak -i cl.owl.ttl apply "rename CL:0000561 to 'amacrine neuron'" -o cl.owl.ttl -O ttl On an obo format file: @@ -6082,7 +6098,7 @@ def apply( -o cl.owl.ttl -O ttl Warning: - ------- + This command is still experimental. Some things to bear in mind: - for some ontologies, CURIEs may not work, instead specify a full URI surrounded by <>s @@ -6162,7 +6178,7 @@ def apply_obsolete(output, output_type, expand: bool, terms, **kwargs): Sets an ontology element to be obsolete Example: - ------- + runoak -i my.obo apply-obsolete MY:0002200 -o my-modified.obo Multiple terms can be passed, as labels, IDs, or using OAK queries: @@ -6217,7 +6233,7 @@ def lint(output, output_type, report_format, dry_run: bool): By default, changes will be applied Example: - ------- + runoak -i my.obo lint This can be executed in dry-run mode, in which case changes are not applied: @@ -6306,7 +6322,7 @@ def diff_via_mappings( command will perform a structural comparison of all mapped pairs of terms Example: - ------- + runoak -i sqlite:obo:uberon diff-via-mappings --other-input sqlite:obo:zfa --source UBERON --source ZFA -O csv Note the above command does not have any mapping file specified; the mappings that are distributed within @@ -6453,7 +6469,7 @@ def fill_table( headers for a table of ontology elements (see later for configuration when you don't follow conventions) Example: - ------- + runoak -i cl.owl.ttl fill-table my-table.tsv (any implementation can be used) @@ -6493,7 +6509,7 @@ def fill_table( given a TSV with columns cl_identifier and cl_display_label you can say: Example: - ------- + runoak -i cl.owl.ttl fill-table \ --relation "{primary_key: cl_identifier, dependent_column: cl_display_label, relation: label}" @@ -6615,14 +6631,14 @@ def generate_synonyms(terms, rules_file, apply_patch, patch, patch_format, outpu applied. Pass the `--patch` argument to lso get the patch file in KGCL format. Example: - ------- + runoak -i foo.obo generate-synonyms -R foo_rules.yaml --patch patch.kgcl --apply-patch -o foo_syn.obo If the `apply-patch` flag is NOT set then the main input will be KGCL commands Example: - ------- + runoak -i foo.obo generate-synonyms -R foo_rules.yaml -o changes.kgcl @@ -6693,7 +6709,7 @@ def generate_lexical_replacements( applied. Pass the `--patch` argument to lso get the patch file in KGCL format. Example: - ------- + runoak -i foo.obo generate-lexical-replacements -R foo_rules.yaml\ --patch patch.kgcl --apply-patch -o foo_syn.obo @@ -6701,7 +6717,7 @@ def generate_lexical_replacements( If the `apply-patch` flag is NOT set then the main input will be KGCL commands Example: - ------- + runoak -i foo.obo generate-lexical-replacements -R foo_rules.yaml -o changes.kgcl @@ -6709,7 +6725,7 @@ def generate_lexical_replacements( You can also pass the expressions directly as YAML Example: - ------- + runoak -i foo.obo generate-lexical-replacements \ -Y '{match: "nuclear (\\w+)", replacement: "\\1 nucleus"}' .all @@ -6782,13 +6798,13 @@ def generate_definitions(terms, apply_patch, patch, patch_format, output, output Currently this only works with the llm extension. Example: - ------- + runoak -i llm:sqlite:obo:foodon generate-definitions FOODON:03315258 The --style-hints option can be used to provide hints to the definition generator. Example: - ------- + runoak -i llm:sqlite:obo:foodon generate-definitions FOODON:03315258 \ --style-hints "Write the definition in the style of a pretentious food critic" @@ -6972,7 +6988,7 @@ def generate_disjoints( Generate candidate disjointness axioms. Example: - ------- + runoak -i sqlite:obo:iao generate-disjoints -O obo To generate spatial disjointness axioms: diff --git a/src/oaklib/interfaces/obograph_interface.py b/src/oaklib/interfaces/obograph_interface.py index 2165c3f51..05b67fbbc 100644 --- a/src/oaklib/interfaces/obograph_interface.py +++ b/src/oaklib/interfaces/obograph_interface.py @@ -259,6 +259,38 @@ def descendant_graph( self.transitive_query_cache[key] = g return g + def non_redundant_entailed_relationships( + self, + predicates: List[PRED_CURIE] = None, + **kwargs, + ) -> Iterator[RELATIONSHIP]: + """ + Yields all relationships that are directly entailed. + + See https://github.com/INCATools/ontology-access-kit/issues/739 + + :param kwargs: same as relationships + :return: + """ + if "include_entailed" in kwargs: + kwargs.pop("include_entailed") + relationships = list( + self.relationships(predicates=predicates, include_entailed=True, **kwargs) + ) + rel_by_sp = defaultdict(list) + for s, p, o in relationships: + if s == o: + continue + rel_by_sp[(s, p)].append(o) + for (s, p), objs in rel_by_sp.items(): + redundant_set = set() + for o in objs: + ancs = list(self.ancestors(o, predicates=predicates, reflexive=False)) + redundant_set.update(ancs) + for o in objs: + if o not in redundant_set: + yield s, p, o + def ancestors( self, start_curies: Union[CURIE, List[CURIE]], diff --git a/tests/__init__.py b/tests/__init__.py index 6309277f9..f3d13c68e 100644 --- a/tests/__init__.py +++ b/tests/__init__.py @@ -46,6 +46,8 @@ def output_path(fn: str) -> str: NUCLEUS = "GO:0005634" ORGANELLE_MEMBRANE = "GO:0031090" NUCLEAR_ENVELOPE = "GO:0005635" +ORGANELLE_ENVELOPE = "GO:0031967" +ENVELOPE = "GO:0031975" THYLAKOID = "GO:0009579" ATOM = "CHEBI:33250" INTERNEURON = "CL:0000099" diff --git a/tests/test_implementations/__init__.py b/tests/test_implementations/__init__.py index 18c45bffb..0abd97455 100644 --- a/tests/test_implementations/__init__.py +++ b/tests/test_implementations/__init__.py @@ -96,6 +96,7 @@ CYTOPLASM, CYTOPLASMIC_REGION, ENDOMEMBRANE_SYSTEM, + ENVELOPE, EUKARYOTA, FAKE_ID, FUNGI, @@ -120,6 +121,8 @@ NUCLEUS, OPISTHOKONTA, ORGANELLE, + ORGANELLE_ENVELOPE, + ORGANELLE_MEMBRANE, PHENOTYPIC_ABNORMALITY, PHOTORECEPTOR_OUTER_SEGMENT, PHOTOSYNTHETIC_MEMBRANE, @@ -615,6 +618,42 @@ def test_relationships(self, oi: BasicOntologyInterface, ignore_annotation_edges irels = list(oi.incoming_relationships(o, predicates=[p])) test.assertIn((p, s), irels) + def test_entailed_relationships(self, oi: OboGraphInterface): + """ + Tests entailed relationship methods for compliance. + + :param oi: + :return: + """ + test = self.test + cases = [ + ( + NUCLEAR_MEMBRANE, + [IS_A, PART_OF], + {IS_A: {ORGANELLE_MEMBRANE}, PART_OF: {NUCLEAR_ENVELOPE}}, + ), + ( + NUCLEAR_MEMBRANE, + [IS_A, OVERLAPS], + {IS_A: {ORGANELLE_MEMBRANE}, OVERLAPS: {NUCLEAR_ENVELOPE}}, + ), + (NUCLEAR_MEMBRANE, [IS_A], {IS_A: {ORGANELLE_MEMBRANE}}), + ( + NUCLEAR_MEMBRANE, + [PART_OF], + {PART_OF: {NUCLEAR_ENVELOPE, ORGANELLE_ENVELOPE, ENVELOPE}}, + ), + ] + for curie, preds, expected in cases: + logging.info(f"TESTS FOR {curie}") + rels = list(oi.non_redundant_entailed_relationships(subjects=[curie], predicates=preds)) + objs_by_pred = {p: set() for p in preds} + for s, p, o in rels: + objs_by_pred[p].add(o) + assert s == curie + for p in preds: + test.assertCountEqual(expected[p], objs_by_pred[p]) + def test_rbox_relationships(self, oi: BasicOntologyInterface): """ Tests relationships between relationship types diff --git a/tests/test_implementations/test_simple_obo.py b/tests/test_implementations/test_simple_obo.py index b7328a10e..a1eced5f7 100644 --- a/tests/test_implementations/test_simple_obo.py +++ b/tests/test_implementations/test_simple_obo.py @@ -114,6 +114,10 @@ def test_relationships_extra(self): def test_relationships(self): self.compliance_tester.test_relationships(self.oi) + @unittest.skip("Contents of go-nucleus file need to be aligned") + def test_entailed_relationships(self): + self.compliance_tester.test_entailed_relationships(self.oi) + def test_rbox_relationships(self): self.compliance_tester.test_rbox_relationships(self.oi) diff --git a/tests/test_implementations/test_sqldb.py b/tests/test_implementations/test_sqldb.py index 010ca026a..62bb68584 100644 --- a/tests/test_implementations/test_sqldb.py +++ b/tests/test_implementations/test_sqldb.py @@ -90,6 +90,10 @@ def test_relationships(self): oi = SqlImplementation(OntologyResource(slug=f"sqlite:///{str(DB)}")) self.compliance_tester.test_relationships(oi, ignore_annotation_edges=False) + def test_entailed_relationships(self): + oi = SqlImplementation(OntologyResource(slug=f"sqlite:///{str(DB)}")) + self.compliance_tester.test_entailed_relationships(oi) + def test_relationships_chunking(self): """ Tests behavior for chunking relationship queries