{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# General Information" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This notebook assembles some personal experiences in accessing the [Basic Formal Ontology](https://basic-formal-ontology.org/users.html)(BFO) with [Owlready2](https://owlready2.readthedocs.io/en/latest/index.html)." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Sun Feb 7 16:11:56 2021\n" ] } ], "source": [ "import time\n", "print(time.ctime())\n", "%load_ext ipydex.displaytools" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "import owlready2 as owl2" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "info(original_iris) := \" with length: 142\"" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [ "---" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "original_iris = dict(owl2.default_world.graph._abbreviate_d) ##:i" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "# bfo = owl2.get_ontology(\"external_data/bfo.owl\").load()\n", "\n", "bfo = owl2.get_ontology(\"http://purl.obolibrary.org/obo/bfo.owl\").load()" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "info(all_iris) := \" with length: 282\"" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [ "---" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "all_iris = dict(owl2.default_world.graph._abbreviate_d) ##:i" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "info(new_iris) := \" with length: 140\"" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [ "---" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [ "['http://basic-formal-ontology.org',\n", " 'http://creativecommons.org/licenses/by/4.0',\n", " 'http://groups.google.com/group/bfo-devel',\n", " 'http://groups.google.com/group/bfo-discuss',\n", " 'http://groups.google.com/group/bfo-owl-devel',\n", " 'http://ifomis.org/bfo',\n", " 'http://purl.obolibrary.org/obo/BFO_0000001',\n", " 'http://purl.obolibrary.org/obo/BFO_0000002',\n", " 'http://purl.obolibrary.org/obo/BFO_0000003',\n", " 'http://purl.obolibrary.org/obo/BFO_0000004',\n", " 'http://purl.obolibrary.org/obo/BFO_0000006',\n", " 'http://purl.obolibrary.org/obo/BFO_0000008',\n", " 'http://purl.obolibrary.org/obo/BFO_0000009',\n", " 'http://purl.obolibrary.org/obo/BFO_0000011',\n", " 'http://purl.obolibrary.org/obo/BFO_0000015',\n", " 'http://purl.obolibrary.org/obo/BFO_0000016',\n", " 'http://purl.obolibrary.org/obo/BFO_0000017',\n", " 'http://purl.obolibrary.org/obo/BFO_0000018',\n", " 'http://purl.obolibrary.org/obo/BFO_0000019',\n", " 'http://purl.obolibrary.org/obo/BFO_0000020']" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "new_iris = [key for key in all_iris.keys() if key not in original_iris] ##:i\n", "\n", "new_iris[:20]" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[obo.BFO_0000001,\n", " obo.BFO_0000002,\n", " obo.BFO_0000003,\n", " obo.BFO_0000004,\n", " obo.BFO_0000020,\n", " obo.BFO_0000031,\n", " obo.BFO_0000006,\n", " obo.BFO_0000141,\n", " obo.BFO_0000029,\n", " obo.BFO_0000140]" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "classes = list(bfo.classes())\n", "\n", "c0 = classes[0]\n", "classes[:10]" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(c0.name) := 'BFO_0000001'" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [ "---" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [ "(c0.label) := ['entity']" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [ "---" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [ "(c0.iri) := 'http://purl.obolibrary.org/obo/BFO_0000001'" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [ "---" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [ "(bfo.base_iri) := 'http://purl.obolibrary.org/obo/bfo.owl#'" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [ "---" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "c0.name ##:\n", "c0.label ##:\n", "\n", "c0.iri ##:\n", "bfo.base_iri ##:" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## How to access a class by its `name` (i.e. not by its `label`)?\n", "\n", "### Manually building the iri\n", "\n", "This requires to know the internal iri-prefix which is not the same as `bfo.base_iri`" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "klass := obo.BFO_0000001" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [ "---" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [ "True" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "klass = bfo.world[\"http://purl.obolibrary.org/obo/BFO_0000001\"] ##:\n", "\n", "klass == c0" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Fixing (hacking) `.base_iri`\n" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Inherently, `bfo.BFO_0000001` cannot be resolved due to iri mismatch.\n", "bfo.BFO_0000001 is None" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [], "source": [ "# changing the base_iri to the string wich is used as prefix in `bfo.world.graph._abbreviate_d`\n", "\n", "bfo.base_iri = 'http://purl.obolibrary.org/obo/'" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(bfo.BFO_0000001 is None) := False" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [ "---" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [ "obo.BFO_0000001" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# now this works as intended\n", "bfo.BFO_0000001 is None ##:\n", "\n", "bfo.BFO_0000001" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Access via `.search(...)`" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[obo.BFO_0000001]" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# this does not require to alter the base_iri\n", "bfo.search(iri=\"*BFO_0000001\")" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[obo.BFO_0000001]" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "bfo.search(label=\"entity\")" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'http://purl.obolibrary.org/obo/BFO_0000001'" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "bfo.search(label=\"entity\").first().iri" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## General overview of the entities in BFO" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "BFO_0000001 ['entity']\n", "BFO_0000002 ['continuant']\n", "BFO_0000003 ['occurrent']\n", "BFO_0000004 ['independent continuant']\n", "BFO_0000020 ['specifically dependent continuant']\n", "BFO_0000031 ['generically dependent continuant']\n", "BFO_0000006 ['spatial region']\n", "BFO_0000141 ['immaterial entity']\n", "BFO_0000029 ['site']\n", "BFO_0000140 ['continuant fiat boundary']\n", "BFO_0000008 ['temporal region']\n", "BFO_0000011 ['spatiotemporal region']\n", "BFO_0000015 ['process']\n", "BFO_0000035 ['process boundary']\n", "BFO_0000009 ['two-dimensional spatial region']\n", "BFO_0000028 ['three-dimensional spatial region']\n", "BFO_0000016 ['disposition']\n", "BFO_0000017 ['realizable entity']\n", "BFO_0000023 ['role']\n", "BFO_0000019 ['quality']\n", "BFO_0000018 ['zero-dimensional spatial region']\n", "BFO_0000024 ['fiat object part']\n", "BFO_0000040 ['material entity']\n", "BFO_0000026 ['one-dimensional spatial region']\n", "BFO_0000027 ['object aggregate']\n", "BFO_0000030 ['object']\n", "BFO_0000034 ['function']\n", "BFO_0000038 ['one-dimensional temporal region']\n", "BFO_0000148 ['zero-dimensional temporal region']\n", "BFO_0000142 ['one-dimensional continuant fiat boundary']\n", "BFO_0000146 ['two-dimensional continuant fiat boundary']\n", "BFO_0000147 ['zero-dimensional continuant fiat boundary']\n", "BFO_0000144 ['process profile']\n", "BFO_0000182 ['history']\n", "BFO_0000145 ['relational quality']\n" ] } ], "source": [ "for e in classes:\n", " print(e.name, e.label)" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "info(annotation_properties) := \" with length: 22\"" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [ "---" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "annotation_properties = list(bfo.annotation_properties()) ##:i" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [], "source": [ "tab = []\n", "\n", "for e in annotation_properties:\n", " try:\n", " label = e.label\n", " except TypeError:\n", " label = \"\"\n", " tab.append((e.name, label))" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [], "source": [ "import tabulate" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "----------- --------------------------------\n", "isDefinedBy \n", "seeAlso \n", "IAO_0000116 ['editor note']\n", "contributor []\n", "license []\n", "homepage []\n", "mbox []\n", "BFO_0000179 ['BFO OWL specification label']\n", "IAO_0000115 ['definition']\n", "IAO_0000232 ['curator note']\n", "BFO_0000180 ['BFO CLIF specification label']\n", "IAO_0000119 ['definition source']\n", "IAO_0000111 ['editor preferred term']\n", "IAO_0000112 ['example of usage']\n", "IAO_0000117 ['term editor']\n", "IAO_0000118 ['alternative term']\n", "IAO_0000412 ['imported from']\n", "IAO_0000600 ['elucidation']\n", "IAO_0000601 ['has associated axiom(nl)']\n", "IAO_0000602 ['has associated axiom(fol)']\n", "IAO_0010000 ['has axiom label']\n", "member []\n", "----------- --------------------------------\n" ] } ], "source": [ "print(tabulate.tabulate(tab))" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['editor note']" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "annotation_properties[2].label" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "isolated problem reproduction (after kernel restart)" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['editor note']\n", "[]\n" ] }, { "ename": "TypeError", "evalue": "'NoneType' object is not subscriptable", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 11\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 12\u001b[0m \u001b[0;31m# works not -> TypeError:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 13\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mannotation_properties\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlabel\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;32m/media/workcard/workstickdir/RST/expertise_system/ontologie_experimente/owlready2_cvk_fork/owlready2/prop.py\u001b[0m in \u001b[0;36m__getattr__\u001b[0;34m(Prop, attr)\u001b[0m\n\u001b[1;32m 258\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 259\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m__getattr__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mProp\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mattr\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 260\u001b[0;31m \u001b[0;32mif\u001b[0m \u001b[0mProp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnamespace\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mworld\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0mowl_world\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mAnnot\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mCURRENT_NAMESPACES\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mworld\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_props\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mattr\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 261\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mAnnot\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mProp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnamespace\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mworld\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_props\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mattr\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 262\u001b[0m \u001b[0;31m#l = CURRENT_NAMESPACES.get()\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;31mTypeError\u001b[0m: 'NoneType' object is not subscriptable" ] } ], "source": [ "import owlready2 as owl2\n", "bfo = owl2.get_ontology(\"http://purl.obolibrary.org/obo/bfo.owl\").load()\n", "\n", "annotation_properties = list(bfo.annotation_properties())\n", "\n", "# works -> List[str]\n", "print(annotation_properties[2].label)\n", "\n", "# works -> empty list\n", "print(annotation_properties[3].label)\n", "\n", "# works not -> TypeError:\n", "print(annotation_properties[0].label)" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.6" } }, "nbformat": 4, "nbformat_minor": 4 }