Repository: ontodev/robot
Pull request #439 (2019-02-21 15:03:21)

Add axiom generators to reason
See https://github.com/ontodev/robot/issues/273#issuecomment-458566408

Specifically:
* Adds `--axiom-generators "<gens>"` (see comment for usage)
* Adds `--include-indirect <bool>` option for `SubClass`, `ClassAssertion`, and `SubObjectProperty`



Patch:
diff --git a/docs/examples/annotated_source.owl b/docs/examples/annotated_source.owl
deleted file mode 100644
index 72c3abf0..00000000
--- a/docs/examples/annotated_source.owl
+++ /dev/null
@@ -1,534 +0,0 @@
-<?xml version="1.0"?>
-<rdf:RDF xmlns="https://github.com/ontodev/robot/examples/annotated.owl#"
-     xml:base="https://github.com/ontodev/robot/examples/annotated.owl"
-     xmlns:obo="http://purl.obolibrary.org/obo/"
-     xmlns:owl="http://www.w3.org/2002/07/owl#"
-     xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-     xmlns:xml="http://www.w3.org/XML/1998/namespace"
-     xmlns:xsd="http://www.w3.org/2001/XMLSchema#"
-     xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
-     xmlns:oboInOwl="http://www.geneontology.org/formats/oboInOwl#">
-    <owl:Ontology rdf:about="https://github.com/ontodev/robot/examples/annotated.owl"/>
-    
-
-
-    <!-- 
-    ///////////////////////////////////////////////////////////////////////////////////////
-    //
-    // Annotation properties
-    //
-    ///////////////////////////////////////////////////////////////////////////////////////
-     -->
-
-    
-
-
-    <!-- http://purl.obolibrary.org/obo/IAO_0000115 -->
-
-    <owl:AnnotationProperty rdf:about="http://purl.obolibrary.org/obo/IAO_0000115">
-        <rdfs:isDefinedBy rdf:resource="http://purl.obolibrary.org/obo/iao.owl"/>
-    </owl:AnnotationProperty>
-    
-
-
-    <!-- http://purl.obolibrary.org/obo/IAO_0000116 -->
-
-    <owl:AnnotationProperty rdf:about="http://purl.obolibrary.org/obo/IAO_0000116">
-        <rdfs:isDefinedBy rdf:resource="http://purl.obolibrary.org/obo/iao.owl"/>
-    </owl:AnnotationProperty>
-    
-
-
-    <!-- http://purl.obolibrary.org/obo/UBPROP_0000001 -->
-
-    <owl:AnnotationProperty rdf:about="http://purl.obolibrary.org/obo/UBPROP_0000001">
-        <rdfs:isDefinedBy rdf:resource="http://purl.obolibrary.org/obo/ubprop.owl"/>
-    </owl:AnnotationProperty>
-    
-
-
-    <!-- http://purl.obolibrary.org/obo/UBPROP_0000007 -->
-
-    <owl:AnnotationProperty rdf:about="http://purl.obolibrary.org/obo/UBPROP_0000007">
-        <rdfs:isDefinedBy rdf:resource="http://purl.obolibrary.org/obo/ubprop.owl"/>
-    </owl:AnnotationProperty>
-    
-
-
-    <!-- http://www.geneontology.org/formats/oboInOwl#hasDbXref -->
-
-    <owl:AnnotationProperty rdf:about="http://www.geneontology.org/formats/oboInOwl#hasDbXref">
-        <rdfs:isDefinedBy rdf:resource="http://www.geneontology.org/formats/oboinowl.owl"/>
-    </owl:AnnotationProperty>
-    
-
-
-    <!-- http://www.geneontology.org/formats/oboInOwl#hasExactSynonym -->
-
-    <owl:AnnotationProperty rdf:about="http://www.geneontology.org/formats/oboInOwl#hasExactSynonym">
-        <rdfs:isDefinedBy rdf:resource="http://www.geneontology.org/formats/oboinowl.owl"/>
-    </owl:AnnotationProperty>
-    
-
-
-    <!-- http://www.geneontology.org/formats/oboInOwl#hasOBONamespace -->
-
-    <owl:AnnotationProperty rdf:about="http://www.geneontology.org/formats/oboInOwl#hasOBONamespace">
-        <rdfs:isDefinedBy rdf:resource="http://www.geneontology.org/formats/oboinowl.owl"/>
-    </owl:AnnotationProperty>
-    
-
-
-    <!-- http://www.geneontology.org/formats/oboInOwl#hasRelatedSynonym -->
-
-    <owl:AnnotationProperty rdf:about="http://www.geneontology.org/formats/oboInOwl#hasRelatedSynonym">
-        <rdfs:isDefinedBy rdf:resource="http://www.geneontology.org/formats/oboinowl.owl"/>
-    </owl:AnnotationProperty>
-    
-
-
-    <!-- http://www.geneontology.org/formats/oboInOwl#id -->
-
-    <owl:AnnotationProperty rdf:about="http://www.geneontology.org/formats/oboInOwl#id">
-        <rdfs:isDefinedBy rdf:resource="http://www.geneontology.org/formats/oboinowl.owl"/>
-    </owl:AnnotationProperty>
-    
-
-
-    <!-- http://www.geneontology.org/formats/oboInOwl#inSubset -->
-
-    <owl:AnnotationProperty rdf:about="http://www.geneontology.org/formats/oboInOwl#inSubset">
-        <rdfs:isDefinedBy rdf:resource="http://www.geneontology.org/formats/oboinowl.owl"/>
-    </owl:AnnotationProperty>
-    
-
-
-    <!-- http://www.geneontology.org/formats/oboInOwl#shorthand -->
-
-    <owl:AnnotationProperty rdf:about="http://www.geneontology.org/formats/oboInOwl#shorthand">
-        <rdfs:isDefinedBy rdf:resource="http://www.geneontology.org/formats/oboinowl.owl"/>
-    </owl:AnnotationProperty>
-    
-
-
-    <!-- http://www.w3.org/2000/01/rdf-schema#label -->
-
-    <rdf:Description rdf:about="http://www.w3.org/2000/01/rdf-schema#label">
-        <rdfs:isDefinedBy rdf:resource="http://www.w3.org/2000/01/rdf-schema.owl"/>
-    </rdf:Description>
-    
-
-
-    <!-- 
-    ///////////////////////////////////////////////////////////////////////////////////////
-    //
-    // Datatypes
-    //
-    ///////////////////////////////////////////////////////////////////////////////////////
-     -->
-
-    
-
-
-    <!-- http://www.w3.org/2001/XMLSchema#string -->
-
-    <rdf:Description rdf:about="http://www.w3.org/2001/XMLSchema#string">
-        <rdfs:isDefinedBy rdf:resource="http://www.w3.org/2001/xmlschema.owl"/>
-    </rdf:Description>
-    
-
-
-    <!-- 
-    ///////////////////////////////////////////////////////////////////////////////////////
-    //
-    // Object Properties
-    //
-    ///////////////////////////////////////////////////////////////////////////////////////
-     -->
-
-    
-
-
-    <!-- http://purl.obolibrary.org/obo/BFO_0000050 -->
-
-    <owl:ObjectProperty rdf:about="http://purl.obolibrary.org/obo/BFO_0000050">
-        <rdf:type rdf:resource="http://www.w3.org/2002/07/owl#TransitiveProperty"/>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">BFO:0000050</oboInOwl:hasDbXref>
-        <oboInOwl:hasOBONamespace rdf:datatype="http://www.w3.org/2001/XMLSchema#string">uberon</oboInOwl:hasOBONamespace>
-        <oboInOwl:id rdf:datatype="http://www.w3.org/2001/XMLSchema#string">part_of</oboInOwl:id>
-        <oboInOwl:shorthand rdf:datatype="http://www.w3.org/2001/XMLSchema#string">part_of</oboInOwl:shorthand>
-        <rdfs:isDefinedBy rdf:resource="http://purl.obolibrary.org/obo/bfo.owl"/>
-        <rdfs:label rdf:datatype="http://www.w3.org/2001/XMLSchema#string">part_of</rdfs:label>
-    </owl:ObjectProperty>
-    
-
-
-    <!-- 
-    ///////////////////////////////////////////////////////////////////////////////////////
-    //
-    // Classes
-    //
-    ///////////////////////////////////////////////////////////////////////////////////////
-     -->
-
-    
-
-
-    <!-- http://purl.obolibrary.org/obo/UBERON_0000061 -->
-
-    <owl:Class rdf:about="http://purl.obolibrary.org/obo/UBERON_0000061">
-        <rdfs:subClassOf rdf:resource="http://purl.obolibrary.org/obo/UBERON_0000465"/>
-        <obo:IAO_0000115 rdf:datatype="http://www.w3.org/2001/XMLSchema#string">Material anatomical entity that has inherent 3D shape and is generated by coordinated expression of the organism&apos;s own genome.</obo:IAO_0000115>
-        <oboInOwl:hasDbXref rdf:resource="http://dbpedia.org/ontology/AnatomicalStructure"/>
-        <oboInOwl:hasDbXref rdf:resource="http://www.snomedbrowser.com/Codes/Details/362889002"/>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">AAO:0010825</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">AEO:0000003</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">BILA:0000003</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">CARO:0000003</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">EHDAA2:0003003</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">EMAPA:0</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">FBbt:00007001</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">FMA:67135</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">GAID:781</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">HAO:0000003</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">MA:0003000</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">MESH:A13</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">TAO:0000037</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">TGMA:0001823</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">VHOG:0001759</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">WBbt:0000100</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">XAO:0003000</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">ZFA:0000037</oboInOwl:hasDbXref>
-        <oboInOwl:hasExactSynonym rdf:datatype="http://www.w3.org/2001/XMLSchema#string">biological structure</oboInOwl:hasExactSynonym>
-        <oboInOwl:hasOBONamespace rdf:datatype="http://www.w3.org/2001/XMLSchema#string">uberon</oboInOwl:hasOBONamespace>
-        <oboInOwl:id rdf:datatype="http://www.w3.org/2001/XMLSchema#string">UBERON:0000061</oboInOwl:id>
-        <oboInOwl:inSubset rdf:resource="http://purl.obolibrary.org/obo/uberon/core#upper_level"/>
-        <rdfs:isDefinedBy rdf:resource="http://purl.obolibrary.org/obo/uberon.owl"/>
-        <rdfs:label rdf:datatype="http://www.w3.org/2001/XMLSchema#string">anatomical structure</rdfs:label>
-    </owl:Class>
-    
-
-
-    <!-- http://purl.obolibrary.org/obo/UBERON_0000465 -->
-
-    <owl:Class rdf:about="http://purl.obolibrary.org/obo/UBERON_0000465">
-        <rdfs:subClassOf rdf:resource="http://purl.obolibrary.org/obo/UBERON_0001062"/>
-        <obo:IAO_0000115 rdf:datatype="http://www.w3.org/2001/XMLSchema#string">Anatomical entity that has mass.</obo:IAO_0000115>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">AAO:0010264</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">AEO:0000006</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">BILA:0000006</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">CARO:0000006</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">EHDAA2:0003006</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">FBbt:00007016</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">FMA:67165</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">HAO:0000006</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">TAO:0001836</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">TGMA:0001826</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">VHOG:0001721</oboInOwl:hasDbXref>
-        <oboInOwl:hasOBONamespace rdf:datatype="http://www.w3.org/2001/XMLSchema#string">uberon</oboInOwl:hasOBONamespace>
-        <oboInOwl:id rdf:datatype="http://www.w3.org/2001/XMLSchema#string">UBERON:0000465</oboInOwl:id>
-        <oboInOwl:inSubset rdf:resource="http://purl.obolibrary.org/obo/uberon/core#upper_level"/>
-        <rdfs:isDefinedBy rdf:resource="http://purl.obolibrary.org/obo/uberon.owl"/>
-        <rdfs:label rdf:datatype="http://www.w3.org/2001/XMLSchema#string">material anatomical entity</rdfs:label>
-    </owl:Class>
-    
-
-
-    <!-- http://purl.obolibrary.org/obo/UBERON_0000475 -->
-
-    <owl:Class rdf:about="http://purl.obolibrary.org/obo/UBERON_0000475">
-        <rdfs:subClassOf rdf:resource="http://purl.obolibrary.org/obo/UBERON_0010000"/>
-        <obo:IAO_0000115 rdf:datatype="http://www.w3.org/2001/XMLSchema#string">Anatomical structure which is a subdivision of a whole organism, consisting of components of multiple anatomical systems, largely surrounded by a contiguous region of integument.</obo:IAO_0000115>
-        <obo:IAO_0000116 rdf:datatype="http://www.w3.org/2001/XMLSchema#string">Reflects CARO2. todo - check the inclusion of FMA &apos;cardinal body part here&apos;, and check child terms for consistency</obo:IAO_0000116>
-        <oboInOwl:hasDbXref rdf:resource="http://en.wikipedia.org/wiki/Body_part"/>
-        <oboInOwl:hasDbXref rdf:resource="http://linkedlifedata.com/resource/umls/id/C0229962"/>
-        <oboInOwl:hasDbXref rdf:resource="http://ncicb.nci.nih.gov/xml/owl/EVS/Body_Part"/>
-        <oboInOwl:hasDbXref rdf:resource="http://uri.neuinfo.org/nif/nifstd/birnlex_7"/>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">AAO:0010053</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">AEO:0000032</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">BILA:0000032</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">CALOHA:TS-2084</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">CARO:0000032</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">EFO:0000808</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">EHDAA2:0003032</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">FBbt:00007009</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">FMA:7153</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">HAO:0000032</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">MA:0002433</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">MAT:0000293</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">MESH:A01</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">MIAA:0000293</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">OpenCyc:Mx4rvViAHJwpEbGdrcN5Y29ycA</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">TAO:0001308</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">TGMA:0001840</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">UMLS:C0229962</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">VHOG:0001758</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">XAO:0003013</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">ZFA:0001308</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">galen:BodyPart</oboInOwl:hasDbXref>
-        <oboInOwl:hasExactSynonym rdf:datatype="http://www.w3.org/2001/XMLSchema#string">anatomic region</oboInOwl:hasExactSynonym>
-        <oboInOwl:hasOBONamespace rdf:datatype="http://www.w3.org/2001/XMLSchema#string">uberon</oboInOwl:hasOBONamespace>
-        <oboInOwl:hasRelatedSynonym rdf:datatype="http://www.w3.org/2001/XMLSchema#string">body part</oboInOwl:hasRelatedSynonym>
-        <oboInOwl:hasRelatedSynonym rdf:datatype="http://www.w3.org/2001/XMLSchema#string">body region</oboInOwl:hasRelatedSynonym>
-        <oboInOwl:hasRelatedSynonym rdf:datatype="http://www.w3.org/2001/XMLSchema#string">cardinal body part</oboInOwl:hasRelatedSynonym>
-        <oboInOwl:id rdf:datatype="http://www.w3.org/2001/XMLSchema#string">UBERON:0000475</oboInOwl:id>
-        <oboInOwl:inSubset rdf:resource="http://purl.obolibrary.org/obo/uberon/core#efo_slim"/>
-        <oboInOwl:inSubset rdf:resource="http://purl.obolibrary.org/obo/uberon/core#uberon_slim"/>
-        <oboInOwl:inSubset rdf:resource="http://purl.obolibrary.org/obo/uberon/core#upper_level"/>
-        <rdfs:isDefinedBy rdf:resource="http://purl.obolibrary.org/obo/uberon.owl"/>
-        <rdfs:label rdf:datatype="http://www.w3.org/2001/XMLSchema#string">organism subdivision</rdfs:label>
-    </owl:Class>
-    
-
-
-    <!-- http://purl.obolibrary.org/obo/UBERON_0000916 -->
-
-    <owl:Class rdf:about="http://purl.obolibrary.org/obo/UBERON_0000916">
-        <rdfs:subClassOf rdf:resource="http://purl.obolibrary.org/obo/UBERON_0009569"/>
-        <rdfs:subClassOf>
-            <owl:Restriction>
-                <owl:onProperty rdf:resource="http://purl.obolibrary.org/obo/BFO_0000050"/>
-                <owl:someValuesFrom rdf:resource="http://purl.obolibrary.org/obo/UBERON_0002417"/>
-            </owl:Restriction>
-        </rdfs:subClassOf>
-        <obo:IAO_0000115 rdf:datatype="http://www.w3.org/2001/XMLSchema#string">The subdivision of the vertebrate body between the thorax and pelvis. The ventral part of the abdomen contains the abdominal cavity and visceral organs. The dorsal part includes the abdominal section of the vertebral column.</obo:IAO_0000115>
-        <obo:IAO_0000116 rdf:datatype="http://www.w3.org/2001/XMLSchema#string">Vertebrate specific. In arthropods &apos;abdomen&apos; is the most distal section of the body which lies behind the thorax or cephalothorax. If need be we can introduce some grouping class</obo:IAO_0000116>
-        <obo:UBPROP_0000007 rdf:datatype="http://www.w3.org/2001/XMLSchema#string">abdominal</obo:UBPROP_0000007>
-        <oboInOwl:hasDbXref rdf:resource="http://en.wikipedia.org/wiki/Abdomen"/>
-        <oboInOwl:hasDbXref rdf:resource="http://www.snomedbrowser.com/Codes/Details/302553009"/>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">BTO:0000020</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">CALOHA:TS-0001</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">EFO:0000968</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">EMAPA:35102</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">EV:0100011</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">FMA:9577</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">GAID:16</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">MA:0000029</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">MAT:0000298</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">MESH:A01.047</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">MIAA:0000298</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">OpenCyc:Mx4rvVjgyZwpEbGdrcN5Y29ycA</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">galen:Abdomen</oboInOwl:hasDbXref>
-        <oboInOwl:hasExactSynonym rdf:datatype="http://www.w3.org/2001/XMLSchema#string">abdominopelvic region</oboInOwl:hasExactSynonym>
-        <oboInOwl:hasExactSynonym rdf:datatype="http://www.w3.org/2001/XMLSchema#string">abdominopelvis</oboInOwl:hasExactSynonym>
-        <oboInOwl:hasOBONamespace rdf:datatype="http://www.w3.org/2001/XMLSchema#string">uberon</oboInOwl:hasOBONamespace>
-        <oboInOwl:hasRelatedSynonym rdf:datatype="http://www.w3.org/2001/XMLSchema#string">adult abdomen</oboInOwl:hasRelatedSynonym>
-        <oboInOwl:hasRelatedSynonym rdf:datatype="http://www.w3.org/2001/XMLSchema#string">belly</oboInOwl:hasRelatedSynonym>
-        <oboInOwl:hasRelatedSynonym rdf:datatype="http://www.w3.org/2001/XMLSchema#string">celiac region</oboInOwl:hasRelatedSynonym>
-        <oboInOwl:id rdf:datatype="http://www.w3.org/2001/XMLSchema#string">UBERON:0000916</oboInOwl:id>
-        <oboInOwl:inSubset rdf:resource="http://purl.obolibrary.org/obo/uberon/core#efo_slim"/>
-        <oboInOwl:inSubset rdf:resource="http://purl.obolibrary.org/obo/uberon/core#uberon_slim"/>
-        <rdfs:isDefinedBy rdf:resource="http://purl.obolibrary.org/obo/uberon.owl"/>
-        <rdfs:label rdf:datatype="http://www.w3.org/2001/XMLSchema#string">abdomen</rdfs:label>
-    </owl:Class>
-    
-
-
-    <!-- http://purl.obolibrary.org/obo/UBERON_0001062 -->
-
-    <owl:Class rdf:about="http://purl.obolibrary.org/obo/UBERON_0001062">
-        <obo:IAO_0000115 rdf:datatype="http://www.w3.org/2001/XMLSchema#string">Biological entity that is either an individual member of a biological species or constitutes the structural organization of an individual member of a biological species.</obo:IAO_0000115>
-        <oboInOwl:hasDbXref rdf:resource="http://linkedlifedata.com/resource/umls/id/C1515976"/>
-        <oboInOwl:hasDbXref rdf:resource="http://ncicb.nci.nih.gov/xml/owl/EVS/Anatomic_Structure_System_or_Substance"/>
-        <oboInOwl:hasDbXref rdf:resource="http://uri.neuinfo.org/nif/nifstd/birnlex_6"/>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">AAO:0010841</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">AEO:0000000</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">BILA:0000000</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">CARO:0000000</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">EHDAA2:0002229</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">FBbt:10000000</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">FBbt_root:00000000</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">FMA:62955</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">HAO:0000000</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">MA:0000001</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">TAO:0100000</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">TGMA:0001822</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">UMLS:C1515976</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">XAO:0000000</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">ZFA:0100000</oboInOwl:hasDbXref>
-        <oboInOwl:hasOBONamespace rdf:datatype="http://www.w3.org/2001/XMLSchema#string">uberon</oboInOwl:hasOBONamespace>
-        <oboInOwl:id rdf:datatype="http://www.w3.org/2001/XMLSchema#string">UBERON:0001062</oboInOwl:id>
-        <oboInOwl:inSubset rdf:resource="http://purl.obolibrary.org/obo/uberon/core#upper_level"/>
-        <rdfs:isDefinedBy rdf:resource="http://purl.obolibrary.org/obo/uberon.owl"/>
-        <rdfs:label rdf:datatype="http://www.w3.org/2001/XMLSchema#string">anatomical entity</rdfs:label>
-    </owl:Class>
-    
-
-
-    <!-- http://purl.obolibrary.org/obo/UBERON_0002100 -->
-
-    <owl:Class rdf:about="http://purl.obolibrary.org/obo/UBERON_0002100">
-        <rdfs:subClassOf rdf:resource="http://purl.obolibrary.org/obo/UBERON_0011676"/>
-        <rdfs:subClassOf>
-            <owl:Restriction>
-                <owl:onProperty rdf:resource="http://purl.obolibrary.org/obo/BFO_0000050"/>
-                <owl:someValuesFrom rdf:resource="http://purl.obolibrary.org/obo/UBERON_0013702"/>
-            </owl:Restriction>
-        </rdfs:subClassOf>
-        <obo:IAO_0000115 rdf:datatype="http://www.w3.org/2001/XMLSchema#string">Organism subdivision which is the part of the body posterior to the cervical region (or head, when cervical region not present) and anterior to the caudal region. Includes the sacrum when present.</obo:IAO_0000115>
-        <obo:UBPROP_0000001 rdf:datatype="http://www.w3.org/2001/XMLSchema#string">Organism subdivision that is the part of the body posterior to the head and anterior to the tail.[AAO]</obo:UBPROP_0000001>
-        <obo:UBPROP_0000001 rdf:datatype="http://www.w3.org/2001/XMLSchema#string">Organism subdivision which is the part of the body posterior to the head and anterior to the tail.[TAO]</obo:UBPROP_0000001>
-        <oboInOwl:hasDbXref rdf:resource="http://en.wikipedia.org/wiki/Torso"/>
-        <oboInOwl:hasDbXref rdf:resource="http://linkedlifedata.com/resource/umls/id/C0460005"/>
-        <oboInOwl:hasDbXref rdf:resource="http://ncicb.nci.nih.gov/xml/owl/EVS/Trunk"/>
-        <oboInOwl:hasDbXref rdf:resource="http://www.snomedbrowser.com/Codes/Details/262225004"/>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">AAO:0010339</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">BILA:0000116</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">BTO:0001493</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">CALOHA:TS-1071</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">EFO:0000966</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">EMAPA:31857</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">FMA:7181</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">MA:0000004</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">MAT:0000296</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">MIAA:0000296</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">OpenCyc:Mx4rvVkJjpwpEbGdrcN5Y29ycA</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">TAO:0001115</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">UMLS:C0460005</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">XAO:0000054</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">XAO:0003025</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">ZFA:0001115</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">galen:Trunk</oboInOwl:hasDbXref>
-        <oboInOwl:hasExactSynonym rdf:datatype="http://www.w3.org/2001/XMLSchema#string">thoracolumbar region</oboInOwl:hasExactSynonym>
-        <oboInOwl:hasExactSynonym rdf:datatype="http://www.w3.org/2001/XMLSchema#string">torso</oboInOwl:hasExactSynonym>
-        <oboInOwl:hasExactSynonym rdf:datatype="http://www.w3.org/2001/XMLSchema#string">trunk region</oboInOwl:hasExactSynonym>
-        <oboInOwl:hasOBONamespace rdf:datatype="http://www.w3.org/2001/XMLSchema#string">uberon</oboInOwl:hasOBONamespace>
-        <oboInOwl:hasRelatedSynonym rdf:datatype="http://www.w3.org/2001/XMLSchema#string">Rumpf</oboInOwl:hasRelatedSynonym>
-        <oboInOwl:id rdf:datatype="http://www.w3.org/2001/XMLSchema#string">UBERON:0002100</oboInOwl:id>
-        <oboInOwl:inSubset rdf:resource="http://purl.obolibrary.org/obo/uberon/core#efo_slim"/>
-        <oboInOwl:inSubset rdf:resource="http://purl.obolibrary.org/obo/uberon/core#uberon_slim"/>
-        <oboInOwl:inSubset rdf:resource="http://purl.obolibrary.org/obo/uberon/core#vertebrate_core"/>
-        <rdfs:isDefinedBy rdf:resource="http://purl.obolibrary.org/obo/uberon.owl"/>
-        <rdfs:label rdf:datatype="http://www.w3.org/2001/XMLSchema#string">trunk</rdfs:label>
-    </owl:Class>
-    
-
-
-    <!-- http://purl.obolibrary.org/obo/UBERON_0002417 -->
-
-    <owl:Class rdf:about="http://purl.obolibrary.org/obo/UBERON_0002417">
-        <rdfs:subClassOf rdf:resource="http://purl.obolibrary.org/obo/UBERON_0009569"/>
-        <rdfs:subClassOf rdf:resource="http://purl.obolibrary.org/obo/UBERON_0011676"/>
-        <obo:IAO_0000115 rdf:datatype="http://www.w3.org/2001/XMLSchema#string">The abdominal segment of the torso.</obo:IAO_0000115>
-        <oboInOwl:hasDbXref rdf:resource="http://en.wikipedia.org/wiki/Lumbar"/>
-        <oboInOwl:hasDbXref rdf:resource="http://www.snomedbrowser.com/Codes/Details/362875007"/>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">EMAPA:35104</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">FMA:259211</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">MA:0000021</oboInOwl:hasDbXref>
-        <oboInOwl:hasOBONamespace rdf:datatype="http://www.w3.org/2001/XMLSchema#string">uberon</oboInOwl:hasOBONamespace>
-        <oboInOwl:hasRelatedSynonym rdf:datatype="http://www.w3.org/2001/XMLSchema#string">abdomen/pelvis/perineum</oboInOwl:hasRelatedSynonym>
-        <oboInOwl:hasRelatedSynonym rdf:datatype="http://www.w3.org/2001/XMLSchema#string">lower body</oboInOwl:hasRelatedSynonym>
-        <oboInOwl:hasRelatedSynonym rdf:datatype="http://www.w3.org/2001/XMLSchema#string">lumbar region</oboInOwl:hasRelatedSynonym>
-        <oboInOwl:id rdf:datatype="http://www.w3.org/2001/XMLSchema#string">UBERON:0002417</oboInOwl:id>
-        <rdfs:isDefinedBy rdf:resource="http://purl.obolibrary.org/obo/uberon.owl"/>
-        <rdfs:label rdf:datatype="http://www.w3.org/2001/XMLSchema#string">abdominal segment of trunk</rdfs:label>
-    </owl:Class>
-    
-
-
-    <!-- http://purl.obolibrary.org/obo/UBERON_0009569 -->
-
-    <owl:Class rdf:about="http://purl.obolibrary.org/obo/UBERON_0009569">
-        <rdfs:subClassOf rdf:resource="http://purl.obolibrary.org/obo/UBERON_0000475"/>
-        <rdfs:subClassOf>
-            <owl:Restriction>
-                <owl:onProperty rdf:resource="http://purl.obolibrary.org/obo/BFO_0000050"/>
-                <owl:someValuesFrom rdf:resource="http://purl.obolibrary.org/obo/UBERON_0002100"/>
-            </owl:Restriction>
-        </rdfs:subClassOf>
-        <oboInOwl:hasDbXref rdf:resource="http://www.snomedbrowser.com/Codes/Details/22943007"/>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">FMA:25054</oboInOwl:hasDbXref>
-        <oboInOwl:hasExactSynonym rdf:datatype="http://www.w3.org/2001/XMLSchema#string">region of trunk</oboInOwl:hasExactSynonym>
-        <oboInOwl:hasExactSynonym rdf:datatype="http://www.w3.org/2001/XMLSchema#string">trunk subdivision</oboInOwl:hasExactSynonym>
-        <oboInOwl:hasOBONamespace rdf:datatype="http://www.w3.org/2001/XMLSchema#string">uberon</oboInOwl:hasOBONamespace>
-        <oboInOwl:id rdf:datatype="http://www.w3.org/2001/XMLSchema#string">UBERON:0009569</oboInOwl:id>
-        <oboInOwl:inSubset rdf:resource="http://purl.obolibrary.org/obo/uberon/core#non_informative"/>
-        <rdfs:isDefinedBy rdf:resource="http://purl.obolibrary.org/obo/uberon.owl"/>
-        <rdfs:label rdf:datatype="http://www.w3.org/2001/XMLSchema#string">subdivision of trunk</rdfs:label>
-    </owl:Class>
-    
-
-
-    <!-- http://purl.obolibrary.org/obo/UBERON_0010000 -->
-
-    <owl:Class rdf:about="http://purl.obolibrary.org/obo/UBERON_0010000">
-        <rdfs:subClassOf rdf:resource="http://purl.obolibrary.org/obo/UBERON_0000061"/>
-        <obo:IAO_0000115 rdf:datatype="http://www.w3.org/2001/XMLSchema#string">An anatomical structure that has more than one cell as a part.</obo:IAO_0000115>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">CARO:0010000</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">FBbt:00100313</oboInOwl:hasDbXref>
-        <oboInOwl:hasExactSynonym rdf:datatype="http://www.w3.org/2001/XMLSchema#string">multicellular structure</oboInOwl:hasExactSynonym>
-        <oboInOwl:hasOBONamespace rdf:datatype="http://www.w3.org/2001/XMLSchema#string">uberon</oboInOwl:hasOBONamespace>
-        <oboInOwl:id rdf:datatype="http://www.w3.org/2001/XMLSchema#string">UBERON:0010000</oboInOwl:id>
-        <oboInOwl:inSubset rdf:resource="http://purl.obolibrary.org/obo/uberon/core#upper_level"/>
-        <rdfs:isDefinedBy rdf:resource="http://purl.obolibrary.org/obo/uberon.owl"/>
-        <rdfs:label rdf:datatype="http://www.w3.org/2001/XMLSchema#string">multicellular anatomical structure</rdfs:label>
-    </owl:Class>
-    
-
-
-    <!-- http://purl.obolibrary.org/obo/UBERON_0011676 -->
-
-    <owl:Class rdf:about="http://purl.obolibrary.org/obo/UBERON_0011676">
-        <rdfs:subClassOf rdf:resource="http://purl.obolibrary.org/obo/UBERON_0000475"/>
-        <rdfs:subClassOf>
-            <owl:Restriction>
-                <owl:onProperty rdf:resource="http://purl.obolibrary.org/obo/BFO_0000050"/>
-                <owl:someValuesFrom rdf:resource="http://purl.obolibrary.org/obo/UBERON_0013701"/>
-            </owl:Restriction>
-        </rdfs:subClassOf>
-        <obo:IAO_0000115 rdf:datatype="http://www.w3.org/2001/XMLSchema#string">A major subdivision of an organism that divides an organism along its main body axis (typically anterio-posterior axis). In vertebrates, this is based on the vertebral column.</obo:IAO_0000115>
-        <obo:IAO_0000116 rdf:datatype="http://www.w3.org/2001/XMLSchema#string">Ideally this would be disjoint with analagous class for appendicular axes, but currently &apos;appendages&apos; like antennae, horns cause a problem</obo:IAO_0000116>
-        <oboInOwl:hasExactSynonym rdf:datatype="http://www.w3.org/2001/XMLSchema#string">axial subdivision of organism</oboInOwl:hasExactSynonym>
-        <oboInOwl:hasOBONamespace rdf:datatype="http://www.w3.org/2001/XMLSchema#string">uberon</oboInOwl:hasOBONamespace>
-        <oboInOwl:hasRelatedSynonym rdf:datatype="http://www.w3.org/2001/XMLSchema#string">body segment</oboInOwl:hasRelatedSynonym>
-        <oboInOwl:hasRelatedSynonym rdf:datatype="http://www.w3.org/2001/XMLSchema#string">main body segment</oboInOwl:hasRelatedSynonym>
-        <oboInOwl:id rdf:datatype="http://www.w3.org/2001/XMLSchema#string">UBERON:0011676</oboInOwl:id>
-        <oboInOwl:inSubset rdf:resource="http://purl.obolibrary.org/obo/uberon/core#upper_level"/>
-        <rdfs:isDefinedBy rdf:resource="http://purl.obolibrary.org/obo/uberon.owl"/>
-        <rdfs:label rdf:datatype="http://www.w3.org/2001/XMLSchema#string">subdivision of organism along main body axis</rdfs:label>
-    </owl:Class>
-    
-
-
-    <!-- http://purl.obolibrary.org/obo/UBERON_0013701 -->
-
-    <owl:Class rdf:about="http://purl.obolibrary.org/obo/UBERON_0013701">
-        <rdfs:subClassOf rdf:resource="http://purl.obolibrary.org/obo/UBERON_0000475"/>
-        <obo:IAO_0000115 rdf:datatype="http://www.w3.org/2001/XMLSchema#string">A principle subdivision of an organism that includes all structures along the primary axis, typically the anterior-posterior axis, from head to tail, including structures of the body proper where present (for example, ribs), but excluding appendages.</obo:IAO_0000115>
-        <oboInOwl:hasOBONamespace rdf:datatype="http://www.w3.org/2001/XMLSchema#string">uberon</oboInOwl:hasOBONamespace>
-        <oboInOwl:id rdf:datatype="http://www.w3.org/2001/XMLSchema#string">UBERON:0013701</oboInOwl:id>
-        <rdfs:isDefinedBy rdf:resource="http://purl.obolibrary.org/obo/uberon.owl"/>
-        <rdfs:label rdf:datatype="http://www.w3.org/2001/XMLSchema#string">main body axis</rdfs:label>
-    </owl:Class>
-    
-
-
-    <!-- http://purl.obolibrary.org/obo/UBERON_0013702 -->
-
-    <owl:Class rdf:about="http://purl.obolibrary.org/obo/UBERON_0013702">
-        <rdfs:subClassOf rdf:resource="http://purl.obolibrary.org/obo/UBERON_0000475"/>
-        <rdfs:subClassOf>
-            <owl:Restriction>
-                <owl:onProperty rdf:resource="http://purl.obolibrary.org/obo/BFO_0000050"/>
-                <owl:someValuesFrom rdf:resource="http://purl.obolibrary.org/obo/UBERON_0013701"/>
-            </owl:Restriction>
-        </rdfs:subClassOf>
-        <obo:IAO_0000115 rdf:datatype="http://www.w3.org/2001/XMLSchema#string">The region of the organism associated with the visceral organs.</obo:IAO_0000115>
-        <obo:UBPROP_0000001 rdf:datatype="http://www.w3.org/2001/XMLSchema#string">Cardinal body part, which consists of a maximal set of diverse subclasses of organ and organ part spatially associated with the vertebral column and ribcage. Examples: There is only one body proper[FMA:231424].</obo:UBPROP_0000001>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">AEO:0000103</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">BTO:0001489</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">FMA:231424</oboInOwl:hasDbXref>
-        <oboInOwl:hasOBONamespace rdf:datatype="http://www.w3.org/2001/XMLSchema#string">uberon</oboInOwl:hasOBONamespace>
-        <oboInOwl:hasRelatedSynonym rdf:datatype="http://www.w3.org/2001/XMLSchema#string">body</oboInOwl:hasRelatedSynonym>
-        <oboInOwl:hasRelatedSynonym rdf:datatype="http://www.w3.org/2001/XMLSchema#string">whole body</oboInOwl:hasRelatedSynonym>
-        <oboInOwl:id rdf:datatype="http://www.w3.org/2001/XMLSchema#string">UBERON:0013702</oboInOwl:id>
-        <oboInOwl:inSubset rdf:resource="http://purl.obolibrary.org/obo/uberon/core#non_informative"/>
-        <rdfs:isDefinedBy rdf:resource="http://purl.obolibrary.org/obo/uberon.owl"/>
-        <rdfs:label rdf:datatype="http://www.w3.org/2001/XMLSchema#string">body proper</rdfs:label>
-    </owl:Class>
-</rdf:RDF>
-
-
-
-<!-- Generated by the OWL API (version 4.5.6) https://github.com/owlcs/owlapi -->
-
diff --git a/docs/examples/changed_source.owl b/docs/examples/changed_source.owl
deleted file mode 100644
index 5d6e7984..00000000
--- a/docs/examples/changed_source.owl
+++ /dev/null
@@ -1,534 +0,0 @@
-<?xml version="1.0"?>
-<rdf:RDF xmlns="https://github.com/ontodev/robot/examples/annotated.owl#"
-     xml:base="https://github.com/ontodev/robot/examples/annotated.owl"
-     xmlns:obo="http://purl.obolibrary.org/obo/"
-     xmlns:owl="http://www.w3.org/2002/07/owl#"
-     xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-     xmlns:xml="http://www.w3.org/XML/1998/namespace"
-     xmlns:xsd="http://www.w3.org/2001/XMLSchema#"
-     xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
-     xmlns:oboInOwl="http://www.geneontology.org/formats/oboInOwl#">
-    <owl:Ontology rdf:about="https://github.com/ontodev/robot/examples/annotated.owl"/>
-    
-
-
-    <!-- 
-    ///////////////////////////////////////////////////////////////////////////////////////
-    //
-    // Annotation properties
-    //
-    ///////////////////////////////////////////////////////////////////////////////////////
-     -->
-
-    
-
-
-    <!-- http://purl.obolibrary.org/obo/IAO_0000115 -->
-
-    <owl:AnnotationProperty rdf:about="http://purl.obolibrary.org/obo/IAO_0000115">
-        <rdfs:isDefinedBy rdf:resource="http://purl.obolibrary.org/obo/iao.owl"/>
-    </owl:AnnotationProperty>
-    
-
-
-    <!-- http://purl.obolibrary.org/obo/IAO_0000116 -->
-
-    <owl:AnnotationProperty rdf:about="http://purl.obolibrary.org/obo/IAO_0000116">
-        <rdfs:isDefinedBy rdf:resource="http://purl.obolibrary.org/obo/iao.owl"/>
-    </owl:AnnotationProperty>
-    
-
-
-    <!-- http://purl.obolibrary.org/obo/UBPROP_0000001 -->
-
-    <owl:AnnotationProperty rdf:about="http://purl.obolibrary.org/obo/UBPROP_0000001">
-        <rdfs:isDefinedBy rdf:resource="http://purl.obolibrary.org/obo/ubprop.owl"/>
-    </owl:AnnotationProperty>
-    
-
-
-    <!-- http://purl.obolibrary.org/obo/UBPROP_0000007 -->
-
-    <owl:AnnotationProperty rdf:about="http://purl.obolibrary.org/obo/UBPROP_0000007">
-        <rdfs:isDefinedBy rdf:resource="http://purl.obolibrary.org/obo/ubprop.owl"/>
-    </owl:AnnotationProperty>
-    
-
-
-    <!-- http://www.geneontology.org/formats/oboInOwl#hasDbXref -->
-
-    <owl:AnnotationProperty rdf:about="http://www.geneontology.org/formats/oboInOwl#hasDbXref">
-        <rdfs:isDefinedBy rdf:resource="http://www.geneontology.org/formats/oboinowl.owl"/>
-    </owl:AnnotationProperty>
-    
-
-
-    <!-- http://www.geneontology.org/formats/oboInOwl#hasExactSynonym -->
-
-    <owl:AnnotationProperty rdf:about="http://www.geneontology.org/formats/oboInOwl#hasExactSynonym">
-        <rdfs:isDefinedBy rdf:resource="http://www.geneontology.org/formats/oboinowl.owl"/>
-    </owl:AnnotationProperty>
-    
-
-
-    <!-- http://www.geneontology.org/formats/oboInOwl#hasOBONamespace -->
-
-    <owl:AnnotationProperty rdf:about="http://www.geneontology.org/formats/oboInOwl#hasOBONamespace">
-        <rdfs:isDefinedBy rdf:resource="http://www.geneontology.org/formats/oboinowl.owl"/>
-    </owl:AnnotationProperty>
-    
-
-
-    <!-- http://www.geneontology.org/formats/oboInOwl#hasRelatedSynonym -->
-
-    <owl:AnnotationProperty rdf:about="http://www.geneontology.org/formats/oboInOwl#hasRelatedSynonym">
-        <rdfs:isDefinedBy rdf:resource="http://www.geneontology.org/formats/oboinowl.owl"/>
-    </owl:AnnotationProperty>
-    
-
-
-    <!-- http://www.geneontology.org/formats/oboInOwl#id -->
-
-    <owl:AnnotationProperty rdf:about="http://www.geneontology.org/formats/oboInOwl#id">
-        <rdfs:isDefinedBy rdf:resource="http://www.geneontology.org/formats/oboinowl.owl"/>
-    </owl:AnnotationProperty>
-    
-
-
-    <!-- http://www.geneontology.org/formats/oboInOwl#inSubset -->
-
-    <owl:AnnotationProperty rdf:about="http://www.geneontology.org/formats/oboInOwl#inSubset">
-        <rdfs:isDefinedBy rdf:resource="http://www.geneontology.org/formats/oboinowl.owl"/>
-    </owl:AnnotationProperty>
-    
-
-
-    <!-- http://www.geneontology.org/formats/oboInOwl#shorthand -->
-
-    <owl:AnnotationProperty rdf:about="http://www.geneontology.org/formats/oboInOwl#shorthand">
-        <rdfs:isDefinedBy rdf:resource="http://www.geneontology.org/formats/oboinowl.owl"/>
-    </owl:AnnotationProperty>
-    
-
-
-    <!-- http://www.w3.org/2000/01/rdf-schema#label -->
-
-    <rdf:Description rdf:about="http://www.w3.org/2000/01/rdf-schema#label">
-        <rdfs:isDefinedBy rdf:resource="http://www.w3.org/2000/01/rdf-schema.owl"/>
-    </rdf:Description>
-    
-
-
-    <!-- 
-    ///////////////////////////////////////////////////////////////////////////////////////
-    //
-    // Datatypes
-    //
-    ///////////////////////////////////////////////////////////////////////////////////////
-     -->
-
-    
-
-
-    <!-- http://www.w3.org/2001/XMLSchema#string -->
-
-    <rdf:Description rdf:about="http://www.w3.org/2001/XMLSchema#string">
-        <rdfs:isDefinedBy rdf:resource="http://www.w3.org/2001/xmlschema.owl"/>
-    </rdf:Description>
-    
-
-
-    <!-- 
-    ///////////////////////////////////////////////////////////////////////////////////////
-    //
-    // Object Properties
-    //
-    ///////////////////////////////////////////////////////////////////////////////////////
-     -->
-
-    
-
-
-    <!-- http://purl.obolibrary.org/obo/BFO_0000050 -->
-
-    <owl:ObjectProperty rdf:about="http://purl.obolibrary.org/obo/BFO_0000050">
-        <rdf:type rdf:resource="http://www.w3.org/2002/07/owl#TransitiveProperty"/>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">BFO:0000050</oboInOwl:hasDbXref>
-        <oboInOwl:hasOBONamespace rdf:datatype="http://www.w3.org/2001/XMLSchema#string">uberon</oboInOwl:hasOBONamespace>
-        <oboInOwl:id rdf:datatype="http://www.w3.org/2001/XMLSchema#string">part_of</oboInOwl:id>
-        <oboInOwl:shorthand rdf:datatype="http://www.w3.org/2001/XMLSchema#string">part_of</oboInOwl:shorthand>
-        <rdfs:isDefinedBy rdf:resource="http://purl.obolibrary.org/obo/bfo.owl"/>
-        <rdfs:label rdf:datatype="http://www.w3.org/2001/XMLSchema#string">part_of</rdfs:label>
-    </owl:ObjectProperty>
-    
-
-
-    <!-- 
-    ///////////////////////////////////////////////////////////////////////////////////////
-    //
-    // Classes
-    //
-    ///////////////////////////////////////////////////////////////////////////////////////
-     -->
-
-    
-
-
-    <!-- http://purl.obolibrary.org/obo/UBERON_0000061 -->
-
-    <owl:Class rdf:about="http://purl.obolibrary.org/obo/UBERON_0000061">
-        <rdfs:subClassOf rdf:resource="http://purl.obolibrary.org/obo/UBERON_0000465"/>
-        <obo:IAO_0000115 rdf:datatype="http://www.w3.org/2001/XMLSchema#string">Material anatomical entity that has inherent 3D shape and is generated by coordinated expression of the organism&apos;s own genome.</obo:IAO_0000115>
-        <oboInOwl:hasDbXref rdf:resource="http://dbpedia.org/ontology/AnatomicalStructure"/>
-        <oboInOwl:hasDbXref rdf:resource="http://www.snomedbrowser.com/Codes/Details/362889002"/>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">AAO:0010825</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">AEO:0000003</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">BILA:0000003</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">CARO:0000003</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">EHDAA2:0003003</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">EMAPA:0</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">FBbt:00007001</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">FMA:67135</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">GAID:781</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">HAO:0000003</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">MA:0003000</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">MESH:A13</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">TAO:0000037</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">TGMA:0001823</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">VHOG:0001759</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">WBbt:0000100</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">XAO:0003000</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">ZFA:0000037</oboInOwl:hasDbXref>
-        <oboInOwl:hasExactSynonym rdf:datatype="http://www.w3.org/2001/XMLSchema#string">biological structure</oboInOwl:hasExactSynonym>
-        <oboInOwl:hasOBONamespace rdf:datatype="http://www.w3.org/2001/XMLSchema#string">uberon</oboInOwl:hasOBONamespace>
-        <oboInOwl:id rdf:datatype="http://www.w3.org/2001/XMLSchema#string">UBERON:0000061</oboInOwl:id>
-        <oboInOwl:inSubset rdf:resource="http://purl.obolibrary.org/obo/uberon/core#upper_level"/>
-        <rdfs:isDefinedBy rdf:resource="http://purl.obolibrary.org/obo/uberon.owl"/>
-        <rdfs:label rdf:datatype="http://www.w3.org/2001/XMLSchema#string">anatomical structure</rdfs:label>
-    </owl:Class>
-    
-
-
-    <!-- http://purl.obolibrary.org/obo/UBERON_0000465 -->
-
-    <owl:Class rdf:about="http://purl.obolibrary.org/obo/UBERON_0000465">
-        <rdfs:subClassOf rdf:resource="http://purl.obolibrary.org/obo/UBERON_0001062"/>
-        <obo:IAO_0000115 rdf:datatype="http://www.w3.org/2001/XMLSchema#string">Anatomical entity that has mass.</obo:IAO_0000115>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">AAO:0010264</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">AEO:0000006</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">BILA:0000006</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">CARO:0000006</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">EHDAA2:0003006</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">FBbt:00007016</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">FMA:67165</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">HAO:0000006</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">TAO:0001836</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">TGMA:0001826</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">VHOG:0001721</oboInOwl:hasDbXref>
-        <oboInOwl:hasOBONamespace rdf:datatype="http://www.w3.org/2001/XMLSchema#string">uberon</oboInOwl:hasOBONamespace>
-        <oboInOwl:id rdf:datatype="http://www.w3.org/2001/XMLSchema#string">UBERON:0000465</oboInOwl:id>
-        <oboInOwl:inSubset rdf:resource="http://purl.obolibrary.org/obo/uberon/core#upper_level"/>
-        <rdfs:isDefinedBy rdf:resource="http://purl.obolibrary.org/obo/uberon.owl"/>
-        <rdfs:label rdf:datatype="http://www.w3.org/2001/XMLSchema#string">material anatomical entity</rdfs:label>
-    </owl:Class>
-    
-
-
-    <!-- http://purl.obolibrary.org/obo/UBERON_0000475 -->
-
-    <owl:Class rdf:about="http://purl.obolibrary.org/obo/UBERON_0000475">
-        <rdfs:subClassOf rdf:resource="http://purl.obolibrary.org/obo/UBERON_0010000"/>
-        <obo:IAO_0000115 rdf:datatype="http://www.w3.org/2001/XMLSchema#string">Anatomical structure which is a subdivision of a whole organism, consisting of components of multiple anatomical systems, largely surrounded by a contiguous region of integument.</obo:IAO_0000115>
-        <obo:IAO_0000116 rdf:datatype="http://www.w3.org/2001/XMLSchema#string">Reflects CARO2. todo - check the inclusion of FMA &apos;cardinal body part here&apos;, and check child terms for consistency</obo:IAO_0000116>
-        <oboInOwl:hasDbXref rdf:resource="http://en.wikipedia.org/wiki/Body_part"/>
-        <oboInOwl:hasDbXref rdf:resource="http://linkedlifedata.com/resource/umls/id/C0229962"/>
-        <oboInOwl:hasDbXref rdf:resource="http://ncicb.nci.nih.gov/xml/owl/EVS/Body_Part"/>
-        <oboInOwl:hasDbXref rdf:resource="http://uri.neuinfo.org/nif/nifstd/birnlex_7"/>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">AAO:0010053</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">AEO:0000032</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">BILA:0000032</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">CALOHA:TS-2084</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">CARO:0000032</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">EFO:0000808</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">EHDAA2:0003032</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">FBbt:00007009</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">FMA:7153</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">HAO:0000032</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">MA:0002433</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">MAT:0000293</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">MESH:A01</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">MIAA:0000293</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">OpenCyc:Mx4rvViAHJwpEbGdrcN5Y29ycA</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">TAO:0001308</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">TGMA:0001840</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">UMLS:C0229962</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">VHOG:0001758</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">XAO:0003013</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">ZFA:0001308</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">galen:BodyPart</oboInOwl:hasDbXref>
-        <oboInOwl:hasExactSynonym rdf:datatype="http://www.w3.org/2001/XMLSchema#string">anatomic region</oboInOwl:hasExactSynonym>
-        <oboInOwl:hasOBONamespace rdf:datatype="http://www.w3.org/2001/XMLSchema#string">uberon</oboInOwl:hasOBONamespace>
-        <oboInOwl:hasRelatedSynonym rdf:datatype="http://www.w3.org/2001/XMLSchema#string">body part</oboInOwl:hasRelatedSynonym>
-        <oboInOwl:hasRelatedSynonym rdf:datatype="http://www.w3.org/2001/XMLSchema#string">body region</oboInOwl:hasRelatedSynonym>
-        <oboInOwl:hasRelatedSynonym rdf:datatype="http://www.w3.org/2001/XMLSchema#string">cardinal body part</oboInOwl:hasRelatedSynonym>
-        <oboInOwl:id rdf:datatype="http://www.w3.org/2001/XMLSchema#string">UBERON:0000475</oboInOwl:id>
-        <oboInOwl:inSubset rdf:resource="http://purl.obolibrary.org/obo/uberon/core#efo_slim"/>
-        <oboInOwl:inSubset rdf:resource="http://purl.obolibrary.org/obo/uberon/core#uberon_slim"/>
-        <oboInOwl:inSubset rdf:resource="http://purl.obolibrary.org/obo/uberon/core#upper_level"/>
-        <rdfs:isDefinedBy rdf:resource="http://purl.obolibrary.org/obo/uberon.owl"/>
-        <rdfs:label rdf:datatype="http://www.w3.org/2001/XMLSchema#string">organism subdivision</rdfs:label>
-    </owl:Class>
-    
-
-
-    <!-- http://purl.obolibrary.org/obo/UBERON_0000916 -->
-
-    <owl:Class rdf:about="http://purl.obolibrary.org/obo/UBERON_0000916">
-        <rdfs:subClassOf rdf:resource="http://purl.obolibrary.org/obo/UBERON_0009569"/>
-        <rdfs:subClassOf>
-            <owl:Restriction>
-                <owl:onProperty rdf:resource="http://purl.obolibrary.org/obo/BFO_0000050"/>
-                <owl:someValuesFrom rdf:resource="http://purl.obolibrary.org/obo/UBERON_0002417"/>
-            </owl:Restriction>
-        </rdfs:subClassOf>
-        <obo:IAO_0000115 rdf:datatype="http://www.w3.org/2001/XMLSchema#string">The subdivision of the vertebrate body between the thorax and pelvis. The ventral part of the abdomen contains the abdominal cavity and visceral organs. The dorsal part includes the abdominal section of the vertebral column.</obo:IAO_0000115>
-        <obo:IAO_0000116 rdf:datatype="http://www.w3.org/2001/XMLSchema#string">Vertebrate specific. In arthropods &apos;abdomen&apos; is the most distal section of the body which lies behind the thorax or cephalothorax. If need be we can introduce some grouping class</obo:IAO_0000116>
-        <obo:UBPROP_0000007 rdf:datatype="http://www.w3.org/2001/XMLSchema#string">abdominal</obo:UBPROP_0000007>
-        <oboInOwl:hasDbXref rdf:resource="http://en.wikipedia.org/wiki/Abdomen"/>
-        <oboInOwl:hasDbXref rdf:resource="http://www.snomedbrowser.com/Codes/Details/302553009"/>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">BTO:0000020</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">CALOHA:TS-0001</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">EFO:0000968</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">EMAPA:35102</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">EV:0100011</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">FMA:9577</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">GAID:16</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">MA:0000029</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">MAT:0000298</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">MESH:A01.047</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">MIAA:0000298</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">OpenCyc:Mx4rvVjgyZwpEbGdrcN5Y29ycA</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">galen:Abdomen</oboInOwl:hasDbXref>
-        <oboInOwl:hasExactSynonym rdf:datatype="http://www.w3.org/2001/XMLSchema#string">abdominopelvic region</oboInOwl:hasExactSynonym>
-        <oboInOwl:hasExactSynonym rdf:datatype="http://www.w3.org/2001/XMLSchema#string">abdominopelvis</oboInOwl:hasExactSynonym>
-        <oboInOwl:hasOBONamespace rdf:datatype="http://www.w3.org/2001/XMLSchema#string">uberon</oboInOwl:hasOBONamespace>
-        <oboInOwl:hasRelatedSynonym rdf:datatype="http://www.w3.org/2001/XMLSchema#string">adult abdomen</oboInOwl:hasRelatedSynonym>
-        <oboInOwl:hasRelatedSynonym rdf:datatype="http://www.w3.org/2001/XMLSchema#string">belly</oboInOwl:hasRelatedSynonym>
-        <oboInOwl:hasRelatedSynonym rdf:datatype="http://www.w3.org/2001/XMLSchema#string">celiac region</oboInOwl:hasRelatedSynonym>
-        <oboInOwl:id rdf:datatype="http://www.w3.org/2001/XMLSchema#string">UBERON:0000916</oboInOwl:id>
-        <oboInOwl:inSubset rdf:resource="http://purl.obolibrary.org/obo/uberon/core#efo_slim"/>
-        <oboInOwl:inSubset rdf:resource="http://purl.obolibrary.org/obo/uberon/core#uberon_slim"/>
-        <rdfs:isDefinedBy rdf:resource="http://purl.obolibrary.org/obo/go.owl"/>
-        <rdfs:label rdf:datatype="http://www.w3.org/2001/XMLSchema#string">abdomen</rdfs:label>
-    </owl:Class>
-    
-
-
-    <!-- http://purl.obolibrary.org/obo/UBERON_0001062 -->
-
-    <owl:Class rdf:about="http://purl.obolibrary.org/obo/UBERON_0001062">
-        <obo:IAO_0000115 rdf:datatype="http://www.w3.org/2001/XMLSchema#string">Biological entity that is either an individual member of a biological species or constitutes the structural organization of an individual member of a biological species.</obo:IAO_0000115>
-        <oboInOwl:hasDbXref rdf:resource="http://linkedlifedata.com/resource/umls/id/C1515976"/>
-        <oboInOwl:hasDbXref rdf:resource="http://ncicb.nci.nih.gov/xml/owl/EVS/Anatomic_Structure_System_or_Substance"/>
-        <oboInOwl:hasDbXref rdf:resource="http://uri.neuinfo.org/nif/nifstd/birnlex_6"/>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">AAO:0010841</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">AEO:0000000</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">BILA:0000000</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">CARO:0000000</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">EHDAA2:0002229</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">FBbt:10000000</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">FBbt_root:00000000</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">FMA:62955</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">HAO:0000000</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">MA:0000001</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">TAO:0100000</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">TGMA:0001822</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">UMLS:C1515976</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">XAO:0000000</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">ZFA:0100000</oboInOwl:hasDbXref>
-        <oboInOwl:hasOBONamespace rdf:datatype="http://www.w3.org/2001/XMLSchema#string">uberon</oboInOwl:hasOBONamespace>
-        <oboInOwl:id rdf:datatype="http://www.w3.org/2001/XMLSchema#string">UBERON:0001062</oboInOwl:id>
-        <oboInOwl:inSubset rdf:resource="http://purl.obolibrary.org/obo/uberon/core#upper_level"/>
-        <rdfs:isDefinedBy rdf:resource="http://purl.obolibrary.org/obo/go.owl"/>
-        <rdfs:label rdf:datatype="http://www.w3.org/2001/XMLSchema#string">anatomical entity</rdfs:label>
-    </owl:Class>
-    
-
-
-    <!-- http://purl.obolibrary.org/obo/UBERON_0002100 -->
-
-    <owl:Class rdf:about="http://purl.obolibrary.org/obo/UBERON_0002100">
-        <rdfs:subClassOf rdf:resource="http://purl.obolibrary.org/obo/UBERON_0011676"/>
-        <rdfs:subClassOf>
-            <owl:Restriction>
-                <owl:onProperty rdf:resource="http://purl.obolibrary.org/obo/BFO_0000050"/>
-                <owl:someValuesFrom rdf:resource="http://purl.obolibrary.org/obo/UBERON_0013702"/>
-            </owl:Restriction>
-        </rdfs:subClassOf>
-        <obo:IAO_0000115 rdf:datatype="http://www.w3.org/2001/XMLSchema#string">Organism subdivision which is the part of the body posterior to the cervical region (or head, when cervical region not present) and anterior to the caudal region. Includes the sacrum when present.</obo:IAO_0000115>
-        <obo:UBPROP_0000001 rdf:datatype="http://www.w3.org/2001/XMLSchema#string">Organism subdivision that is the part of the body posterior to the head and anterior to the tail.[AAO]</obo:UBPROP_0000001>
-        <obo:UBPROP_0000001 rdf:datatype="http://www.w3.org/2001/XMLSchema#string">Organism subdivision which is the part of the body posterior to the head and anterior to the tail.[TAO]</obo:UBPROP_0000001>
-        <oboInOwl:hasDbXref rdf:resource="http://en.wikipedia.org/wiki/Torso"/>
-        <oboInOwl:hasDbXref rdf:resource="http://linkedlifedata.com/resource/umls/id/C0460005"/>
-        <oboInOwl:hasDbXref rdf:resource="http://ncicb.nci.nih.gov/xml/owl/EVS/Trunk"/>
-        <oboInOwl:hasDbXref rdf:resource="http://www.snomedbrowser.com/Codes/Details/262225004"/>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">AAO:0010339</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">BILA:0000116</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">BTO:0001493</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">CALOHA:TS-1071</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">EFO:0000966</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">EMAPA:31857</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">FMA:7181</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">MA:0000004</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">MAT:0000296</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">MIAA:0000296</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">OpenCyc:Mx4rvVkJjpwpEbGdrcN5Y29ycA</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">TAO:0001115</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">UMLS:C0460005</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">XAO:0000054</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">XAO:0003025</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">ZFA:0001115</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">galen:Trunk</oboInOwl:hasDbXref>
-        <oboInOwl:hasExactSynonym rdf:datatype="http://www.w3.org/2001/XMLSchema#string">thoracolumbar region</oboInOwl:hasExactSynonym>
-        <oboInOwl:hasExactSynonym rdf:datatype="http://www.w3.org/2001/XMLSchema#string">torso</oboInOwl:hasExactSynonym>
-        <oboInOwl:hasExactSynonym rdf:datatype="http://www.w3.org/2001/XMLSchema#string">trunk region</oboInOwl:hasExactSynonym>
-        <oboInOwl:hasOBONamespace rdf:datatype="http://www.w3.org/2001/XMLSchema#string">uberon</oboInOwl:hasOBONamespace>
-        <oboInOwl:hasRelatedSynonym rdf:datatype="http://www.w3.org/2001/XMLSchema#string">Rumpf</oboInOwl:hasRelatedSynonym>
-        <oboInOwl:id rdf:datatype="http://www.w3.org/2001/XMLSchema#string">UBERON:0002100</oboInOwl:id>
-        <oboInOwl:inSubset rdf:resource="http://purl.obolibrary.org/obo/uberon/core#efo_slim"/>
-        <oboInOwl:inSubset rdf:resource="http://purl.obolibrary.org/obo/uberon/core#uberon_slim"/>
-        <oboInOwl:inSubset rdf:resource="http://purl.obolibrary.org/obo/uberon/core#vertebrate_core"/>
-        <rdfs:isDefinedBy rdf:resource="http://purl.obolibrary.org/obo/uberon.owl"/>
-        <rdfs:label rdf:datatype="http://www.w3.org/2001/XMLSchema#string">trunk</rdfs:label>
-    </owl:Class>
-    
-
-
-    <!-- http://purl.obolibrary.org/obo/UBERON_0002417 -->
-
-    <owl:Class rdf:about="http://purl.obolibrary.org/obo/UBERON_0002417">
-        <rdfs:subClassOf rdf:resource="http://purl.obolibrary.org/obo/UBERON_0009569"/>
-        <rdfs:subClassOf rdf:resource="http://purl.obolibrary.org/obo/UBERON_0011676"/>
-        <obo:IAO_0000115 rdf:datatype="http://www.w3.org/2001/XMLSchema#string">The abdominal segment of the torso.</obo:IAO_0000115>
-        <oboInOwl:hasDbXref rdf:resource="http://en.wikipedia.org/wiki/Lumbar"/>
-        <oboInOwl:hasDbXref rdf:resource="http://www.snomedbrowser.com/Codes/Details/362875007"/>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">EMAPA:35104</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">FMA:259211</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">MA:0000021</oboInOwl:hasDbXref>
-        <oboInOwl:hasOBONamespace rdf:datatype="http://www.w3.org/2001/XMLSchema#string">uberon</oboInOwl:hasOBONamespace>
-        <oboInOwl:hasRelatedSynonym rdf:datatype="http://www.w3.org/2001/XMLSchema#string">abdomen/pelvis/perineum</oboInOwl:hasRelatedSynonym>
-        <oboInOwl:hasRelatedSynonym rdf:datatype="http://www.w3.org/2001/XMLSchema#string">lower body</oboInOwl:hasRelatedSynonym>
-        <oboInOwl:hasRelatedSynonym rdf:datatype="http://www.w3.org/2001/XMLSchema#string">lumbar region</oboInOwl:hasRelatedSynonym>
-        <oboInOwl:id rdf:datatype="http://www.w3.org/2001/XMLSchema#string">UBERON:0002417</oboInOwl:id>
-        <rdfs:isDefinedBy rdf:resource="http://purl.obolibrary.org/obo/uberon.owl"/>
-        <rdfs:label rdf:datatype="http://www.w3.org/2001/XMLSchema#string">abdominal segment of trunk</rdfs:label>
-    </owl:Class>
-    
-
-
-    <!-- http://purl.obolibrary.org/obo/UBERON_0009569 -->
-
-    <owl:Class rdf:about="http://purl.obolibrary.org/obo/UBERON_0009569">
-        <rdfs:subClassOf rdf:resource="http://purl.obolibrary.org/obo/UBERON_0000475"/>
-        <rdfs:subClassOf>
-            <owl:Restriction>
-                <owl:onProperty rdf:resource="http://purl.obolibrary.org/obo/BFO_0000050"/>
-                <owl:someValuesFrom rdf:resource="http://purl.obolibrary.org/obo/UBERON_0002100"/>
-            </owl:Restriction>
-        </rdfs:subClassOf>
-        <oboInOwl:hasDbXref rdf:resource="http://www.snomedbrowser.com/Codes/Details/22943007"/>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">FMA:25054</oboInOwl:hasDbXref>
-        <oboInOwl:hasExactSynonym rdf:datatype="http://www.w3.org/2001/XMLSchema#string">region of trunk</oboInOwl:hasExactSynonym>
-        <oboInOwl:hasExactSynonym rdf:datatype="http://www.w3.org/2001/XMLSchema#string">trunk subdivision</oboInOwl:hasExactSynonym>
-        <oboInOwl:hasOBONamespace rdf:datatype="http://www.w3.org/2001/XMLSchema#string">uberon</oboInOwl:hasOBONamespace>
-        <oboInOwl:id rdf:datatype="http://www.w3.org/2001/XMLSchema#string">UBERON:0009569</oboInOwl:id>
-        <oboInOwl:inSubset rdf:resource="http://purl.obolibrary.org/obo/uberon/core#non_informative"/>
-        <rdfs:isDefinedBy rdf:resource="http://purl.obolibrary.org/obo/uberon.owl"/>
-        <rdfs:label rdf:datatype="http://www.w3.org/2001/XMLSchema#string">subdivision of trunk</rdfs:label>
-    </owl:Class>
-    
-
-
-    <!-- http://purl.obolibrary.org/obo/UBERON_0010000 -->
-
-    <owl:Class rdf:about="http://purl.obolibrary.org/obo/UBERON_0010000">
-        <rdfs:subClassOf rdf:resource="http://purl.obolibrary.org/obo/UBERON_0000061"/>
-        <obo:IAO_0000115 rdf:datatype="http://www.w3.org/2001/XMLSchema#string">An anatomical structure that has more than one cell as a part.</obo:IAO_0000115>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">CARO:0010000</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">FBbt:00100313</oboInOwl:hasDbXref>
-        <oboInOwl:hasExactSynonym rdf:datatype="http://www.w3.org/2001/XMLSchema#string">multicellular structure</oboInOwl:hasExactSynonym>
-        <oboInOwl:hasOBONamespace rdf:datatype="http://www.w3.org/2001/XMLSchema#string">uberon</oboInOwl:hasOBONamespace>
-        <oboInOwl:id rdf:datatype="http://www.w3.org/2001/XMLSchema#string">UBERON:0010000</oboInOwl:id>
-        <oboInOwl:inSubset rdf:resource="http://purl.obolibrary.org/obo/uberon/core#upper_level"/>
-        <rdfs:isDefinedBy rdf:resource="http://purl.obolibrary.org/obo/uberon.owl"/>
-        <rdfs:label rdf:datatype="http://www.w3.org/2001/XMLSchema#string">multicellular anatomical structure</rdfs:label>
-    </owl:Class>
-    
-
-
-    <!-- http://purl.obolibrary.org/obo/UBERON_0011676 -->
-
-    <owl:Class rdf:about="http://purl.obolibrary.org/obo/UBERON_0011676">
-        <rdfs:subClassOf rdf:resource="http://purl.obolibrary.org/obo/UBERON_0000475"/>
-        <rdfs:subClassOf>
-            <owl:Restriction>
-                <owl:onProperty rdf:resource="http://purl.obolibrary.org/obo/BFO_0000050"/>
-                <owl:someValuesFrom rdf:resource="http://purl.obolibrary.org/obo/UBERON_0013701"/>
-            </owl:Restriction>
-        </rdfs:subClassOf>
-        <obo:IAO_0000115 rdf:datatype="http://www.w3.org/2001/XMLSchema#string">A major subdivision of an organism that divides an organism along its main body axis (typically anterio-posterior axis). In vertebrates, this is based on the vertebral column.</obo:IAO_0000115>
-        <obo:IAO_0000116 rdf:datatype="http://www.w3.org/2001/XMLSchema#string">Ideally this would be disjoint with analagous class for appendicular axes, but currently &apos;appendages&apos; like antennae, horns cause a problem</obo:IAO_0000116>
-        <oboInOwl:hasExactSynonym rdf:datatype="http://www.w3.org/2001/XMLSchema#string">axial subdivision of organism</oboInOwl:hasExactSynonym>
-        <oboInOwl:hasOBONamespace rdf:datatype="http://www.w3.org/2001/XMLSchema#string">uberon</oboInOwl:hasOBONamespace>
-        <oboInOwl:hasRelatedSynonym rdf:datatype="http://www.w3.org/2001/XMLSchema#string">body segment</oboInOwl:hasRelatedSynonym>
-        <oboInOwl:hasRelatedSynonym rdf:datatype="http://www.w3.org/2001/XMLSchema#string">main body segment</oboInOwl:hasRelatedSynonym>
-        <oboInOwl:id rdf:datatype="http://www.w3.org/2001/XMLSchema#string">UBERON:0011676</oboInOwl:id>
-        <oboInOwl:inSubset rdf:resource="http://purl.obolibrary.org/obo/uberon/core#upper_level"/>
-        <rdfs:isDefinedBy rdf:resource="http://purl.obolibrary.org/obo/uberon.owl"/>
-        <rdfs:label rdf:datatype="http://www.w3.org/2001/XMLSchema#string">subdivision of organism along main body axis</rdfs:label>
-    </owl:Class>
-    
-
-
-    <!-- http://purl.obolibrary.org/obo/UBERON_0013701 -->
-
-    <owl:Class rdf:about="http://purl.obolibrary.org/obo/UBERON_0013701">
-        <rdfs:subClassOf rdf:resource="http://purl.obolibrary.org/obo/UBERON_0000475"/>
-        <obo:IAO_0000115 rdf:datatype="http://www.w3.org/2001/XMLSchema#string">A principle subdivision of an organism that includes all structures along the primary axis, typically the anterior-posterior axis, from head to tail, including structures of the body proper where present (for example, ribs), but excluding appendages.</obo:IAO_0000115>
-        <oboInOwl:hasOBONamespace rdf:datatype="http://www.w3.org/2001/XMLSchema#string">uberon</oboInOwl:hasOBONamespace>
-        <oboInOwl:id rdf:datatype="http://www.w3.org/2001/XMLSchema#string">UBERON:0013701</oboInOwl:id>
-        <rdfs:isDefinedBy rdf:resource="http://purl.obolibrary.org/obo/uberon.owl"/>
-        <rdfs:label rdf:datatype="http://www.w3.org/2001/XMLSchema#string">main body axis</rdfs:label>
-    </owl:Class>
-    
-
-
-    <!-- http://purl.obolibrary.org/obo/UBERON_0013702 -->
-
-    <owl:Class rdf:about="http://purl.obolibrary.org/obo/UBERON_0013702">
-        <rdfs:subClassOf rdf:resource="http://purl.obolibrary.org/obo/UBERON_0000475"/>
-        <rdfs:subClassOf>
-            <owl:Restriction>
-                <owl:onProperty rdf:resource="http://purl.obolibrary.org/obo/BFO_0000050"/>
-                <owl:someValuesFrom rdf:resource="http://purl.obolibrary.org/obo/UBERON_0013701"/>
-            </owl:Restriction>
-        </rdfs:subClassOf>
-        <obo:IAO_0000115 rdf:datatype="http://www.w3.org/2001/XMLSchema#string">The region of the organism associated with the visceral organs.</obo:IAO_0000115>
-        <obo:UBPROP_0000001 rdf:datatype="http://www.w3.org/2001/XMLSchema#string">Cardinal body part, which consists of a maximal set of diverse subclasses of organ and organ part spatially associated with the vertebral column and ribcage. Examples: There is only one body proper[FMA:231424].</obo:UBPROP_0000001>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">AEO:0000103</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">BTO:0001489</oboInOwl:hasDbXref>
-        <oboInOwl:hasDbXref rdf:datatype="http://www.w3.org/2001/XMLSchema#string">FMA:231424</oboInOwl:hasDbXref>
-        <oboInOwl:hasOBONamespace rdf:datatype="http://www.w3.org/2001/XMLSchema#string">uberon</oboInOwl:hasOBONamespace>
-        <oboInOwl:hasRelatedSynonym rdf:datatype="http://www.w3.org/2001/XMLSchema#string">body</oboInOwl:hasRelatedSynonym>
-        <oboInOwl:hasRelatedSynonym rdf:datatype="http://www.w3.org/2001/XMLSchema#string">whole body</oboInOwl:hasRelatedSynonym>
-        <oboInOwl:id rdf:datatype="http://www.w3.org/2001/XMLSchema#string">UBERON:0013702</oboInOwl:id>
-        <oboInOwl:inSubset rdf:resource="http://purl.obolibrary.org/obo/uberon/core#non_informative"/>
-        <rdfs:isDefinedBy rdf:resource="http://purl.obolibrary.org/obo/uberon.owl"/>
-        <rdfs:label rdf:datatype="http://www.w3.org/2001/XMLSchema#string">body proper</rdfs:label>
-    </owl:Class>
-</rdf:RDF>
-
-
-
-<!-- Generated by the OWL API (version 4.5.6) https://github.com/owlcs/owlapi -->
-
diff --git a/docs/examples/nucleus.owl b/docs/examples/nucleus.owl
index 36fef3ad..a84138cd 100644
--- a/docs/examples/nucleus.owl
+++ b/docs/examples/nucleus.owl
@@ -24,7 +24,7 @@ ObjectProperty: <http://purl.obolibrary.org/obo/BFO_0000050>
 Class: <http://purl.obolibrary.org/obo/GO_0005623>
 
     Annotations: 
-        rdfs:label "cell"
+        rdfs:label "cell"^^xsd:string
     
     SubClassOf: 
         <http://purl.obolibrary.org/obo/GO_0005575>
@@ -33,7 +33,7 @@ Class: <http://purl.obolibrary.org/obo/GO_0005623>
 Class: <http://purl.obolibrary.org/obo/GO_0043229>
 
     Annotations: 
-        rdfs:label "intracellular organelle"
+        rdfs:label "intracellular organelle"^^xsd:string
     
     SubClassOf: 
         <http://purl.obolibrary.org/obo/BFO_0000050> some <http://purl.obolibrary.org/obo/GO_0005622>,
@@ -44,7 +44,7 @@ Class: <http://purl.obolibrary.org/obo/GO_0043229>
 Class: <http://purl.obolibrary.org/obo/GO_0044464>
 
     Annotations: 
-        rdfs:label "cell part"
+        rdfs:label "cell part"^^xsd:string
     
     SubClassOf: 
         <http://purl.obolibrary.org/obo/BFO_0000050> some <http://purl.obolibrary.org/obo/GO_0005623>,
@@ -54,7 +54,7 @@ Class: <http://purl.obolibrary.org/obo/GO_0044464>
 Class: <http://purl.obolibrary.org/obo/GO_0043226>
 
     Annotations: 
-        rdfs:label "organelle"
+        rdfs:label "organelle"^^xsd:string
     
     SubClassOf: 
         <http://purl.obolibrary.org/obo/GO_0005575>
@@ -63,7 +63,7 @@ Class: <http://purl.obolibrary.org/obo/GO_0043226>
 Class: <http://purl.obolibrary.org/obo/GO_0044428>
 
     Annotations: 
-        rdfs:label "nuclear part"
+        rdfs:label "nuclear part"^^xsd:string
     
     SubClassOf: 
         <http://purl.obolibrary.org/obo/BFO_0000050> some <http://purl.obolibrary.org/obo/GO_0005634>,
@@ -73,7 +73,7 @@ Class: <http://purl.obolibrary.org/obo/GO_0044428>
 Class: <http://purl.obolibrary.org/obo/GO_0043227>
 
     Annotations: 
-        rdfs:label "membrane-bounded organelle"
+        rdfs:label "membrane-bounded organelle"^^xsd:string
     
     SubClassOf: 
         <http://purl.obolibrary.org/obo/GO_0043226>
@@ -82,13 +82,13 @@ Class: <http://purl.obolibrary.org/obo/GO_0043227>
 Class: <http://purl.obolibrary.org/obo/GO_0005575>
 
     Annotations: 
-        rdfs:label "cellular_component"
+        rdfs:label "cellular_component"^^xsd:string
     
     
 Class: <http://purl.obolibrary.org/obo/GO_0044424>
 
     Annotations: 
-        rdfs:label "intracellular part"
+        rdfs:label "intracellular part"^^xsd:string
     
     SubClassOf: 
         <http://purl.obolibrary.org/obo/BFO_0000050> some <http://purl.obolibrary.org/obo/GO_0005622>,
@@ -98,7 +98,7 @@ Class: <http://purl.obolibrary.org/obo/GO_0044424>
 Class: <http://purl.obolibrary.org/obo/GO_0005622>
 
     Annotations: 
-        rdfs:label "intracellular"
+        rdfs:label "intracellular"^^xsd:string
     
     SubClassOf: 
         <http://purl.obolibrary.org/obo/GO_0044464>
@@ -107,7 +107,7 @@ Class: <http://purl.obolibrary.org/obo/GO_0005622>
 Class: <http://purl.obolibrary.org/obo/GO_0044422>
 
     Annotations: 
-        rdfs:label "organelle part"
+        rdfs:label "organelle part"^^xsd:string
     
     SubClassOf: 
         <http://purl.obolibrary.org/obo/BFO_0000050> some <http://purl.obolibrary.org/obo/GO_0043226>,
@@ -117,7 +117,7 @@ Class: <http://purl.obolibrary.org/obo/GO_0044422>
 Class: <http://purl.obolibrary.org/obo/GO_0031974>
 
     Annotations: 
-        rdfs:label "membrane-enclosed lumen"
+        rdfs:label "membrane-enclosed lumen"^^xsd:string
     
     SubClassOf: 
         <http://purl.obolibrary.org/obo/GO_0005575>
@@ -126,7 +126,7 @@ Class: <http://purl.obolibrary.org/obo/GO_0031974>
 Class: <http://purl.obolibrary.org/obo/GO_0005634>
 
     Annotations: 
-        rdfs:label "nucleus"
+        rdfs:label "nucleus"^^xsd:string
     
     SubClassOf: 
         <http://purl.obolibrary.org/obo/GO_0043231>
@@ -135,7 +135,7 @@ Class: <http://purl.obolibrary.org/obo/GO_0005634>
 Class: <http://purl.obolibrary.org/obo/GO_0044446>
 
     Annotations: 
-        rdfs:label "intracellular organelle part"
+        rdfs:label "intracellular organelle part"^^xsd:string
     
     SubClassOf: 
         <http://purl.obolibrary.org/obo/BFO_0000050> some <http://purl.obolibrary.org/obo/GO_0005622>,
@@ -148,7 +148,7 @@ Class: <http://purl.obolibrary.org/obo/GO_0044446>
 Class: <http://purl.obolibrary.org/obo/GO_0070013>
 
     Annotations: 
-        rdfs:label "intracellular organelle lumen"
+        rdfs:label "intracellular organelle lumen"^^xsd:string
     
     SubClassOf: 
         <http://purl.obolibrary.org/obo/GO_0043233>,
@@ -159,7 +159,7 @@ Class: <http://purl.obolibrary.org/obo/GO_0070013>
 Class: <http://purl.obolibrary.org/obo/GO_0043231>
 
     Annotations: 
-        rdfs:label "intracellular membrane-bounded organelle"
+        rdfs:label "intracellular membrane-bounded organelle"^^xsd:string
     
     SubClassOf: 
         <http://purl.obolibrary.org/obo/GO_0043227>,
@@ -169,7 +169,7 @@ Class: <http://purl.obolibrary.org/obo/GO_0043231>
 Class: <http://purl.obolibrary.org/obo/GO_0031981>
 
     Annotations: 
-        rdfs:label "nuclear lumen"
+        rdfs:label "nuclear lumen"^^xsd:string
     
     SubClassOf: 
         <http://purl.obolibrary.org/obo/BFO_0000050> some <http://purl.obolibrary.org/obo/GO_0005634>,
@@ -180,7 +180,7 @@ Class: <http://purl.obolibrary.org/obo/GO_0031981>
 Class: <http://purl.obolibrary.org/obo/GO_0043233>
 
     Annotations: 
-        rdfs:label "organelle lumen"
+        rdfs:label "organelle lumen"^^xsd:string
     
     SubClassOf: 
         <http://purl.obolibrary.org/obo/GO_0031974>,
diff --git a/docs/examples/nucleus_update.owl b/docs/examples/nucleus_update.owl
deleted file mode 100644
index afa6adfc..00000000
--- a/docs/examples/nucleus_update.owl
+++ /dev/null
@@ -1,296 +0,0 @@
-<?xml version="1.0"?>
-<rdf:RDF xmlns="http://purl.obolibrary.org/obo/go.owl#"
-     xml:base="http://purl.obolibrary.org/obo/go.owl"
-     xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-     xmlns:owl="http://www.w3.org/2002/07/owl#"
-     xmlns:xml="http://www.w3.org/XML/1998/namespace"
-     xmlns:xsd="http://www.w3.org/2001/XMLSchema#"
-     xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#">
-    <owl:Ontology rdf:about="http://purl.obolibrary.org/obo/go.owl"/>
-    
-
-
-    <!-- 
-    ///////////////////////////////////////////////////////////////////////////////////////
-    //
-    // Annotation properties
-    //
-    ///////////////////////////////////////////////////////////////////////////////////////
-     -->
-
-    
-
-
-    <!-- http://www.w3.org/2000/01/rdf-schema#label -->
-
-    <owl:AnnotationProperty rdf:about="http://www.w3.org/2000/01/rdf-schema#label"/>
-    
-
-
-    <!-- 
-    ///////////////////////////////////////////////////////////////////////////////////////
-    //
-    // Datatypes
-    //
-    ///////////////////////////////////////////////////////////////////////////////////////
-     -->
-
-    
-
-
-    <!-- http://www.w3.org/2001/XMLSchema#string -->
-
-    <rdfs:Datatype rdf:about="http://www.w3.org/2001/XMLSchema#string"/>
-    
-
-
-    <!-- 
-    ///////////////////////////////////////////////////////////////////////////////////////
-    //
-    // Object Properties
-    //
-    ///////////////////////////////////////////////////////////////////////////////////////
-     -->
-
-    
-
-
-    <!-- http://purl.obolibrary.org/obo/BFO_0000050 -->
-
-    <owl:ObjectProperty rdf:about="http://purl.obolibrary.org/obo/BFO_0000050">
-        <rdf:type rdf:resource="http://www.w3.org/2002/07/owl#TransitiveProperty"/>
-    </owl:ObjectProperty>
-    
-
-
-    <!-- 
-    ///////////////////////////////////////////////////////////////////////////////////////
-    //
-    // Classes
-    //
-    ///////////////////////////////////////////////////////////////////////////////////////
-     -->
-
-    
-
-
-    <!-- http://purl.obolibrary.org/obo/GO_0005575 -->
-
-    <owl:Class rdf:about="http://purl.obolibrary.org/obo/GO_0005575">
-        <rdfs:label>cellular_component</rdfs:label>
-    </owl:Class>
-    
-
-
-    <!-- http://purl.obolibrary.org/obo/GO_0005622 -->
-
-    <owl:Class rdf:about="http://purl.obolibrary.org/obo/GO_0005622">
-        <rdfs:subClassOf rdf:resource="http://purl.obolibrary.org/obo/GO_0044464"/>
-        <rdfs:label>intracellular</rdfs:label>
-    </owl:Class>
-    
-
-
-    <!-- http://purl.obolibrary.org/obo/GO_0005623 -->
-
-    <owl:Class rdf:about="http://purl.obolibrary.org/obo/GO_0005623">
-        <rdfs:subClassOf rdf:resource="http://purl.obolibrary.org/obo/GO_0005575"/>
-        <rdfs:label>cell</rdfs:label>
-    </owl:Class>
-    
-
-
-    <!-- http://purl.obolibrary.org/obo/GO_0005634 -->
-
-    <owl:Class rdf:about="http://purl.obolibrary.org/obo/GO_0005634">
-        <rdfs:subClassOf rdf:resource="http://purl.obolibrary.org/obo/GO_0043231"/>
-        <rdfs:label>nucleus</rdfs:label>
-    </owl:Class>
-    
-
-
-    <!-- http://purl.obolibrary.org/obo/GO_0031974 -->
-
-    <owl:Class rdf:about="http://purl.obolibrary.org/obo/GO_0031974">
-        <rdfs:subClassOf rdf:resource="http://purl.obolibrary.org/obo/GO_0005575"/>
-        <rdfs:label>membrane-enclosed lumen</rdfs:label>
-    </owl:Class>
-    
-
-
-    <!-- http://purl.obolibrary.org/obo/GO_0031981 -->
-
-    <owl:Class rdf:about="http://purl.obolibrary.org/obo/GO_0031981">
-        <rdfs:label>obsolete nuclear lumen</rdfs:label>
-        <owl:deprecated rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean">true</owl:deprecated>
-    </owl:Class>
-    
-
-
-    <!-- http://purl.obolibrary.org/obo/GO_0043226 -->
-
-    <owl:Class rdf:about="http://purl.obolibrary.org/obo/GO_0043226">
-        <rdfs:subClassOf rdf:resource="http://purl.obolibrary.org/obo/GO_0005575"/>
-        <rdfs:label>organelle</rdfs:label>
-    </owl:Class>
-    
-
-
-    <!-- http://purl.obolibrary.org/obo/GO_0043227 -->
-
-    <owl:Class rdf:about="http://purl.obolibrary.org/obo/GO_0043227">
-        <rdfs:subClassOf rdf:resource="http://purl.obolibrary.org/obo/GO_0043226"/>
-        <rdfs:label>membrane-bounded organelle</rdfs:label>
-    </owl:Class>
-    
-
-
-    <!-- http://purl.obolibrary.org/obo/GO_0043229 -->
-
-    <owl:Class rdf:about="http://purl.obolibrary.org/obo/GO_0043229">
-        <rdfs:subClassOf rdf:resource="http://purl.obolibrary.org/obo/GO_0043226"/>
-        <rdfs:subClassOf rdf:resource="http://purl.obolibrary.org/obo/GO_0044424"/>
-        <rdfs:subClassOf>
-            <owl:Restriction>
-                <owl:onProperty rdf:resource="http://purl.obolibrary.org/obo/BFO_0000050"/>
-                <owl:someValuesFrom rdf:resource="http://purl.obolibrary.org/obo/GO_0005622"/>
-            </owl:Restriction>
-        </rdfs:subClassOf>
-        <rdfs:label>intracellular organelle</rdfs:label>
-    </owl:Class>
-    
-
-
-    <!-- http://purl.obolibrary.org/obo/GO_0043231 -->
-
-    <owl:Class rdf:about="http://purl.obolibrary.org/obo/GO_0043231">
-        <rdfs:subClassOf rdf:resource="http://purl.obolibrary.org/obo/GO_0043227"/>
-        <rdfs:subClassOf rdf:resource="http://purl.obolibrary.org/obo/GO_0043229"/>
-        <rdfs:label>intracellular membrane-bounded organelle</rdfs:label>
-    </owl:Class>
-    
-
-
-    <!-- http://purl.obolibrary.org/obo/GO_0043233 -->
-
-    <owl:Class rdf:about="http://purl.obolibrary.org/obo/GO_0043233">
-        <rdfs:subClassOf rdf:resource="http://purl.obolibrary.org/obo/GO_0031974"/>
-        <rdfs:subClassOf rdf:resource="http://purl.obolibrary.org/obo/GO_0044422"/>
-        <rdfs:subClassOf>
-            <owl:Restriction>
-                <owl:onProperty rdf:resource="http://purl.obolibrary.org/obo/BFO_0000050"/>
-                <owl:someValuesFrom rdf:resource="http://purl.obolibrary.org/obo/GO_0043226"/>
-            </owl:Restriction>
-        </rdfs:subClassOf>
-        <rdfs:label>organelle lumen</rdfs:label>
-    </owl:Class>
-    
-
-
-    <!-- http://purl.obolibrary.org/obo/GO_0044422 -->
-
-    <owl:Class rdf:about="http://purl.obolibrary.org/obo/GO_0044422">
-        <rdfs:subClassOf rdf:resource="http://purl.obolibrary.org/obo/GO_0005575"/>
-        <rdfs:subClassOf>
-            <owl:Restriction>
-                <owl:onProperty rdf:resource="http://purl.obolibrary.org/obo/BFO_0000050"/>
-                <owl:someValuesFrom rdf:resource="http://purl.obolibrary.org/obo/GO_0043226"/>
-            </owl:Restriction>
-        </rdfs:subClassOf>
-        <rdfs:label>organelle part</rdfs:label>
-    </owl:Class>
-    
-
-
-    <!-- http://purl.obolibrary.org/obo/GO_0044424 -->
-
-    <owl:Class rdf:about="http://purl.obolibrary.org/obo/GO_0044424">
-        <rdfs:subClassOf rdf:resource="http://purl.obolibrary.org/obo/GO_0044464"/>
-        <rdfs:subClassOf>
-            <owl:Restriction>
-                <owl:onProperty rdf:resource="http://purl.obolibrary.org/obo/BFO_0000050"/>
-                <owl:someValuesFrom rdf:resource="http://purl.obolibrary.org/obo/GO_0005622"/>
-            </owl:Restriction>
-        </rdfs:subClassOf>
-        <rdfs:label>intracellular part</rdfs:label>
-    </owl:Class>
-    
-
-
-    <!-- http://purl.obolibrary.org/obo/GO_0044428 -->
-
-    <owl:Class rdf:about="http://purl.obolibrary.org/obo/GO_0044428">
-        <rdfs:subClassOf rdf:resource="http://purl.obolibrary.org/obo/GO_0044446"/>
-        <rdfs:subClassOf>
-            <owl:Restriction>
-                <owl:onProperty rdf:resource="http://purl.obolibrary.org/obo/BFO_0000050"/>
-                <owl:someValuesFrom rdf:resource="http://purl.obolibrary.org/obo/GO_0005634"/>
-            </owl:Restriction>
-        </rdfs:subClassOf>
-        <rdfs:label>nuclear part</rdfs:label>
-    </owl:Class>
-    
-
-
-    <!-- http://purl.obolibrary.org/obo/GO_0044446 -->
-
-    <owl:Class rdf:about="http://purl.obolibrary.org/obo/GO_0044446">
-        <rdfs:subClassOf rdf:resource="http://purl.obolibrary.org/obo/GO_0044422"/>
-        <rdfs:subClassOf rdf:resource="http://purl.obolibrary.org/obo/GO_0044424"/>
-        <rdfs:subClassOf>
-            <owl:Restriction>
-                <owl:onProperty rdf:resource="http://purl.obolibrary.org/obo/BFO_0000050"/>
-                <owl:someValuesFrom rdf:resource="http://purl.obolibrary.org/obo/GO_0005622"/>
-            </owl:Restriction>
-        </rdfs:subClassOf>
-        <rdfs:subClassOf>
-            <owl:Restriction>
-                <owl:onProperty rdf:resource="http://purl.obolibrary.org/obo/BFO_0000050"/>
-                <owl:someValuesFrom rdf:resource="http://purl.obolibrary.org/obo/GO_0043226"/>
-            </owl:Restriction>
-        </rdfs:subClassOf>
-        <rdfs:subClassOf>
-            <owl:Restriction>
-                <owl:onProperty rdf:resource="http://purl.obolibrary.org/obo/BFO_0000050"/>
-                <owl:someValuesFrom rdf:resource="http://purl.obolibrary.org/obo/GO_0043229"/>
-            </owl:Restriction>
-        </rdfs:subClassOf>
-        <rdfs:label>intracellular organelle part</rdfs:label>
-    </owl:Class>
-    
-
-
-    <!-- http://purl.obolibrary.org/obo/GO_0044464 -->
-
-    <owl:Class rdf:about="http://purl.obolibrary.org/obo/GO_0044464">
-        <rdfs:subClassOf rdf:resource="http://purl.obolibrary.org/obo/GO_0005575"/>
-        <rdfs:subClassOf>
-            <owl:Restriction>
-                <owl:onProperty rdf:resource="http://purl.obolibrary.org/obo/BFO_0000050"/>
-                <owl:someValuesFrom rdf:resource="http://purl.obolibrary.org/obo/GO_0005623"/>
-            </owl:Restriction>
-        </rdfs:subClassOf>
-        <rdfs:label>cell part</rdfs:label>
-    </owl:Class>
-    
-
-
-    <!-- http://purl.obolibrary.org/obo/GO_0070013 -->
-
-    <owl:Class rdf:about="http://purl.obolibrary.org/obo/GO_0070013">
-        <rdfs:subClassOf rdf:resource="http://purl.obolibrary.org/obo/GO_0043233"/>
-        <rdfs:subClassOf rdf:resource="http://purl.obolibrary.org/obo/GO_0044446"/>
-        <rdfs:subClassOf>
-            <owl:Restriction>
-                <owl:onProperty rdf:resource="http://purl.obolibrary.org/obo/BFO_0000050"/>
-                <owl:someValuesFrom rdf:resource="http://purl.obolibrary.org/obo/GO_0043229"/>
-            </owl:Restriction>
-        </rdfs:subClassOf>
-        <rdfs:label>intracellular organelle lumen</rdfs:label>
-    </owl:Class>
-</rdf:RDF>
-
-
-
-<!-- Generated by the OWL API (version 4.2.6) https://github.com/owlcs/owlapi -->
-
diff --git a/docs/examples/revert.ru b/docs/examples/revert.ru
deleted file mode 100644
index 35156823..00000000
--- a/docs/examples/revert.ru
+++ /dev/null
@@ -1,13 +0,0 @@
-PREFIX owl: <http://www.w3.org/2002/07/owl#>
-PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
-PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
-
-DELETE { ?s rdfs:label 'obsolete nuclear lumen' ;
-			owl:deprecated 'true'^^xsd:boolean }
-INSERT { ?s rdfs:label 'nuclear lumen' ;
-            rdfs:subClassOf <http://purl.obolibrary.org/obo/GO_0070013> ;
-        	rdfs:subClassOf <http://purl.obolibrary.org/obo/GO_0044428> ;
-        	rdfs:subClassOf [ a owl:Restriction ; 
-        					  owl:onProperty <http://purl.obolibrary.org/obo/BFO_0000050> ;
-        					  owl:someValuesFrom <http://purl.obolibrary.org/obo/GO_0005634> ]}
-WHERE { ?s rdfs:label 'obsolete nuclear lumen' }
\ No newline at end of file
diff --git a/docs/examples/source-map.tsv b/docs/examples/source-map.tsv
deleted file mode 100644
index 423b0eb4..00000000
--- a/docs/examples/source-map.tsv
+++ /dev/null
@@ -1,3 +0,0 @@
-term	source
-UBERON:0000916	http://purl.obolibrary.org/obo/go.owl
-UBERON:0001062	GO
\ No newline at end of file
diff --git a/docs/examples/update.ru b/docs/examples/update.ru
deleted file mode 100644
index 64cf743e..00000000
--- a/docs/examples/update.ru
+++ /dev/null
@@ -1,10 +0,0 @@
-PREFIX owl: <http://www.w3.org/2002/07/owl#>
-PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
-PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
-
-DELETE { ?s rdfs:label 'nuclear lumen' ;
-			rdfs:subClassOf ?super }
-INSERT { ?s rdfs:label 'obsolete nuclear lumen' ;
-            owl:deprecated 'true'^^xsd:boolean }
-WHERE { ?s rdfs:label 'nuclear lumen';
-		   rdfs:subClassOf ?super }
\ No newline at end of file
diff --git a/docs/extract.md b/docs/extract.md
index d8b497b5..0d598338 100644
--- a/docs/extract.md
+++ b/docs/extract.md
@@ -34,8 +34,6 @@ For more details see:
 - [SLME source code](http://owlcs.github.io/owlapi/apidocs_4/uk/ac/manchester/cs/owlapi/modularity/SyntacticLocalityModuleExtractor.html)
 - [ModuleType source code](http://owlcs.github.io/owlapi/apidocs_4/uk/ac/manchester/cs/owlapi/modularity/ModuleType.html)
 
-ROBOT expects any `--term` or IRI in the `--term-file` to exist in the input ontology. If none of the input terms exist, the command will fail with an [empty terms error](errors#empty-terms-error). This can be overridden by including `--force true`. 
-
 ## MIREOT
 
 The MIREOT method preserves the hierarchy of the input ontology (subclass and subproperty relationships), but does not try to preserve the full set of logical entailments. Both "upper" (ancestor) and "lower" (descendant) limits can be specified, like this:
@@ -60,39 +58,6 @@ You can also include ontology annotations from the input ontology with `--copy-o
       --term UBERON:0000916 \
       --copy-ontology-annotations true \
       --output results/annotated_module.owl
-      
-## Source Annotations
-
-`extract` provides an option to annotate extracted terms with `rdfs:isDefinedBy`. If the term already has an annotation using this property, the existing annotation will be copied and no new annotation will be added.
-
-    robot extract --method BOT \
-      --input annotated.owl \
-      --term UBERON:0000916 \
-      --annotate-with-source true \
-      --output results/annotated_source.owl 
-
-The object of the property is, by default, the base name of the term's IRI. For example, the IRI for `GO:0000001` (`http://purl.obolibrary.org/obo/GO_0000001`) would receive the source `http://purl.obolibrary.org/obo/go.owl`. 
-
-Sometimes classes are adopted by other ontologies, but retain their original IRI. In this case, you can provide the path to a [term-to-source mapping file](/examples/source-map.tsv) as CSV or TSV.
-
-    robot --prefix 'GO: http://purl.obolibrary.org/obo/GO_' extract --method BOT \
-      --input annotated.owl \
-      --term UBERON:0000916 \
-      --annotate-with-source true \
-      --sources source-map.tsv \
-      --output results/changed_source.owl
-
-The mapping file can either use full IRIs:
-
-```
-http://purl.obolibrary.org/obo/BFO_0000001,http://purl.obolibrary.org/obo/ro.owl
-```
-
-Or prefixes, as long as the [prefix is valid](/global#prefixes):
-
-```
-BFO:0000001,RO
-```
 
 ---
 
@@ -116,7 +81,3 @@ The following flags *should not* be used with STAR, TOP, or BOT methods:
 * `--upper-term` & `--upper-terms`
 * `--lower-term` & `--lower-terms`
 * `--branch-from-term` & `--branch-from-terms`
-
-### Invalid Source Map Error
-
-The input for `--sources` must be either CSV or TSV format.
diff --git a/docs/global.md b/docs/global.md
index cf6a5685..79009cc8 100644
--- a/docs/global.md
+++ b/docs/global.md
@@ -106,7 +106,3 @@ xml:base="&obo;obi.owl"
 ### JSON-LD Error
 
 ROBOT encountered a problem while writing the given prefixes to JSON-LD.
-
-### Missing File Error
-
-The file provided for an input does not exist. Check the path and try again.
\ No newline at end of file
diff --git a/docs/query.md b/docs/query.md
index b2c812aa..740689f8 100644
--- a/docs/query.md
+++ b/docs/query.md
@@ -40,35 +40,10 @@ The example above also uses the [global](/global)  `--catalog` option to specify
 
 The names of the graphs correspond to the ontology IRIs of the imports. If the import does not have an ontology IRI, one will be automatically generated. Running `query` with the `-vv` flag will print the names of all graphs as they are added.
 
-## Update
-
-The `query` command also supports [SPARQL Update](https://www.w3.org/TR/sparql11-update/) to insert and delete triples.
-
-    robot query --input nucleus.owl \
-      --update update.ru \
-      --output results/nucleus_update.owl
-
-When using SPARQL update, you can either provide an `--output` for the updated ontology, or [chain](/chaining) it into another command.
-
-You can perform multiple updates in one command to reduce time spent loading and saving the ontology. Updates are processed in the order that they are input.
-
-    robot query --input nucleus.owl \
-     --update update.ru \
-     --update revert.ru \
-     --output results/nucleus.owl
-
-The `--update` option only updates the ontology itself, not any of the imports.
-
-**Warning:** The output of SPARQL updates will not include `xsd:string` datatypes, because `xsd:string` is considered implicit in RDF version 1.1. This behaviour differs from other ROBOT commands, where `xsd:string` datatypes from the input are maintained in the output.
-
 ---
 
 ## Error Messages
 
-### Missing File Error
-
-The file provided for `--update` does not exist. Check the path and try again.
-
 ### Missing Query Error
 
 You must specify a query to execute with `--query` or `--queries`.
diff --git a/docs/reason.md b/docs/reason.md
index a6c65e43..c2f8b3db 100644
--- a/docs/reason.md
+++ b/docs/reason.md
@@ -53,6 +53,45 @@ robot reason --reasoner ELK \
 
 If the input module contains at least one import, axioms in the debug module will be tagged with the source ontology, to assist in debugging.
 
+## Generated Axioms
+
+By default, the `reason` operation will only assert inferred subclass axioms. This can be configured with the `--axiom-generators` option. OWLAPI provides the following inferred axiom generators:
+
+  * Class axiom generators
+    * `SubClass`
+    * `EquivalentClass`
+    * `DisjointClasses`
+  * Data property axiom generators
+    * `DataPropertyCharacteristic`
+    * `EquivalentDataProperties`
+    * `SubDataProperty`
+  * Individual axiom generators
+    * `ClassAssertion`
+    * `PropertyAssertion`
+  * Object property axiom generators
+    * `EquivalentObjectProperty`
+    * `InverseObjectProperties`
+    * `ObjectPropertyCharacteristic`
+    * `SubObjectProperty`
+  
+One or more of these axiom generators can be passed into the option (separated by spaces). For example, to generate both subclass and disjoint class axioms:
+
+```
+robot reason --input unreasoned.owl
+  --axiom-generators "SubClass DisjointClasses"
+  --output reasoned.owl
+```
+
+If you are only passing one axiom generator, it does not need to be surrounded by double quotes.
+
+The axioms that are generated for subclasses, class assertions, and sub-object properties can be either direct or indirect. By default, the operation will only generate direct axioms (`--include-indirect false`). It is recommended to pipe to `reduce` after to remove any redundant axioms. For example, to generate all direct and indirect superclass expressions:
+```
+robot reason --input unreasoned.owl
+  --reasoner emr
+  --include-indirect true
+  reduce --output reasoned.owl
+```
+
 ---
 
 ## Error Messages
@@ -60,3 +99,7 @@ If the input module contains at least one import, axioms in the debug module wil
 ### Create Ontology Error
 
 You must select between `--create-new-ontology-with-annotations` (`-m`) and `--create-new-ontology` (`-n`). Both cannot be passed in as `true` to one reason command, as they have opposite results.
+
+### Axiom Generator Error
+
+The input for the `--axiom-generators` option must be one or more space-separated valid axiom generators, [listed above](/reason#axiom-generators).
diff --git a/docs/remove.md b/docs/remove.md
index 063e57c7..b9ed6a1c 100644
--- a/docs/remove.md
+++ b/docs/remove.md
@@ -47,8 +47,6 @@ Relation type selections provide the ability to select which terms to remove bas
 6. `equivalents`
 7. `types`
 8. `instances`
-9. `domains`
-10. `ranges`
 
 #### Entity Types
 
diff --git a/robot-command/src/main/java/org/obolibrary/robot/Command.java b/robot-command/src/main/java/org/obolibrary/robot/Command.java
index 7dfb7241..d616b889 100644
--- a/robot-command/src/main/java/org/obolibrary/robot/Command.java
+++ b/robot-command/src/main/java/org/obolibrary/robot/Command.java
@@ -8,10 +8,6 @@ import org.apache.commons.cli.Options;
  * @author <a href="mailto:james@overton.ca">James A. Overton</a>
  */
 public interface Command {
-
-  String global = "global#";
-  String missingFileError = global + "MISSING FILE ERROR file '%s' for '%s' does not exist";
-
   /**
    * Name of the command.
    *
diff --git a/robot-command/src/main/java/org/obolibrary/robot/ExtractCommand.java b/robot-command/src/main/java/org/obolibrary/robot/ExtractCommand.java
index 5b0d2874..14e006ca 100644
--- a/robot-command/src/main/java/org/obolibrary/robot/ExtractCommand.java
+++ b/robot-command/src/main/java/org/obolibrary/robot/ExtractCommand.java
@@ -1,14 +1,9 @@
 package org.obolibrary.robot;
 
-import com.opencsv.CSVParserBuilder;
-import com.opencsv.CSVReader;
-import com.opencsv.CSVReaderBuilder;
-import java.io.*;
 import java.util.*;
 import org.apache.commons.cli.CommandLine;
 import org.apache.commons.cli.Options;
 import org.semanticweb.owlapi.model.*;
-import org.semanticweb.owlapi.util.DefaultPrefixManager;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import uk.ac.manchester.cs.owlapi.modularity.ModuleType;
@@ -41,17 +36,12 @@ public class ExtractCommand implements Command {
   private static final String invalidMethodError =
       NS + "INVALID METHOD ERROR method must be: MIREOT, STAR, TOP, BOT";
 
-  /** Error message when a MIREOT option is used for SLME. */
   private static final String invalidOptionError =
       NS
           + "INVALID OPTION ERROR "
           + "only --term or --term-file can be used to specify extract term(s) "
           + "for STAR, TOP, or BOT";
 
-  /** Error message when the source map is not TSV or CSV. */
-  private static final String invalidSourceMapError =
-      NS + "INVALID SOURCE MAP ERROR --sources input must be .tsv or .csv";
-
   /** Store the command-line options for the command. */
   private Options options;
 
@@ -72,9 +62,6 @@ public class ExtractCommand implements Command {
     o.addOption("b", "branch-from-term", true, "root term of branch to extract");
     o.addOption("B", "branch-from-terms", true, "root terms of branches to extract");
     o.addOption("c", "copy-ontology-annotations", true, "if true, include ontology annotations");
-    o.addOption("f", "force", true, "if true, warn on empty input terms instead of fail");
-    o.addOption("a", "annotate-with-source", true, "if true, annotate terms with rdfs:isDefinedBy");
-    o.addOption("s", "sources", true, "specify a mapping file of term to source ontology");
     options = o;
   }
 
@@ -156,22 +143,12 @@ public class ExtractCommand implements Command {
       outputIRI = inputOntology.getOntologyID().getOntologyIRI().orNull();
     }
 
-    // Determine if terms should be annotated with isDefinedBy
-    boolean annotateSource = CommandLineHelper.getBooleanValue(line, "annotate-with-source", false);
-    String sourceMapPath = CommandLineHelper.getOptionalValue(line, "sources");
-    Map<IRI, IRI> sourceMap = new HashMap<>();
-    if (sourceMapPath != null) {
-      sourceMap = getSourceMap(ioHelper, sourceMapPath);
-    }
-
     // Get method, make sure it has been specified
     String method =
         CommandLineHelper.getRequiredValue(line, "method", "method of extraction must be specified")
             .trim()
             .toLowerCase();
 
-    boolean force = CommandLineHelper.getBooleanValue(line, "force", false);
-
     ModuleType moduleType = null;
     switch (method) {
       case "star":
@@ -222,17 +199,14 @@ public class ExtractCommand implements Command {
         // First check for lower IRIs, upper IRIs can be null or not
         if (lowerIRIs != null) {
           outputOntologies.add(
-              MireotOperation.getAncestors(
-                  inputOntology, upperIRIs, lowerIRIs, null, annotateSource, sourceMap));
+              MireotOperation.getAncestors(inputOntology, upperIRIs, lowerIRIs, null));
           // If there are no lower IRIs, there shouldn't be any upper IRIs
         } else if (upperIRIs != null) {
           throw new IllegalArgumentException(missingLowerTermError);
         }
         // Check for branch IRIs
         if (branchIRIs != null) {
-          outputOntologies.add(
-              MireotOperation.getDescendants(
-                  inputOntology, branchIRIs, null, annotateSource, sourceMap));
+          outputOntologies.add(MireotOperation.getDescendants(inputOntology, branchIRIs, null));
         }
       }
       outputOntology = MergeOperation.merge(outputOntologies);
@@ -254,10 +228,8 @@ public class ExtractCommand implements Command {
       // Make sure the terms exist in the input ontology
       Set<IRI> terms =
           OntologyHelper.filterExistingTerms(
-              inputOntology, CommandLineHelper.getTerms(ioHelper, line), force);
-      outputOntology =
-          ExtractOperation.extract(
-              inputOntology, terms, outputIRI, moduleType, annotateSource, sourceMap);
+              inputOntology, CommandLineHelper.getTerms(ioHelper, line), false);
+      outputOntology = ExtractOperation.extract(inputOntology, terms, outputIRI, moduleType);
     } else {
       throw new Exception(invalidMethodError);
     }
@@ -276,61 +248,4 @@ public class ExtractCommand implements Command {
     state.setOntology(outputOntology);
     return state;
   }
-
-  /**
-   * Given an IOHelper and the path to a term-to-source map, return a map of term IRI to source IRI.
-   *
-   * @param ioHelper IOHelper to handle prefixes
-   * @param sourceMapPath path of the term-to-source map
-   * @return map of term IRI to source IRI
-   * @throws Exception on file reading issue
-   */
-  private static Map<IRI, IRI> getSourceMap(IOHelper ioHelper, String sourceMapPath)
-      throws Exception {
-    File sourceMapFile = new File(sourceMapPath);
-    if (!sourceMapFile.exists()) {
-      throw new Exception(String.format(missingFileError, sourceMapPath, "--sources"));
-    }
-
-    char separator;
-    if (sourceMapPath.endsWith(".tsv")) {
-      separator = '\t';
-    } else if (sourceMapPath.endsWith(".csv")) {
-      separator = ',';
-    } else {
-      throw new Exception(invalidSourceMapError);
-    }
-
-    DefaultPrefixManager pm = ioHelper.getPrefixManager();
-
-    Reader reader = new FileReader(sourceMapFile);
-    CSVReader csv =
-        new CSVReaderBuilder(reader)
-            .withCSVParser(new CSVParserBuilder().withSeparator(separator).build())
-            .build();
-    // Skip first line
-    csv.skip(1);
-
-    Map<IRI, IRI> sourceMap = new HashMap<>();
-    for (String line[] : csv) {
-      IRI entity = ioHelper.createIRI(line[0]);
-
-      // Maybe create a source IRI from a prefix
-      // Otherwise the full IRI should be provided
-      IRI source;
-      String sourceStr = line[1];
-      String namespace = pm.getPrefix(sourceStr + ":");
-      if (namespace != null) {
-        if (namespace.endsWith("_") || namespace.endsWith("#") || namespace.endsWith("/")) {
-          namespace = namespace.substring(0, namespace.length() - 1);
-        }
-        source = IRI.create(namespace.toLowerCase() + ".owl");
-      } else {
-        source = IRI.create(sourceStr);
-      }
-      sourceMap.put(entity, source);
-    }
-
-    return sourceMap;
-  }
 }
diff --git a/robot-command/src/main/java/org/obolibrary/robot/QueryCommand.java b/robot-command/src/main/java/org/obolibrary/robot/QueryCommand.java
index 8634d438..cfe334d0 100644
--- a/robot-command/src/main/java/org/obolibrary/robot/QueryCommand.java
+++ b/robot-command/src/main/java/org/obolibrary/robot/QueryCommand.java
@@ -3,18 +3,14 @@ package org.obolibrary.robot;
 import java.io.File;
 import java.io.FileOutputStream;
 import java.io.OutputStream;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.List;
 import org.apache.commons.cli.CommandLine;
 import org.apache.commons.cli.Option;
 import org.apache.commons.cli.Options;
 import org.apache.commons.io.FileUtils;
 import org.apache.commons.io.FilenameUtils;
 import org.apache.jena.query.Dataset;
-import org.apache.jena.rdf.model.Model;
-import org.semanticweb.owlapi.model.AddImport;
-import org.semanticweb.owlapi.model.OWLImportsDeclaration;
-import org.semanticweb.owlapi.model.OWLOntology;
-import org.semanticweb.owlapi.model.OWLOntologyManager;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -30,9 +26,6 @@ public class QueryCommand implements Command {
   /** Namespace for error messages. */
   private static final String NS = "query#";
 
-  /** Error message when update file provided does not exist. */
-  private static final String missingFileError = NS + "MISSING FILE ERROR file '%s' does not exist";
-
   /** Error message when a query is not provided */
   private static final String missingQueryError =
       NS + "MISSING QUERY ERROR at least one query must be provided";
@@ -50,10 +43,8 @@ public class QueryCommand implements Command {
     o.addOption("i", "input", true, "load ontology from a file");
     o.addOption("I", "input-iri", true, "load ontology from an IRI");
     o.addOption("f", "format", true, "the query result format: CSV, TSV," + " TTL, JSONLD, etc.");
-    o.addOption("o", "output", true, "save updated ontology to a file");
     o.addOption("O", "output-dir", true, "Directory for output");
     o.addOption("g", "use-graphs", true, "if true, load imports as named graphs");
-    o.addOption("u", "update", true, "run a SPARQL UPDATE");
 
     Option opt;
 
@@ -144,51 +135,14 @@ public class QueryCommand implements Command {
     String outputDir = CommandLineHelper.getDefaultValue(line, "output-dir", "");
     IOHelper ioHelper = CommandLineHelper.getIOHelper(line);
     state = CommandLineHelper.updateInputOntology(ioHelper, state, line);
-    OWLOntology inputOntology = state.getOntology();
-
-    // If an update(s) are provided, run then return the OWLOntology
-    List<String> updatePaths = CommandLineHelper.getOptionalValues(line, "update");
-    if (!updatePaths.isEmpty()) {
-      Map<String, String> updates = new LinkedHashMap<>();
-      for (String updatePath : updatePaths) {
-        File f = new File(updatePath);
-        if (!f.exists()) {
-          throw new Exception(String.format(missingFileError, updatePath));
-        }
-        updates.put(f.getPath(), FileUtils.readFileToString(f));
-      }
-
-      // Load the ontology as a model, ignoring imports
-      Model model = QueryOperation.loadOntologyAsModel(inputOntology);
-
-      // Execute the updates
-      for (Map.Entry<String, String> update : updates.entrySet()) {
-        logger.debug(String.format("Running update '%s'", update.getKey()));
-        QueryOperation.execUpdate(model, update.getValue());
-      }
-
-      OWLOntology outputOntology = QueryOperation.convertModel(model);
-
-      // If the input ontology had imports, maintain them
-      if (inputOntology.getImports().size() > 0) {
-        OWLOntologyManager manager = inputOntology.getOWLOntologyManager();
-        for (OWLImportsDeclaration importsDeclaration : inputOntology.getImportsDeclarations()) {
-          manager.applyChange(new AddImport(outputOntology, importsDeclaration));
-        }
-      }
-
-      CommandLineHelper.maybeSaveOutput(line, outputOntology);
-      state.setOntology(outputOntology);
-      return state;
-    }
 
     // Determine what to do with the imports and create a new dataset
     boolean useGraphs = CommandLineHelper.getBooleanValue(line, "use-graphs", false);
     Dataset dataset;
     if (useGraphs) {
-      dataset = QueryOperation.loadOntologyAsDataset(inputOntology, true);
+      dataset = QueryOperation.loadOntologyAsDataset(state.getOntology(), true);
     } else {
-      dataset = QueryOperation.loadOntologyAsDataset(inputOntology, false);
+      dataset = QueryOperation.loadOntologyAsDataset(state.getOntology(), false);
     }
 
     // Collect all queries as (queryPath, outputPath) pairs.
diff --git a/robot-command/src/main/java/org/obolibrary/robot/ReasonCommand.java b/robot-command/src/main/java/org/obolibrary/robot/ReasonCommand.java
index 5ab5e3a5..fdcb812d 100644
--- a/robot-command/src/main/java/org/obolibrary/robot/ReasonCommand.java
+++ b/robot-command/src/main/java/org/obolibrary/robot/ReasonCommand.java
@@ -77,6 +77,12 @@ public class ReasonCommand implements Command {
         true,
         "if 'none', any equivalent class will cause an error, if 'all', all equivalent classes are "
             + "allowed, and if 'asserted-only', inferred equivalent classes will cause an error.");
+    o.addOption(
+        "A",
+        "axiom-generators",
+        true,
+        "specify one or more space-separated inferred axiom generators");
+    o.addOption("d", "include-indirect", true, "if true, assert direct and indirect axioms");
     o.addOption("i", "input", true, "reason ontology from a file");
     o.addOption("I", "input-iri", true, "reason ontology from an IRI");
     o.addOption("o", "output", true, "save reasoned ontology to a file");
diff --git a/robot-core/src/main/java/org/obolibrary/robot/ExtractOperation.java b/robot-core/src/main/java/org/obolibrary/robot/ExtractOperation.java
index d05d82ab..b98e1cb6 100644
--- a/robot-core/src/main/java/org/obolibrary/robot/ExtractOperation.java
+++ b/robot-core/src/main/java/org/obolibrary/robot/ExtractOperation.java
@@ -1,14 +1,15 @@
 package org.obolibrary.robot;
 
 import java.util.HashSet;
-import java.util.Map;
 import java.util.Set;
 import org.semanticweb.owlapi.apibinding.OWLManager;
-import org.semanticweb.owlapi.model.*;
+import org.semanticweb.owlapi.model.IRI;
+import org.semanticweb.owlapi.model.OWLEntity;
+import org.semanticweb.owlapi.model.OWLOntology;
+import org.semanticweb.owlapi.model.OWLOntologyCreationException;
 import org.semanticweb.owlapi.model.parameters.Imports;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import uk.ac.manchester.cs.owl.owlapi.OWLDataFactoryImpl;
 import uk.ac.manchester.cs.owlapi.modularity.ModuleType;
 import uk.ac.manchester.cs.owlapi.modularity.SyntacticLocalityModuleExtractor;
 
@@ -22,12 +23,6 @@ public class ExtractOperation {
   /** Logger. */
   private static final Logger logger = LoggerFactory.getLogger(ExtractOperation.class);
 
-  /** Shared data factory. */
-  private static OWLDataFactory dataFactory = new OWLDataFactoryImpl();
-
-  /** RDFS isDefinedBy annotation property. */
-  private static OWLAnnotationProperty isDefinedBy = dataFactory.getRDFSIsDefinedBy();
-
   /**
    * Extract a set of terms from an ontology using the OWLAPI's SyntacticLocalityModuleExtractor
    * (SLME). The input ontology is not changed.
@@ -42,30 +37,6 @@ public class ExtractOperation {
   public static OWLOntology extract(
       OWLOntology inputOntology, Set<IRI> terms, IRI outputIRI, ModuleType moduleType)
       throws OWLOntologyCreationException {
-    return extract(inputOntology, terms, outputIRI, moduleType, false, null);
-  }
-
-  /**
-   * Extract a set of terms from an ontology using the OWLAPI's SyntacticLocalityModuleExtractor
-   * (SLME). The input ontology is not changed.
-   *
-   * @param inputOntology the ontology to extract from
-   * @param terms a set of IRIs for terms to extract
-   * @param outputIRI the OntologyIRI of the new ontology
-   * @param moduleType determines the type of extraction; defaults to STAR
-   * @param annotateSource if true, annotate copied classes with rdfs:isDefinedBy
-   * @param sourceMap map of term IRI to source IRI
-   * @return a new ontology (with a new manager)
-   * @throws OWLOntologyCreationException on any OWLAPI problem
-   */
-  public static OWLOntology extract(
-      OWLOntology inputOntology,
-      Set<IRI> terms,
-      IRI outputIRI,
-      ModuleType moduleType,
-      boolean annotateSource,
-      Map<IRI, IRI> sourceMap)
-      throws OWLOntologyCreationException {
     logger.debug("Extracting...");
 
     Set<OWLEntity> entities = new HashSet<>();
@@ -82,58 +53,7 @@ public class ExtractOperation {
         new SyntacticLocalityModuleExtractor(
             inputOntology.getOWLOntologyManager(), inputOntology, type);
 
-    OWLOntologyManager manager = OWLManager.createOWLOntologyManager();
-    OWLOntology outputOntology = manager.createOntology(extractor.extract(entities), outputIRI);
-    // Maybe annotate entities with rdfs:isDefinedBy
-    if (annotateSource) {
-      Set<OWLAnnotationAxiom> sourceAxioms = new HashSet<>();
-      for (OWLEntity entity : OntologyHelper.getEntities(outputOntology)) {
-        // Check if rdfs:isDefinedBy already exists
-        Set<OWLAnnotationValue> existingValues =
-            OntologyHelper.getAnnotationValues(outputOntology, isDefinedBy, entity.getIRI());
-        if (existingValues == null || existingValues.size() == 0) {
-          // If not, add it
-          sourceAxioms.add(getIsDefinedBy(entity, sourceMap));
-        }
-      }
-      manager.addAxioms(outputOntology, sourceAxioms);
-    }
-
-    return outputOntology;
-  }
-
-  /**
-   * Given an OWLEntity, return an OWLAnnotationAssertionAxiom indicating the source ontology with
-   * rdfs:isDefinedBy.
-   *
-   * @param entity entity to get source of
-   * @return OWLAnnotationAssertionAxiom with rdfs:isDefinedBy as the property
-   */
-  protected static OWLAnnotationAxiom getIsDefinedBy(OWLEntity entity, Map<IRI, IRI> sourceMap) {
-    String iri = entity.getIRI().toString();
-    IRI base;
-    if (sourceMap != null && sourceMap.containsKey(entity.getIRI())) {
-      // IRI exists in the prefixes
-      base = sourceMap.get(entity.getIRI());
-    } else {
-      // Brute force edit the IRI string
-      // Warning - this may not work with non-OBO Foundry terms, depending on the IRI format!
-      if (iri.contains("#")) {
-        if (iri.contains(".owl#")) {
-          String baseStr = iri.substring(0, iri.lastIndexOf("#")).toLowerCase();
-          base = IRI.create(baseStr);
-        } else {
-          String baseStr = iri.substring(0, iri.lastIndexOf("#")).toLowerCase() + ".owl";
-          base = IRI.create(baseStr);
-        }
-      } else if (iri.contains("_")) {
-        String baseStr = iri.substring(0, iri.lastIndexOf("_")).toLowerCase() + ".owl";
-        base = IRI.create(baseStr);
-      } else {
-        String baseStr = iri.substring(0, iri.lastIndexOf("/")).toLowerCase() + ".owl";
-        base = IRI.create(baseStr);
-      }
-    }
-    return dataFactory.getOWLAnnotationAssertionAxiom(isDefinedBy, entity.getIRI(), base);
+    return OWLManager.createOWLOntologyManager()
+        .createOntology(extractor.extract(entities), outputIRI);
   }
 }
diff --git a/robot-core/src/main/java/org/obolibrary/robot/IOHelper.java b/robot-core/src/main/java/org/obolibrary/robot/IOHelper.java
index ab828915..3d9dad2d 100644
--- a/robot-core/src/main/java/org/obolibrary/robot/IOHelper.java
+++ b/robot-core/src/main/java/org/obolibrary/robot/IOHelper.java
@@ -632,8 +632,6 @@ public class IOHelper {
       String result = ((Map<String, Object>) expanded).keySet().iterator().next();
       if (result != null) {
         return IRI.create(result);
-      } else {
-        return IRI.create(term);
       }
     } catch (Exception e) {
       logger.warn("Could not create IRI for {}", term);
diff --git a/robot-core/src/main/java/org/obolibrary/robot/MireotOperation.java b/robot-core/src/main/java/org/obolibrary/robot/MireotOperation.java
index 375ac470..f8b8ff33 100644
--- a/robot-core/src/main/java/org/obolibrary/robot/MireotOperation.java
+++ b/robot-core/src/main/java/org/obolibrary/robot/MireotOperation.java
@@ -2,10 +2,19 @@ package org.obolibrary.robot;
 
 import java.util.Collection;
 import java.util.HashSet;
-import java.util.Map;
 import java.util.Set;
 import org.semanticweb.owlapi.apibinding.OWLManager;
-import org.semanticweb.owlapi.model.*;
+import org.semanticweb.owlapi.model.IRI;
+import org.semanticweb.owlapi.model.OWLAnnotationProperty;
+import org.semanticweb.owlapi.model.OWLClass;
+import org.semanticweb.owlapi.model.OWLDataFactory;
+import org.semanticweb.owlapi.model.OWLDataProperty;
+import org.semanticweb.owlapi.model.OWLEntity;
+import org.semanticweb.owlapi.model.OWLObjectProperty;
+import org.semanticweb.owlapi.model.OWLObjectPropertyExpression;
+import org.semanticweb.owlapi.model.OWLOntology;
+import org.semanticweb.owlapi.model.OWLOntologyCreationException;
+import org.semanticweb.owlapi.model.OWLOntologyManager;
 import org.semanticweb.owlapi.reasoner.OWLReasoner;
 import org.semanticweb.owlapi.reasoner.OWLReasonerFactory;
 import org.semanticweb.owlapi.reasoner.structural.StructuralReasonerFactory;
@@ -28,9 +37,6 @@ public class MireotOperation {
   /** Shared data factory. */
   private static OWLDataFactory dataFactory = new OWLDataFactoryImpl();
 
-  /** RDFS isDefinedBy annotation property. */
-  private static OWLAnnotationProperty isDefinedBy = dataFactory.getRDFSIsDefinedBy();
-
   /**
    * Get a set of default annotation properties. Currenly includes only RDFS label.
    *
@@ -60,32 +66,6 @@ public class MireotOperation {
       Set<IRI> lowerIRIs,
       Set<OWLAnnotationProperty> annotationProperties)
       throws OWLOntologyCreationException {
-    return getAncestors(inputOntology, upperIRIs, lowerIRIs, annotationProperties, false, null);
-  }
-
-  /**
-   * Given an ontology, a set of upper-level IRIs, a set of lower-level IRIs, a set of annotation
-   * properties, and a boolean indiciating if rdfs:isDefinedBy should be added to copied classes,
-   * return a new ontology with just the named ancestors of those terms, their subclass relations,
-   * and the selected annotations. The input ontology is not changed.
-   *
-   * @param inputOntology the ontology to extract from
-   * @param upperIRIs ancestors will be copied up to and including these terms
-   * @param lowerIRIs copy these terms and their superclasses
-   * @param annotationProperties the annotation properties to copy; if null, all will be copied
-   * @param annotateSource if true, annotate copied classes with rdfs:isDefinedBy
-   * @param sourceMap map of term IRI to source IRI
-   * @return a new ontology with the target terms and their named ancestors
-   * @throws OWLOntologyCreationException on problems creating new ontology
-   */
-  public static OWLOntology getAncestors(
-      OWLOntology inputOntology,
-      Set<IRI> upperIRIs,
-      Set<IRI> lowerIRIs,
-      Set<OWLAnnotationProperty> annotationProperties,
-      boolean annotateSource,
-      Map<IRI, IRI> sourceMap)
-      throws OWLOntologyCreationException {
     logger.debug("Extract with MIREOT ...");
 
     OWLReasonerFactory reasonerFactory = new StructuralReasonerFactory();
@@ -99,27 +79,15 @@ public class MireotOperation {
     Set<OWLEntity> upperEntities = OntologyHelper.getEntities(inputOntology, upperIRIs);
     for (OWLEntity entity : upperEntities) {
       OntologyHelper.copy(inputOntology, outputOntology, entity, annotationProperties);
-      if (annotateSource) {
-        maybeAnnotateSource(outputOntology, outputManager, entity, sourceMap);
-      }
     }
 
     Set<OWLEntity> lowerEntities = OntologyHelper.getEntities(inputOntology, lowerIRIs);
     for (OWLEntity entity : lowerEntities) {
       OntologyHelper.copy(inputOntology, outputOntology, entity, annotationProperties);
-      if (annotateSource) {
-        maybeAnnotateSource(outputOntology, outputManager, entity, sourceMap);
-      }
       copyAncestors(
-          reasoner,
-          inputOntology,
-          outputOntology,
-          upperEntities,
-          entity,
-          annotationProperties,
-          annotateSource,
-          sourceMap);
+          reasoner, inputOntology, outputOntology, upperEntities, entity, annotationProperties);
     }
+
     return outputOntology;
   }
 
@@ -135,7 +103,6 @@ public class MireotOperation {
    * @param upperEntities the top level of entities, or null
    * @param entity the target entity that will have its ancestors copied
    * @param annotationProperties the annotations to copy, or null for all
-   * @param annotateSource if true, annotate copied classes with rdfs:isDefinedBy
    */
   private static void copyAncestors(
       OWLReasoner reasoner,
@@ -143,9 +110,7 @@ public class MireotOperation {
       OWLOntology outputOntology,
       Set<OWLEntity> upperEntities,
       OWLEntity entity,
-      Set<OWLAnnotationProperty> annotationProperties,
-      boolean annotateSource,
-      Map<IRI, IRI> sourceMap) {
+      Set<OWLAnnotationProperty> annotationProperties) {
     OWLOntologyManager outputManager = outputOntology.getOWLOntologyManager();
 
     // If this is an upperEntity, copy it and return.
@@ -168,9 +133,7 @@ public class MireotOperation {
             outputOntology,
             upperEntities,
             superclass,
-            annotationProperties,
-            annotateSource,
-            sourceMap);
+            annotationProperties);
       }
     } else if (entity.isOWLAnnotationProperty()) {
       Collection<OWLAnnotationProperty> superproperies =
@@ -187,9 +150,7 @@ public class MireotOperation {
             outputOntology,
             upperEntities,
             superproperty,
-            annotationProperties,
-            annotateSource,
-            sourceMap);
+            annotationProperties);
       }
     } else if (entity.isOWLObjectProperty()) {
       Set<OWLObjectPropertyExpression> superproperies =
@@ -210,9 +171,7 @@ public class MireotOperation {
             outputOntology,
             upperEntities,
             superproperty,
-            annotationProperties,
-            annotateSource,
-            sourceMap);
+            annotationProperties);
       }
     } else if (entity.isOWLDataProperty()) {
       Set<OWLDataProperty> superproperies =
@@ -228,16 +187,9 @@ public class MireotOperation {
             outputOntology,
             upperEntities,
             superproperty,
-            annotationProperties,
-            annotateSource,
-            sourceMap);
+            annotationProperties);
       }
     }
-
-    // Annotate with rdfs:isDefinedBy (maybe)
-    if (annotateSource) {
-      maybeAnnotateSource(outputOntology, outputManager, entity, sourceMap);
-    }
   }
 
   /**
@@ -256,29 +208,6 @@ public class MireotOperation {
       Set<IRI> upperIRIs,
       Set<OWLAnnotationProperty> annotationProperties)
       throws OWLOntologyCreationException {
-    return getDescendants(inputOntology, upperIRIs, annotationProperties, false, null);
-  }
-
-  /**
-   * Given an ontology, a set of upper-level IRIs, and a set of annotation properties, return a new
-   * ontology with just those terms and their named descendants, their subclass relations, and the
-   * selected annotations. The input ontology is not changed.
-   *
-   * @param inputOntology the ontology to extract from
-   * @param upperIRIs these terms and their descendants will be copied
-   * @param annotationProperties the annotation properties to copy; if null, all will be copied
-   * @param annotateSource if true, annotate copied classes with rdfs:isDefinedBy
-   * @param sourceMap map of term IRI to source IRI
-   * @return a new ontology with the target terms and their named ancestors
-   * @throws OWLOntologyCreationException on problems creating new ontology
-   */
-  public static OWLOntology getDescendants(
-      OWLOntology inputOntology,
-      Set<IRI> upperIRIs,
-      Set<OWLAnnotationProperty> annotationProperties,
-      boolean annotateSource,
-      Map<IRI, IRI> sourceMap)
-      throws OWLOntologyCreationException {
     logger.debug("Extract with MIREOT ...");
 
     OWLReasonerFactory reasonerFactory = new StructuralReasonerFactory();
@@ -290,17 +219,7 @@ public class MireotOperation {
     Set<OWLEntity> upperEntities = OntologyHelper.getEntities(inputOntology, upperIRIs);
     for (OWLEntity entity : upperEntities) {
       OntologyHelper.copy(inputOntology, outputOntology, entity, annotationProperties);
-      if (annotateSource) {
-        maybeAnnotateSource(outputOntology, outputManager, entity, sourceMap);
-      }
-      copyDescendants(
-          reasoner,
-          inputOntology,
-          outputOntology,
-          entity,
-          annotationProperties,
-          annotateSource,
-          sourceMap);
+      copyDescendants(reasoner, inputOntology, outputOntology, entity, annotationProperties);
     }
 
     return outputOntology;
@@ -317,18 +236,16 @@ public class MireotOperation {
    * @param outputOntology the ontology to copy to
    * @param entity the target entity that will have its descendants copied
    * @param annotationProperties the annotations to copy, or null for all
-   * @param annotateSource if true, annotate copied classes with rdfs:isDefinedBy
    */
   private static void copyDescendants(
       OWLReasoner reasoner,
       OWLOntology inputOntology,
       OWLOntology outputOntology,
       OWLEntity entity,
-      Set<OWLAnnotationProperty> annotationProperties,
-      boolean annotateSource,
-      Map<IRI, IRI> sourceMap) {
+      Set<OWLAnnotationProperty> annotationProperties) {
     OWLOntologyManager outputManager = outputOntology.getOWLOntologyManager();
 
+    // Otherwise copy descendants recursively.
     if (entity.isOWLClass()) {
       Set<OWLClass> subclasses = reasoner.getSubClasses(entity.asOWLClass(), true).getFlattened();
       for (OWLClass subclass : subclasses) {
@@ -338,14 +255,7 @@ public class MireotOperation {
         OntologyHelper.copy(inputOntology, outputOntology, subclass, annotationProperties);
         outputManager.addAxiom(
             outputOntology, dataFactory.getOWLSubClassOfAxiom(subclass, entity.asOWLClass()));
-        copyDescendants(
-            reasoner,
-            inputOntology,
-            outputOntology,
-            subclass,
-            annotationProperties,
-            annotateSource,
-            sourceMap);
+        copyDescendants(reasoner, inputOntology, outputOntology, subclass, annotationProperties);
       }
     } else if (entity.isOWLAnnotationProperty()) {
       Collection<OWLAnnotationProperty> subproperies =
@@ -356,14 +266,7 @@ public class MireotOperation {
             outputOntology,
             dataFactory.getOWLSubAnnotationPropertyOfAxiom(
                 subproperty, entity.asOWLAnnotationProperty()));
-        copyDescendants(
-            reasoner,
-            inputOntology,
-            outputOntology,
-            subproperty,
-            annotationProperties,
-            annotateSource,
-            sourceMap);
+        copyDescendants(reasoner, inputOntology, outputOntology, subproperty, annotationProperties);
       }
     } else if (entity.isOWLObjectProperty()) {
       Set<OWLObjectPropertyExpression> subproperies =
@@ -377,14 +280,7 @@ public class MireotOperation {
         outputManager.addAxiom(
             outputOntology,
             dataFactory.getOWLSubObjectPropertyOfAxiom(subproperty, entity.asOWLObjectProperty()));
-        copyDescendants(
-            reasoner,
-            inputOntology,
-            outputOntology,
-            subproperty,
-            annotationProperties,
-            annotateSource,
-            sourceMap);
+        copyDescendants(reasoner, inputOntology, outputOntology, subproperty, annotationProperties);
       }
     } else if (entity.isOWLDataProperty()) {
       Set<OWLDataProperty> subproperies =
@@ -394,38 +290,8 @@ public class MireotOperation {
         outputManager.addAxiom(
             outputOntology,
             dataFactory.getOWLSubDataPropertyOfAxiom(subproperty, entity.asOWLDataProperty()));
-        copyDescendants(
-            reasoner,
-            inputOntology,
-            outputOntology,
-            subproperty,
-            annotationProperties,
-            annotateSource,
-            sourceMap);
+        copyDescendants(reasoner, inputOntology, outputOntology, subproperty, annotationProperties);
       }
     }
-
-    // Annotate with rdfs:isDefinedBy (maybe)
-    if (annotateSource) {
-      maybeAnnotateSource(outputOntology, outputManager, entity, sourceMap);
-    }
-  }
-
-  /**
-   * Given an ontology, a manager for that ontology, an entity to annotate, and a map of source
-   * replacements, add the rdfs:isDefinedBy annotation to the entity.
-   *
-   * @param ontology OWLOntology to add annotation in
-   * @param manager OWLManager for the ontology
-   * @param entity OWLEntity to add annotation on
-   * @param sourceMap term-to-source map
-   */
-  private static void maybeAnnotateSource(
-      OWLOntology ontology, OWLOntologyManager manager, OWLEntity entity, Map<IRI, IRI> sourceMap) {
-    Set<OWLAnnotationValue> existingValues =
-        OntologyHelper.getAnnotationValues(ontology, isDefinedBy, entity.getIRI());
-    if (existingValues == null || existingValues.size() == 0) {
-      manager.addAxiom(ontology, ExtractOperation.getIsDefinedBy(entity, sourceMap));
-    }
   }
 }
diff --git a/robot-core/src/main/java/org/obolibrary/robot/OntologyHelper.java b/robot-core/src/main/java/org/obolibrary/robot/OntologyHelper.java
index cdd934db..0919f6d4 100644
--- a/robot-core/src/main/java/org/obolibrary/robot/OntologyHelper.java
+++ b/robot-core/src/main/java/org/obolibrary/robot/OntologyHelper.java
@@ -166,7 +166,6 @@ public class OntologyHelper {
       return;
     }
 
-    // Add declaration
     OWLOntologyManager outputManager = outputOntology.getOWLOntologyManager();
     if (entity.isOWLAnnotationProperty()) {
       outputManager.addAxiom(
@@ -188,7 +187,6 @@ public class OntologyHelper {
           outputOntology, dataFactory.getOWLDeclarationAxiom(entity.asOWLNamedIndividual()));
     }
 
-    // Copy the axioms
     Set<OWLAnnotationAssertionAxiom> axioms =
         inputOntology.getAnnotationAssertionAxioms(entity.getIRI());
     for (OWLAnnotationAssertionAxiom axiom : axioms) {
diff --git a/robot-core/src/main/java/org/obolibrary/robot/QueryOperation.java b/robot-core/src/main/java/org/obolibrary/robot/QueryOperation.java
index 0cc231cb..2e295b8a 100644
--- a/robot-core/src/main/java/org/obolibrary/robot/QueryOperation.java
+++ b/robot-core/src/main/java/org/obolibrary/robot/QueryOperation.java
@@ -2,7 +2,10 @@ package org.obolibrary.robot;
 
 import java.io.*;
 import java.nio.file.Path;
-import java.util.*;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+import java.util.UUID;
 import org.apache.jena.query.*;
 import org.apache.jena.rdf.model.Model;
 import org.apache.jena.rdf.model.ModelFactory;
@@ -12,10 +15,11 @@ import org.apache.jena.sparql.core.DatasetGraph;
 import org.apache.jena.sparql.core.DatasetGraphFactory;
 import org.apache.jena.tdb.TDB;
 import org.apache.jena.tdb.TDBFactory;
-import org.apache.jena.update.UpdateAction;
-import org.semanticweb.owlapi.apibinding.OWLManager;
 import org.semanticweb.owlapi.formats.TurtleDocumentFormat;
-import org.semanticweb.owlapi.model.*;
+import org.semanticweb.owlapi.model.IRI;
+import org.semanticweb.owlapi.model.OWLOntology;
+import org.semanticweb.owlapi.model.OWLOntologyManager;
+import org.semanticweb.owlapi.model.OWLOntologyStorageException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -91,7 +95,11 @@ public class QueryOperation {
     TDB.getContext().set(TDB.symUnionDefaultGraph, true);
     // Load each ontology in the set as a named model
     for (OWLOntology ont : ontologies) {
-      Model m = loadOntologyAsModel(ont);
+      Model m = ModelFactory.createDefaultModel();
+      ByteArrayOutputStream os = new ByteArrayOutputStream();
+      manager.saveOntology(ont, new TurtleDocumentFormat(), os);
+      String content = new String(os.toByteArray(), "UTF-8");
+      RDFParser.fromString(content).lang(RDFLanguages.TTL).parse(m);
       // Get the name of the graph as the ontology IRI
       IRI iri = ont.getOntologyID().getOntologyIRI().orNull();
       String name;
@@ -101,44 +109,12 @@ public class QueryOperation {
         // If there is no IRI, generate a random ID
         name = UUID.randomUUID().toString();
       }
-      logger.info("Named graph added: " + name);
       dataset.addNamedModel(name, m);
+      logger.info("Named graph added: " + name);
     }
     return dataset;
   }
 
-  /**
-   * Given an OWLOntology, return the Model representation of the axioms.
-   *
-   * @param ontology OWLOntology to convert to Model
-   * @return Model of axioms (imports ignored)
-   * @throws UnsupportedEncodingException on issue parsing byte array to string
-   * @throws OWLOntologyStorageException on issue writing ontology to TTL format
-   */
-  public static Model loadOntologyAsModel(OWLOntology ontology)
-      throws UnsupportedEncodingException, OWLOntologyStorageException {
-    Model model = ModelFactory.createDefaultModel();
-    ByteArrayOutputStream os = new ByteArrayOutputStream();
-    ontology.getOWLOntologyManager().saveOntology(ontology, new TurtleDocumentFormat(), os);
-    String content = new String(os.toByteArray(), "UTF-8");
-    RDFParser.fromString(content).lang(RDFLanguages.TTL).parse(model);
-    return model;
-  }
-
-  /**
-   * Given a Model, return the OWLOntology representation of the axioms.
-   *
-   * @param model Model to convert to OWLOntology
-   * @return OWLOntology of axioms
-   * @throws OWLOntologyCreationException on issue loading ontology from byte array
-   */
-  public static OWLOntology convertModel(Model model) throws OWLOntologyCreationException {
-    ByteArrayOutputStream os = new ByteArrayOutputStream();
-    RDFDataMgr.write(os, model, Lang.TTL);
-    OWLOntologyManager manager = OWLManager.createOWLOntologyManager();
-    return manager.loadOntologyFromOntologyDocument(new ByteArrayInputStream(os.toByteArray()));
-  }
-
   /**
    * Count results.
    *
@@ -215,16 +191,6 @@ public class QueryOperation {
     return qExec.execSelect();
   }
 
-  /**
-   * Given a Model and a SPARQL update (as string), update the model.
-   *
-   * @param model Model to update
-   * @param updateString SPARQL update
-   */
-  public static void execUpdate(Model model, String updateString) {
-    UpdateAction.parseExecute(updateString, model);
-  }
-
   /**
    * Execute a verification. Writes to STDERR.
    *
@@ -578,24 +544,6 @@ public class QueryOperation {
     }
   }
 
-  /**
-   * Given a Model, a SPARQL update string, an output stream, and the output format, update the
-   * model and write it to the output.
-   *
-   * @param model Model to update
-   * @param updateString SPARQL update
-   * @param output output stream to write to
-   * @param outputFormat the file format
-   */
-  public static void runUpdate(Model model, String updateString, File output, Lang outputFormat)
-      throws FileNotFoundException {
-    if (outputFormat == null) {
-      outputFormat = Lang.TTL;
-    }
-    execUpdate(model, updateString);
-    writeResult(model, outputFormat, new FileOutputStream(output));
-  }
-
   /**
    * Run a SELECT query over the graph and write the result to a file. Prints violations to STDERR.
    *
diff --git a/robot-core/src/main/java/org/obolibrary/robot/ReasonOperation.java b/robot-core/src/main/java/org/obolibrary/robot/ReasonOperation.java
index f142ba94..180365c6 100644
--- a/robot-core/src/main/java/org/obolibrary/robot/ReasonOperation.java
+++ b/robot-core/src/main/java/org/obolibrary/robot/ReasonOperation.java
@@ -2,19 +2,12 @@ package org.obolibrary.robot;
 
 import static org.obolibrary.robot.reason.EquivalentClassReasoningMode.ALL;
 
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.function.Function;
+import java.util.*;
 import java.util.stream.Collectors;
 import org.geneontology.reasoner.ExpressionMaterializingReasoner;
 import org.obolibrary.robot.checks.InvalidReferenceChecker;
 import org.obolibrary.robot.checks.InvalidReferenceViolation;
-import org.obolibrary.robot.exceptions.InvalidReferenceException;
-import org.obolibrary.robot.exceptions.OntologyLogicException;
+import org.obolibrary.robot.exceptions.*;
 import org.obolibrary.robot.reason.EquivalentClassReasoning;
 import org.obolibrary.robot.reason.EquivalentClassReasoningMode;
 import org.semanticweb.owlapi.apibinding.OWLManager;
@@ -24,9 +17,7 @@ import org.semanticweb.owlapi.reasoner.InferenceType;
 import org.semanticweb.owlapi.reasoner.Node;
 import org.semanticweb.owlapi.reasoner.OWLReasoner;
 import org.semanticweb.owlapi.reasoner.OWLReasonerFactory;
-import org.semanticweb.owlapi.util.InferredAxiomGenerator;
-import org.semanticweb.owlapi.util.InferredOntologyGenerator;
-import org.semanticweb.owlapi.util.InferredSubClassAxiomGenerator;
+import org.semanticweb.owlapi.util.*;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -57,115 +48,216 @@ public class ReasonOperation {
     options.put("prevent-invalid-references", "false");
     options.put("preserve-annotated-axioms", "false");
     options.put("dump-unsatisfiable", null);
+    options.put("axiom-generators", "subclass");
+    options.put("include-indirect", "false");
 
     return options;
   }
 
   /**
-   * Given an ontology, the name of a reasoner, and an output IRI, return the ontology with inferred
-   * axioms added, using the default reasoner options.
+   * Given an ontology and a reasoner factory, return the ontology with inferred axioms added after
+   * reasoning. Use default options.
    *
    * @param ontology the ontology to reason over
    * @param reasonerFactory the factory to create a reasoner instance from
-   * @throws OWLOntologyCreationException on ontology problem
-   * @throws OntologyLogicException on inconsistency or incoherency
-   * @throws InvalidReferenceException on unsatisfiable class(es)
+   * @throws Exception on any problem
    */
   public static void reason(OWLOntology ontology, OWLReasonerFactory reasonerFactory)
-      throws OWLOntologyCreationException, OntologyLogicException, InvalidReferenceException {
+      throws OntologyLogicException, OWLOntologyCreationException, InvalidReferenceException {
     reason(ontology, reasonerFactory, getDefaultOptions());
   }
 
   /**
-   * Given an ontology, the name of a reasoner, an output IRI, and an optional map of reasoner
-   * options, return the ontology with inferred axioms added.
+   * Given an ontology, a reasoner factory, and a map of options, return the ontology with inferred
+   * axioms added after reasoning.
    *
    * @param ontology the ontology to reason over
    * @param reasonerFactory the factory to create a reasoner instance from
    * @param options a map of option strings, or null
-   * @throws OWLOntologyCreationException on ontology problem
-   * @throws OntologyLogicException on inconsistency or incoherency
-   * @throws InvalidReferenceException on unsatisfiable class(es)
+   * @throws Exception on any problem
    */
   public static void reason(
       OWLOntology ontology, OWLReasonerFactory reasonerFactory, Map<String, String> options)
-      throws OWLOntologyCreationException, OntologyLogicException, InvalidReferenceException {
+      throws OntologyLogicException, OWLOntologyCreationException, InvalidReferenceException {
     logger.info("Ontology has {} axioms.", ontology.getAxioms().size());
 
-    logger.info("Fetching labels...");
+    // TODO - what is this for?
+    // logger.info("Fetching labels...");
+    // Function<OWLNamedObject, String> labelFunc = OntologyHelper.getLabelFunction(ontology,
+    // false);
 
-    Function<OWLNamedObject, String> labelFunc = OntologyHelper.getLabelFunction(ontology, false);
+    // Check the ontology for reference violations
+    // Maybe fail if prevent-invalid-references
+    checkReferenceViolations(ontology, options);
 
-    int seconds;
-    long elapsedTime;
-    long startTime = System.currentTimeMillis();
+    // Get the reasoner and run initial reasoning
+    // No axioms are asserted in this step
+    OWLReasoner reasoner = reasonerFactory.createReasoner(ontology);
+    reason(ontology, reasoner, options);
+
+    // Get the axiom generators
+    // If none are provided, just default to subclass
+    String axGeneratorString = OptionsHelper.getOption(options, "axiom-generators", "subclass");
+    List<String> axGenerators = Arrays.asList(axGeneratorString.split(" "));
+    List<InferredAxiomGenerator<? extends OWLAxiom>> gens =
+        ReasonerHelper.getInferredAxiomGenerators(axGenerators);
+    logger.info("Using these axiom generators:");
+    for (InferredAxiomGenerator<?> inf : gens) {
+      logger.info("    " + inf);
+    }
 
-    OWLOntologyManager manager = OWLManager.createOWLOntologyManager();
-    OWLDataFactory dataFactory = manager.getOWLDataFactory();
+    // Assert inferred axioms in the ontology
+    assertInferred(ontology, reasoner, gens, options);
+  }
 
-    Set<InvalidReferenceViolation> referenceViolations =
-        InvalidReferenceChecker.getInvalidReferenceViolations(ontology, false);
-    if (referenceViolations.size() > 0) {
-      logger.error(
-          "Reference violations found: "
-              + referenceViolations.size()
-              + " - reasoning may be incomplete");
+  /**
+   * Remove subClassAxioms where there is a more direct axiom, and the subClassAxiom does not have
+   * any annotations.
+   *
+   * <p>Example: genotyping assay - asserted in dev: assay - inferred by reasoner: analyte assay -
+   * asserted after fill: assay, analyte assay - asserted after removeRedundantSubClassAxioms:
+   * analyte assay
+   *
+   * @param reasoner an OWL reasoner, initialized with a root ontology; the ontology will be
+   *     modified
+   */
+  public static void removeRedundantSubClassAxioms(OWLReasoner reasoner) {
+    removeRedundantSubClassAxioms(reasoner, null);
+  }
 
-      int maxDanglings = 10;
-      int danglings = 0;
-      for (InvalidReferenceViolation v : referenceViolations) {
+  /**
+   * Remove subClassAxioms where there is a more direct axiom, and the subClassAxiom does not have
+   * any annotations.
+   *
+   * <p>Example: genotyping assay - asserted in dev: assay - inferred by reasoner: analyte assay -
+   * asserted after fill: assay, analyte assay - asserted after removeRedundantSubClassAxioms:
+   * analyte assay
+   *
+   * @param reasoner an OWL reasoner, initialized with a root ontology; the ontology will be
+   *     modified
+   * @param options map of options for reasoning
+   */
+  public static void removeRedundantSubClassAxioms(
+      OWLReasoner reasoner, Map<String, String> options) {
+    logger.info("Removing redundant subclass axioms...");
+    OWLOntology ontology = reasoner.getRootOntology();
+    OWLOntologyManager manager = ontology.getOWLOntologyManager();
+    OWLDataFactory dataFactory = manager.getOWLDataFactory();
 
-        if (v.getCategory().equals(InvalidReferenceViolation.Category.DANGLING)
-            && danglings < maxDanglings) {
-          logger.error("Reference violation: " + v);
-          danglings++;
-        } else if (!v.getCategory().equals(InvalidReferenceViolation.Category.DANGLING)) {
-          logger.error("Reference violation: " + v);
+    for (OWLClass thisClass : ontology.getClassesInSignature()) {
+      if (thisClass.isOWLNothing() || thisClass.isOWLThing()) {
+        continue;
+      }
+
+      // Use the reasoner to get all
+      // the direct superclasses of this class.
+      Set<OWLClass> inferredSuperClasses = new HashSet<>();
+      for (Node<OWLClass> node : reasoner.getSuperClasses(thisClass, true)) {
+        for (OWLClass inferredSuperClass : node) {
+          inferredSuperClasses.add(inferredSuperClass);
         }
       }
 
-      if (OptionsHelper.optionIsTrue(options, "prevent-invalid-references")) {
-        throw new InvalidReferenceException(referenceViolations);
+      // For each subClassAxiom,
+      // if the subclass axiom does not have any annotations,
+      // and the superclass is named (not anonymous),
+      // and the superclass is not in the set of inferred super classes,
+      // then remove that axiom.
+      for (OWLSubClassOfAxiom subClassAxiom : ontology.getSubClassAxiomsForSubClass(thisClass)) {
+        if (OptionsHelper.optionIsTrue(options, "preserve-annotated-axioms")) {
+
+          if (subClassAxiom.getAnnotations().size() > 0) {
+            // TODO make this configurable
+            continue;
+          }
+        }
+        if (subClassAxiom.getSuperClass().isAnonymous()) {
+          continue;
+        }
+        OWLClass assertedSuperClass = subClassAxiom.getSuperClass().asOWLClass();
+        if (inferredSuperClasses.contains(assertedSuperClass)) {
+          continue;
+        }
+        manager.removeAxiom(
+            ontology, dataFactory.getOWLSubClassOfAxiom(thisClass, assertedSuperClass));
       }
     }
+    logger.info("Ontology now has {} axioms.", ontology.getAxioms().size());
+  }
 
-    logger.info("Starting reasoning...");
-    OWLReasoner reasoner = reasonerFactory.createReasoner(ontology);
-
-    String dumpFilePath = OptionsHelper.getOption(options, "dump-unsatisfiable", null);
-    ReasonerHelper.validate(reasoner, dumpFilePath);
+  /**
+   * Given an ontology, a reasoner, a list of axiom generators, and a map of options, assert the
+   * inferred axioms in the ontology.
+   *
+   * @param ontology OWLOntology to assert new axioms in
+   * @param reasoner OWLReasoner to use to assert axioms
+   * @param gens InferredAxiomGenerators to use
+   * @param options map of reason options
+   * @throws OWLOntologyCreationException on problem creating a new axiom ontology
+   */
+  private static void assertInferred(
+      OWLOntology ontology,
+      OWLReasoner reasoner,
+      List<InferredAxiomGenerator<? extends OWLAxiom>> gens,
+      Map<String, String> options)
+      throws OWLOntologyCreationException {
+    long startTime = System.currentTimeMillis();
+    // Create an ontology with ONLY the newly inferred axioms
+    // Use this to check against the updated ontology with both inferred and asserted axioms
+    OWLOntology newAxiomOntology = getNewAxiomOntology(ontology, reasoner, gens, options);
 
-    logger.info("Precomputing class hierarchy...");
-    reasoner.precomputeInferences(InferenceType.CLASS_HIERARCHY);
+    // If create-new-ontology or create-new-ontology-with-annotations
+    // remove the axioms from the input ontology (maybe keeping annotations)
+    maybeCreateNewOntology(ontology, options);
 
-    EquivalentClassReasoningMode mode =
-        EquivalentClassReasoningMode.from(options.getOrDefault("equivalent-classes-allowed", ""));
-    logger.info("Finding equivalencies...");
+    // Add the inferred axioms to input ontology from the new axiom ontology
+    addInferredAxioms(ontology, newAxiomOntology, options);
 
-    EquivalentClassReasoning equivalentReasoning =
-        new EquivalentClassReasoning(ontology, reasoner, mode);
-    boolean passesEquivalenceTests = equivalentReasoning.reason();
-    equivalentReasoning.logReport(logger);
-    if (!passesEquivalenceTests) {
-      System.exit(1);
+    // Maybe use the reasoner to remove redundant subclass axioms (reduce)
+    if (OptionsHelper.optionIsTrue(options, "remove-redundant-subclass-axioms")) {
+      removeRedundantSubClassAxioms(reasoner, options);
     }
-    // cache the complete set of asserted axioms at the initial state.
-    // we will later use this if the -x option is passed, to avoid
-    // asserting inferred axioms that are duplicates of existing axioms
-    Set<OWLAxiom> existingAxioms = ontology.getAxioms(Imports.INCLUDED);
+    logger.info("Ontology has {} axioms after all reasoning steps.", ontology.getAxioms().size());
 
-    // Make sure to add the axiom generators in this way!!!
-    List<InferredAxiomGenerator<? extends OWLAxiom>> gens = new ArrayList<>();
-    gens.add(new InferredSubClassAxiomGenerator());
-    InferredOntologyGenerator generator = new InferredOntologyGenerator(reasoner, gens);
-    logger.info("Using these axiom generators:");
-    for (InferredAxiomGenerator<?> inf : generator.getAxiomGenerators()) {
-      logger.info("    " + inf);
-    }
+    float elapsedTime = System.currentTimeMillis() - startTime;
+    long seconds = (long) Math.ceil(elapsedTime / 1000);
+    logger.info("Filling took {} seconds.", seconds);
+  }
 
-    elapsedTime = System.currentTimeMillis() - startTime;
-    seconds = (int) Math.ceil(elapsedTime / 1000);
-    logger.info("Reasoning took {} seconds.", seconds);
+  /**
+   * Given an ontology, a reasoner, a list of axiom generators, and map of reasoner options, create
+   * a new ontology containing only the newly generated axioms. If direct (in options) is false,
+   * include indirect axioms.
+   *
+   * @param ontology OWLOntology to reason over
+   * @param reasoner OWLReasoner to use
+   * @param gens list of InferredAxiomGenerators to generate axioms
+   * @param options reasoner options
+   * @return ontology containing newly generated axioms
+   * @throws OWLOntologyCreationException on problem creating new ontology
+   */
+  private static OWLOntology getNewAxiomOntology(
+      OWLOntology ontology,
+      OWLReasoner reasoner,
+      List<InferredAxiomGenerator<? extends OWLAxiom>> gens,
+      Map<String, String> options)
+      throws OWLOntologyCreationException {
+    OWLOntologyManager manager = ontology.getOWLOntologyManager();
+    OWLDataFactory dataFactory = manager.getOWLDataFactory();
+    boolean direct = !OptionsHelper.optionIsTrue(options, "include-indirect");
+
+    boolean subClass = false;
+    boolean classAssertion = false;
+    boolean subObjectProperty = false;
+    for (InferredAxiomGenerator g : gens) {
+      if (g instanceof InferredSubClassAxiomGenerator) {
+        subClass = true;
+      } else if (g instanceof InferredClassAssertionAxiomGenerator) {
+        classAssertion = true;
+      } else if (g instanceof InferredSubObjectPropertyAxiomGenerator) {
+        subObjectProperty = true;
+      }
+    }
 
     // we first place all inferred axioms into a new ontology;
     // these will be later transferred into the main ontology,
@@ -173,18 +265,36 @@ public class ReasonOperation {
     OWLOntology newAxiomOntology;
     newAxiomOntology = manager.createOntology();
 
-    startTime = System.currentTimeMillis();
+    InferredOntologyGenerator generator = new InferredOntologyGenerator(reasoner, gens);
     generator.fillOntology(dataFactory, newAxiomOntology);
 
+    // If EMR, add expressions instead of just classes, etc...
+    ExpressionMaterializingReasoner emr = null;
     if (reasoner instanceof ExpressionMaterializingReasoner) {
       logger.info("Creating expression materializing reasoner...");
-      ExpressionMaterializingReasoner emr = (ExpressionMaterializingReasoner) reasoner;
+      emr = (ExpressionMaterializingReasoner) reasoner;
       emr.materializeExpressions();
+      // Maybe add direct/indirect class expressions
+      if (subClass) {
+        for (OWLClass c : ontology.getClassesInSignature()) {
+          // Look at the superclasses because otherwise we would lose the anonymous exprs
+          Set<OWLClassExpression> sces = emr.getSuperClassExpressions(c, direct);
+          for (OWLClassExpression sce : sces) {
+            if (!sce.getSignature().contains(dataFactory.getOWLThing())) {
+              OWLAxiom ax = dataFactory.getOWLSubClassOfAxiom(c, sce);
+              logger.debug("NEW:" + ax);
+              manager.addAxiom(newAxiomOntology, ax);
+            }
+          }
+        }
+      }
+    } else if (subClass) {
+      // if not EMR and still using subclasses, do not use expressions
       for (OWLClass c : ontology.getClassesInSignature()) {
-        Set<OWLClassExpression> sces = emr.getSuperClassExpressions(c, true);
-        for (OWLClassExpression sce : sces) {
-          if (!sce.getSignature().contains(dataFactory.getOWLThing())) {
-            OWLAxiom ax = dataFactory.getOWLSubClassOfAxiom(c, sce);
+        Set<OWLClass> scs = reasoner.getSubClasses(c, direct).getFlattened();
+        for (OWLClass sc : scs) {
+          if (!sc.isOWLNothing()) {
+            OWLAxiom ax = dataFactory.getOWLSubClassOfAxiom(sc, c);
             logger.debug("NEW:" + ax);
             manager.addAxiom(newAxiomOntology, ax);
           }
@@ -192,13 +302,56 @@ public class ReasonOperation {
       }
     }
 
-    logger.info("Reasoning created {} new axioms.", newAxiomOntology.getAxioms().size());
+    // Maybe add direct/indirect class assertions
+    if (classAssertion) {
+      for (OWLClass c : ontology.getClassesInSignature()) {
+        Set<OWLNamedIndividual> inds = reasoner.getInstances(c, direct).getFlattened();
+        for (OWLNamedIndividual i : inds) {
+          OWLAxiom ax = dataFactory.getOWLClassAssertionAxiom(c, i);
+          logger.debug("NEW:" + ax);
+          manager.addAxiom(newAxiomOntology, ax);
+        }
+      }
+    }
 
+    // Maybe add direct/indirect object property expressions
+    if (subObjectProperty) {
+      for (OWLObjectProperty op : ontology.getObjectPropertiesInSignature()) {
+        // Look at superproperties so we can get the expressions
+        Set<OWLObjectPropertyExpression> sopes;
+        if (emr != null) {
+          sopes = emr.getSuperObjectProperties(op, direct).getFlattened();
+        } else {
+          sopes = reasoner.getSuperObjectProperties(op, direct).getFlattened();
+        }
+        for (OWLObjectPropertyExpression sope : sopes) {
+          if (!sope.getSignature().contains(dataFactory.getOWLTopObjectProperty())) {
+            OWLAxiom ax = dataFactory.getOWLSubObjectPropertyOfAxiom(op, sope);
+            logger.debug("NEW:" + ax);
+            manager.addAxiom(newAxiomOntology, ax);
+          }
+        }
+      }
+    }
+
+    return newAxiomOntology;
+  }
+
+  /**
+   * Given an input ontology, a new axiom ontology (created from reasoning), and a map of options,
+   * maybe remove asserted axioms from the input ontology if create-new-ontology or
+   * create-new-ontology-with-annotations. The input ontology is updated in place.
+   *
+   * @param ontology OWLOntology to maybe update
+   * @param options Map of reason options
+   */
+  private static void maybeCreateNewOntology(OWLOntology ontology, Map<String, String> options) {
+    OWLOntologyManager manager = OWLManager.createOWLOntologyManager();
+
+    // If we need to "create" a new ontology,
+    // we actually just remove any asserted axioms from the input ontology
     if (OptionsHelper.optionIsTrue(options, "create-new-ontology")
         || OptionsHelper.optionIsTrue(options, "create-new-ontology-with-annotations")) {
-      // because the ontology is passed by reference,
-      // we manipulate it in place
-      // todo: set ontology id
       if (OptionsHelper.optionIsTrue(options, "create-new-ontology-with-annotations")) {
         logger.info("Placing inferred axioms with annotations into a new ontology");
         manager.removeAxioms(
@@ -220,15 +373,25 @@ public class ReasonOperation {
         manager.applyChange(ri);
       }
     }
+  }
 
-    IRI propertyIRI = null;
-    OWLAnnotationValue value = null;
-    if (OptionsHelper.optionIsTrue(options, "annotate-inferred-axioms")) {
-      // the default is the convention used by OWLTools and GO, which is
-      // the property is_inferred with a literal (note: not xsd) "true"
-      propertyIRI = IRI.create("http://www.geneontology.org/formats/oboInOwl#is_inferred");
-      value = dataFactory.getOWLLiteral("true");
-    }
+  /**
+   * Given an ontology, an ontology containing only inferred axioms, and a map of options, add the
+   * inferred axioms to the input ontology. Updates the input ontology in place.
+   *
+   * @param ontology OWLOntology to add inferred axioms to
+   * @param newAxiomOntology OWLOntology containing inferred axioms
+   * @param options Map of reason options
+   */
+  private static void addInferredAxioms(
+      OWLOntology ontology, OWLOntology newAxiomOntology, Map<String, String> options) {
+    OWLOntologyManager manager = OWLManager.createOWLOntologyManager();
+    OWLDataFactory dataFactory = manager.getOWLDataFactory();
+
+    // cache the complete set of asserted axioms at the initial state.
+    // we will later use this if the -x option is passed, to avoid
+    // asserting inferred axioms that are duplicates of existing axioms
+    Set<OWLAxiom> existingAxioms = ontology.getAxioms(Imports.INCLUDED);
 
     // get all entities that 'belong' to the main ontology
     // see: https://github.com/ontodev/robot/issues/296
@@ -238,16 +401,32 @@ public class ReasonOperation {
             .stream()
             .map(OWLDeclarationAxiom::getEntity)
             .collect(Collectors.toSet());
+
+    // Get a property and value to annotate inferred axioms
+    IRI propertyIRI = null;
+    OWLAnnotationValue value = null;
+    if (OptionsHelper.optionIsTrue(options, "annotate-inferred-axioms")) {
+      // the default is the convention used by OWLTools and GO, which is
+      // the property is_inferred with a literal (note: not xsd) "true"
+      propertyIRI = IRI.create("http://www.geneontology.org/formats/oboInOwl#is_inferred");
+      value = dataFactory.getOWLLiteral("true");
+    }
+
+    // Look at each inferred axiom
+    // Check the options, and maybe add the inferred axiom to the ontology
     for (OWLAxiom a : newAxiomOntology.getAxioms()) {
+
       if (OptionsHelper.optionIsTrue(options, "exclude-external-entities")) {
         if (a instanceof OWLClassAxiom) {
           boolean overlapsSignature = false;
+          // Check that each class in the axiom is DECLARED in the input ontology
           for (OWLClass c : a.getClassesInSignature()) {
             if (ontologyEntities.contains(c)) {
               overlapsSignature = true;
               break;
             }
           }
+          // If one or more class(es) is not in the input ontology, skip this axiom
           if (!overlapsSignature) {
             logger.debug("Excluding axiom as class signatures do not overlap: " + a);
             continue;
@@ -269,101 +448,101 @@ public class ReasonOperation {
           continue;
         }
       }
+
       if (OptionsHelper.optionIsTrue(options, "exclude-duplicate-axioms")
           || OptionsHelper.optionIsTrue(options, "exclude-owl-thing")) {
         if (a.containsEntityInSignature(dataFactory.getOWLThing())) {
+          // If axiom contains owl:Thing, skip it
           logger.debug("Ignoring trivial axioms with " + "OWLThing in signature: " + a);
           continue;
         }
       }
+
+      // If the axiom has not been skipped, add it to the ontology
       manager.addAxiom(ontology, a);
+      // If propertyIRI isn't null, we are annotating the inferred axioms
+      // Add that annotation here
       if (propertyIRI != null) {
         OntologyHelper.addAxiomAnnotation(ontology, a, propertyIRI, value);
       }
     }
-
-    if (OptionsHelper.optionIsTrue(options, "remove-redundant-subclass-axioms")) {
-      removeRedundantSubClassAxioms(reasoner, options);
-    }
-    logger.info("Ontology has {} axioms after all reasoning steps.", ontology.getAxioms().size());
-
-    elapsedTime = System.currentTimeMillis() - startTime;
-    seconds = (int) Math.ceil(elapsedTime / 1000);
-    logger.info("Filling took {} seconds.", seconds);
   }
 
   /**
-   * Remove subClassAxioms where there is a more direct axiom, and the subClassAxiom does not have
-   * any annotations.
-   *
-   * <p>Example: genotyping assay - asserted in dev: assay - inferred by reasoner: analyte assay -
-   * asserted after fill: assay, analyte assay - asserted after removeRedundantSubClassAxioms:
-   * analyte assay
+   * Given an ontology and a map of options, find any reference violations in the ontology. If
+   * prevent-invalid-references, fail on any invalid reference violations.
    *
-   * @param reasoner an OWL reasoner, initialized with a root ontology; the ontology will be
-   *     modified
+   * @param ontology OWLOntology to check
+   * @param options map of reason options
+   * @throws InvalidReferenceException on invalid reference, if prevent-invalid-references
    */
-  public static void removeRedundantSubClassAxioms(OWLReasoner reasoner) {
-    removeRedundantSubClassAxioms(reasoner, null);
+  private static void checkReferenceViolations(OWLOntology ontology, Map<String, String> options)
+      throws InvalidReferenceException {
+    Set<InvalidReferenceViolation> referenceViolations =
+        InvalidReferenceChecker.getInvalidReferenceViolations(ontology, false);
+    if (referenceViolations.size() > 0) {
+      logger.error(
+          "Reference violations found: "
+              + referenceViolations.size()
+              + " - reasoning may be incomplete");
+
+      int maxDanglings = 10;
+      int danglings = 0;
+      for (InvalidReferenceViolation v : referenceViolations) {
+
+        if (v.getCategory().equals(InvalidReferenceViolation.Category.DANGLING)
+            && danglings < maxDanglings) {
+          logger.error("Reference violation: " + v);
+          danglings++;
+        } else if (!v.getCategory().equals(InvalidReferenceViolation.Category.DANGLING)) {
+          logger.error("Reference violation: " + v);
+        }
+      }
+
+      if (OptionsHelper.optionIsTrue(options, "prevent-invalid-references")) {
+        throw new InvalidReferenceException(referenceViolations);
+      }
+    }
   }
 
   /**
-   * Remove subClassAxioms where there is a more direct axiom, and the subClassAxiom does not have
-   * any annotations.
+   * Given an ontology, a reasoner, and a map of options, use the reasoner to validate the ontology,
+   * compute class hierarchy, and find equivalencies.
    *
-   * <p>Example: genotyping assay - asserted in dev: assay - inferred by reasoner: analyte assay -
-   * asserted after fill: assay, analyte assay - asserted after removeRedundantSubClassAxioms:
-   * analyte assay
-   *
-   * @param reasoner an OWL reasoner, initialized with a root ontology; the ontology will be
-   *     modified
-   * @param options map of options for reasoning
+   * @param ontology OWLOntology to reason over
+   * @param reasoner OWLReasoner to use
+   * @param options Map of reason options
+   * @throws InconsistentOntologyException on invalid ontology
+   * @throws IncoherentRBoxException on invalid ontology
+   * @throws IncoherentTBoxException on invalid ontology
    */
-  public static void removeRedundantSubClassAxioms(
-      OWLReasoner reasoner, Map<String, String> options) {
-    logger.info("Removing redundant subclass axioms...");
-    OWLOntology ontology = reasoner.getRootOntology();
-    OWLOntologyManager manager = ontology.getOWLOntologyManager();
-    OWLDataFactory dataFactory = manager.getOWLDataFactory();
+  private static void reason(
+      OWLOntology ontology, OWLReasoner reasoner, Map<String, String> options)
+      throws InconsistentOntologyException, IncoherentRBoxException, IncoherentTBoxException {
+    long startTime = System.currentTimeMillis();
+    logger.info("Starting reasoning...");
 
-    for (OWLClass thisClass : ontology.getClassesInSignature()) {
-      if (thisClass.isOWLNothing() || thisClass.isOWLThing()) {
-        continue;
-      }
+    // Validate and maybe dump the unsat classes into a file
+    String dumpFilePath = OptionsHelper.getOption(options, "dump-unsatisfiable", null);
+    ReasonerHelper.validate(reasoner, dumpFilePath);
 
-      // Use the reasoner to get all
-      // the direct superclasses of this class.
-      Set<OWLClass> inferredSuperClasses = new HashSet<>();
-      for (Node<OWLClass> node : reasoner.getSuperClasses(thisClass, true)) {
-        for (OWLClass inferredSuperClass : node) {
-          inferredSuperClasses.add(inferredSuperClass);
-        }
-      }
+    logger.info("Precomputing class hierarchy...");
+    reasoner.precomputeInferences(InferenceType.CLASS_HIERARCHY);
 
-      // For each subClassAxiom,
-      // if the subclass axiom does not have any annotations,
-      // and the superclass is named (not anonymous),
-      // and the superclass is not in the set of inferred super classes,
-      // then remove that axiom.
-      for (OWLSubClassOfAxiom subClassAxiom : ontology.getSubClassAxiomsForSubClass(thisClass)) {
-        if (OptionsHelper.optionIsTrue(options, "preserve-annotated-axioms")) {
+    EquivalentClassReasoningMode mode =
+        EquivalentClassReasoningMode.from(options.getOrDefault("equivalent-classes-allowed", ""));
+    logger.info("Finding equivalencies...");
 
-          if (subClassAxiom.getAnnotations().size() > 0) {
-            // TODO make this configurable
-            continue;
-          }
-        }
-        if (subClassAxiom.getSuperClass().isAnonymous()) {
-          continue;
-        }
-        OWLClass assertedSuperClass = subClassAxiom.getSuperClass().asOWLClass();
-        if (inferredSuperClasses.contains(assertedSuperClass)) {
-          continue;
-        }
-        manager.removeAxiom(
-            ontology, dataFactory.getOWLSubClassOfAxiom(thisClass, assertedSuperClass));
-      }
+    EquivalentClassReasoning equivalentReasoning =
+        new EquivalentClassReasoning(ontology, reasoner, mode);
+    boolean passesEquivalenceTests = equivalentReasoning.reason();
+    equivalentReasoning.logReport(logger);
+    if (!passesEquivalenceTests) {
+      System.exit(1);
     }
-    logger.info("Ontology now has {} axioms.", ontology.getAxioms().size());
+
+    float elapsedTime = System.currentTimeMillis() - startTime;
+    long seconds = (int) Math.ceil(elapsedTime / 1000);
+    logger.info("Reasoning took {} seconds.", seconds);
   }
 }
diff --git a/robot-core/src/main/java/org/obolibrary/robot/ReasonerHelper.java b/robot-core/src/main/java/org/obolibrary/robot/ReasonerHelper.java
index 556ff0a8..a1d3965b 100644
--- a/robot-core/src/main/java/org/obolibrary/robot/ReasonerHelper.java
+++ b/robot-core/src/main/java/org/obolibrary/robot/ReasonerHelper.java
@@ -1,11 +1,7 @@
 package org.obolibrary.robot;
 
 import java.io.IOException;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-import java.util.UUID;
+import java.util.*;
 import java.util.stream.Collectors;
 import org.obolibrary.robot.exceptions.IncoherentRBoxException;
 import org.obolibrary.robot.exceptions.IncoherentTBoxException;
@@ -13,6 +9,7 @@ import org.obolibrary.robot.exceptions.InconsistentOntologyException;
 import org.semanticweb.owlapi.model.*;
 import org.semanticweb.owlapi.model.parameters.Imports;
 import org.semanticweb.owlapi.reasoner.OWLReasoner;
+import org.semanticweb.owlapi.util.*;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import uk.ac.manchester.cs.owlapi.modularity.ModuleType;
@@ -24,6 +21,13 @@ import uk.ac.manchester.cs.owlapi.modularity.ModuleType;
  */
 public class ReasonerHelper {
 
+  /** Namespace for error messages. */
+  private static final String NS = "reason#";
+
+  /** Error message when an unknown axiom generator is provided. */
+  private static final String axiomGeneratorError =
+      NS + "UNKNOWN AXIOM GENERATOR %s is not a valid inferred axiom generator";
+
   /** Logger. */
   private static final Logger logger = LoggerFactory.getLogger(ReasonerHelper.class);
 
@@ -225,6 +229,64 @@ public class ReasonerHelper {
     return module;
   }
 
+  /**
+   * Given a list of axiom generator strings, return a list of InferredAxiomGenerator objects.
+   *
+   * @param axGenerators list of strings to get InferredAxiomGenerators
+   * @return list of InferredAxiomGenerators
+   */
+  public static List<InferredAxiomGenerator<? extends OWLAxiom>> getInferredAxiomGenerators(
+      List<String> axGenerators) {
+    List<InferredAxiomGenerator<? extends OWLAxiom>> gens = new ArrayList<>();
+    if (axGenerators == null || axGenerators.isEmpty()) {
+      gens.add(new InferredSubClassAxiomGenerator());
+      return gens;
+    }
+    for (String ax : axGenerators) {
+      gens.add(getInferredAxiomGenerator(ax));
+    }
+    return gens;
+  }
+
+  /**
+   * Given an axiom generator as a string, return the InferredAxiomGenerator object.
+   *
+   * @param axGenerator name of InferredAxiomGenerator
+   * @return InferredAxiomGenerator
+   */
+  public static InferredAxiomGenerator<? extends OWLAxiom> getInferredAxiomGenerator(
+      String axGenerator) {
+    switch (axGenerator.toLowerCase()) {
+      case "subclass":
+      case "":
+        return new InferredSubClassAxiomGenerator();
+      case "disjointclasses":
+        return new InferredDisjointClassesAxiomGenerator();
+      case "equivalentclass":
+        return new InferredEquivalentClassAxiomGenerator();
+      case "datapropertycharacteristic":
+        return new InferredDataPropertyCharacteristicAxiomGenerator();
+      case "equivalentdataproperties":
+        return new InferredEquivalentDataPropertiesAxiomGenerator();
+      case "subdataproperty":
+        return new InferredSubDataPropertyAxiomGenerator();
+      case "classassertion":
+        return new InferredClassAssertionAxiomGenerator();
+      case "propertyassertion":
+        return new InferredPropertyAssertionGenerator();
+      case "equivalentobjectproperty":
+        return new InferredEquivalentObjectPropertyAxiomGenerator();
+      case "inverseobjectproperties":
+        return new InferredInverseObjectPropertiesAxiomGenerator();
+      case "objectpropertycharacteristic":
+        return new InferredObjectPropertyCharacteristicAxiomGenerator();
+      case "subobjectproperty":
+        return new InferredSubObjectPropertyAxiomGenerator();
+      default:
+        throw new IllegalArgumentException(String.format(axiomGeneratorError, axGenerator));
+    }
+  }
+
   /**
    * Save an incoherent ontology module to a path.
    *
diff --git a/robot-core/src/main/java/org/obolibrary/robot/RelatedObjectsHelper.java b/robot-core/src/main/java/org/obolibrary/robot/RelatedObjectsHelper.java
index f3ad8c26..20e5f205 100644
--- a/robot-core/src/main/java/org/obolibrary/robot/RelatedObjectsHelper.java
+++ b/robot-core/src/main/java/org/obolibrary/robot/RelatedObjectsHelper.java
@@ -87,7 +87,15 @@ public class RelatedObjectsHelper {
   public static Set<OWLAxiom> getCompleteAxioms(
       OWLOntology ontology, Set<OWLObject> objects, Set<Class<? extends OWLAxiom>> axiomTypes) {
     Set<OWLAxiom> axioms = new HashSet<>();
-    Set<IRI> iris = getIRIs(objects);
+
+    Set<IRI> iris = new HashSet<>();
+    for (OWLObject object : objects) {
+      if (OWLNamedObject.class.isInstance(object)) {
+        OWLNamedObject namedObject = (OWLNamedObject) object;
+        iris.add(namedObject.getIRI());
+      }
+    }
+
     for (OWLAxiom axiom : ontology.getAxioms()) {
       if (OntologyHelper.extendsAxiomTypes(axiom, axiomTypes)) {
         // Check both the full annotated axiom and axiom without annotations (if annotated)
@@ -138,7 +146,15 @@ public class RelatedObjectsHelper {
   public static Set<OWLAxiom> getPartialAxioms(
       OWLOntology ontology, Set<OWLObject> objects, Set<Class<? extends OWLAxiom>> axiomTypes) {
     Set<OWLAxiom> axioms = new HashSet<>();
-    Set<IRI> iris = getIRIs(objects);
+
+    Set<IRI> iris = new HashSet<>();
+    for (OWLObject object : objects) {
+      if (OWLNamedObject.class.isInstance(object)) {
+        OWLNamedObject namedObject = (OWLNamedObject) object;
+        iris.add(namedObject.getIRI());
+      }
+    }
+
     for (OWLAxiom axiom : ontology.getAxioms()) {
       if (OntologyHelper.extendsAxiomTypes(axiom, axiomTypes)) {
         if (axiom instanceof OWLAnnotationAssertionAxiom) {
@@ -268,10 +284,6 @@ public class RelatedObjectsHelper {
       return objects;
     } else if (selector.equals("types")) {
       return selectTypes(ontology, objects);
-    } else if (selector.equals("ranges")) {
-      return selectRanges(ontology, objects);
-    } else if (selector.equals("domains")) {
-      return selectDomains(ontology, objects);
     } else if (selector.contains("=")) {
       return selectPattern(ontology, ioHelper, objects, selector);
     } else {
@@ -435,27 +447,6 @@ public class RelatedObjectsHelper {
     return relatedObjects;
   }
 
-  /**
-   * Given an ontology and a set of objects, return all domains of any properties in the set.
-   *
-   * @param ontology OWLOntology to retrieve domains from
-   * @param objects OWLObjects to retrieve domains of
-   * @return set of domains of the starting set
-   */
-  public static Set<OWLObject> selectDomains(OWLOntology ontology, Set<OWLObject> objects) {
-    Set<OWLObject> relatedObjects = new HashSet<>();
-    for (OWLObject object : objects) {
-      if (object instanceof OWLAnnotationProperty) {
-        relatedObjects.addAll(EntitySearcher.getDomains((OWLAnnotationProperty) object, ontology));
-      } else if (object instanceof OWLDataProperty) {
-        relatedObjects.addAll(EntitySearcher.getDomains((OWLDataProperty) object, ontology));
-      } else if (object instanceof OWLObjectProperty) {
-        relatedObjects.addAll(EntitySearcher.getDomains((OWLObjectProperty) object, ontology));
-      }
-    }
-    return relatedObjects;
-  }
-
   /**
    * Given an ontology and a set of objects, return all equivalent objects of the starting set.
    *
@@ -597,27 +588,6 @@ public class RelatedObjectsHelper {
     return relatedObjects;
   }
 
-  /**
-   * Given an ontology and a set of objects, return all ranges of any properties in the set.
-   *
-   * @param ontology OWLOntology to retrieve ranges from
-   * @param objects OWLObjects to retrieve ranges of
-   * @return set of ranges of the starting set
-   */
-  public static Set<OWLObject> selectRanges(OWLOntology ontology, Set<OWLObject> objects) {
-    Set<OWLObject> relatedObjects = new HashSet<>();
-    for (OWLObject object : objects) {
-      if (object instanceof OWLAnnotationProperty) {
-        relatedObjects.addAll(EntitySearcher.getRanges((OWLAnnotationProperty) object, ontology));
-      } else if (object instanceof OWLDataProperty) {
-        relatedObjects.addAll(EntitySearcher.getRanges((OWLDataProperty) object, ontology));
-      } else if (object instanceof OWLObjectProperty) {
-        relatedObjects.addAll(EntitySearcher.getRanges((OWLObjectProperty) object, ontology));
-      }
-    }
-    return relatedObjects;
-  }
-
   /**
    * Given an ontology and a set of objects, return a set of all the types of the individuals in
    * that set.
@@ -748,23 +718,6 @@ public class RelatedObjectsHelper {
     }
   }
 
-  /**
-   * Given a set of OWLObjects, return the set of IRIs for those objects.
-   *
-   * @param objects OWLObjects to get IRIs of
-   * @return IRIs of the given objects
-   */
-  private static Set<IRI> getIRIs(Set<OWLObject> objects) {
-    Set<IRI> iris = new HashSet<>();
-    for (OWLObject object : objects) {
-      if (object instanceof OWLNamedObject) {
-        OWLNamedObject namedObject = (OWLNamedObject) object;
-        iris.add(namedObject.getIRI());
-      }
-    }
-    return iris;
-  }
-
   /**
    * Given an OWL ontology, an annotation property, and an annotation value (in regex pattern form),
    * return a set of OWLAnnotations that have values matching the regex value.


Test patch:
diff --git a/robot-core/src/test/java/org/obolibrary/robot/ExtractOperationTest.java b/robot-core/src/test/java/org/obolibrary/robot/ExtractOperationTest.java
index 2e0a22ff..d30c6e91 100644
--- a/robot-core/src/test/java/org/obolibrary/robot/ExtractOperationTest.java
+++ b/robot-core/src/test/java/org/obolibrary/robot/ExtractOperationTest.java
@@ -1,14 +1,12 @@
 package org.obolibrary.robot;
 
-import static org.junit.Assert.assertEquals;
-
 import java.io.IOException;
 import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
 import java.util.Set;
 import org.junit.Test;
-import org.semanticweb.owlapi.model.*;
+import org.semanticweb.owlapi.model.IRI;
+import org.semanticweb.owlapi.model.OWLOntology;
+import org.semanticweb.owlapi.model.OWLOntologyCreationException;
 import uk.ac.manchester.cs.owlapi.modularity.ModuleType;
 
 /**
@@ -54,45 +52,6 @@ public class ExtractOperationTest extends CoreTest {
     testExtract(ModuleType.TOP, "/top.owl");
   }
 
-  /** Tests getting the source annotation based on IRI of the entity. */
-  @Test
-  public void testGetIsDefinedBy() {
-    OWLAnnotationProperty isDefinedBy = dataFactory.getRDFSIsDefinedBy();
-    IRI source = IRI.create("http://purl.obolibrary.org/obo/go.owl");
-    IRI bfoSource = IRI.create("http://purl.obolibrary.org/obo/bfo.owl");
-
-    // Test with normal OBO Foundry IRI
-    OWLEntity entity =
-        dataFactory.getOWLClass(IRI.create("http://purl.obolibrary.org/obo/GO_0000001"));
-    OWLAnnotationAxiom axiom =
-        dataFactory.getOWLAnnotationAssertionAxiom(isDefinedBy, entity.getIRI(), source);
-    assertEquals(axiom, ExtractOperation.getIsDefinedBy(entity, null));
-
-    // Test with source replacement
-    Map<IRI, IRI> sourceMap = new HashMap<>();
-    sourceMap.put(IRI.create("http://purl.obolibrary.org/obo/GO_0000001"), bfoSource);
-    axiom = dataFactory.getOWLAnnotationAssertionAxiom(isDefinedBy, entity.getIRI(), bfoSource);
-    assertEquals(axiom, ExtractOperation.getIsDefinedBy(entity, sourceMap));
-
-    // Test with "base" IRI
-    entity = dataFactory.getOWLClass(IRI.create("http://purl.obolibrary.org/obo/go.owl#0000001"));
-    axiom = dataFactory.getOWLAnnotationAssertionAxiom(isDefinedBy, entity.getIRI(), source);
-    ExtractOperation.getIsDefinedBy(entity, null);
-    assertEquals(axiom, ExtractOperation.getIsDefinedBy(entity, null));
-
-    // Test with "base" IRI without '.owl'
-    entity = dataFactory.getOWLClass(IRI.create("http://purl.obolibrary.org/obo/go#0000001"));
-    axiom = dataFactory.getOWLAnnotationAssertionAxiom(isDefinedBy, entity.getIRI(), source);
-    ExtractOperation.getIsDefinedBy(entity, null);
-    assertEquals(axiom, ExtractOperation.getIsDefinedBy(entity, null));
-
-    // Test with unusual IRI
-    entity = dataFactory.getOWLClass(IRI.create("http://purl.obolibrary.org/obo/go/0000001"));
-    axiom = dataFactory.getOWLAnnotationAssertionAxiom(isDefinedBy, entity.getIRI(), source);
-    ExtractOperation.getIsDefinedBy(entity, null);
-    assertEquals(axiom, ExtractOperation.getIsDefinedBy(entity, null));
-  }
-
   /**
    * Tests a generic non-MIREOT (i.e. SLME) extraction operation using a custom module type and a
    * pre-generated OWL file to compare against.
diff --git a/robot-core/src/test/java/org/obolibrary/robot/QueryOperationTest.java b/robot-core/src/test/java/org/obolibrary/robot/QueryOperationTest.java
index c12ad7b7..3b6e8775 100644
--- a/robot-core/src/test/java/org/obolibrary/robot/QueryOperationTest.java
+++ b/robot-core/src/test/java/org/obolibrary/robot/QueryOperationTest.java
@@ -14,7 +14,6 @@ import org.apache.jena.rdf.model.*;
 import org.apache.jena.riot.Lang;
 import org.junit.Test;
 import org.semanticweb.owlapi.model.OWLOntology;
-import org.semanticweb.owlapi.model.OWLOntologyCreationException;
 import org.semanticweb.owlapi.model.OWLOntologyStorageException;
 
 /**
@@ -106,29 +105,6 @@ public class QueryOperationTest extends CoreTest {
     assertTrue(model.contains(s, p, o));
   }
 
-  /**
-   * Tests an update statement that adds a label.
-   *
-   * @throws IOException on IO error
-   * @throws OWLOntologyStorageException on ontology error
-   * @throws OWLOntologyCreationException on ontology error
-   */
-  @Test
-  public void testExecUpdate()
-      throws IOException, OWLOntologyCreationException, OWLOntologyStorageException {
-    OWLOntology inputOntology = loadOntology("/simple.owl");
-    Model model = QueryOperation.loadOntologyAsModel(inputOntology);
-    String updateString =
-        "PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>"
-            + "PREFIX s: <https://github.com/ontodev/robot/robot-core/src/test/resources/simple.owl#>"
-            + "INSERT { "
-            + "s:test2 rdfs:label \"test 2\" ."
-            + " } WHERE {}";
-    QueryOperation.execUpdate(model, updateString);
-    OWLOntology outputOntology = QueryOperation.convertModel(model);
-    assertIdentical("/simple_update.owl", outputOntology);
-  }
-
   /**
    * Tests a verify with violations.
    *
diff --git a/robot-core/src/test/java/org/obolibrary/robot/ReasonOperationTest.java b/robot-core/src/test/java/org/obolibrary/robot/ReasonOperationTest.java
index ade09770..11dd27d0 100644
--- a/robot-core/src/test/java/org/obolibrary/robot/ReasonOperationTest.java
+++ b/robot-core/src/test/java/org/obolibrary/robot/ReasonOperationTest.java
@@ -2,21 +2,17 @@ package org.obolibrary.robot;
 
 import static org.junit.Assert.*;
 
-import java.io.IOException;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
 import org.geneontology.reasoner.ExpressionMaterializingReasonerFactory;
 import org.junit.Test;
-import org.obolibrary.robot.exceptions.InvalidReferenceException;
-import org.obolibrary.robot.exceptions.OntologyLogicException;
 import org.semanticweb.elk.owlapi.ElkReasonerFactory;
 import org.semanticweb.owlapi.model.AddImport;
 import org.semanticweb.owlapi.model.IRI;
 import org.semanticweb.owlapi.model.OWLAxiom;
 import org.semanticweb.owlapi.model.OWLImportsDeclaration;
 import org.semanticweb.owlapi.model.OWLOntology;
-import org.semanticweb.owlapi.model.OWLOntologyCreationException;
 import org.semanticweb.owlapi.model.OWLOntologyManager;
 import org.semanticweb.owlapi.reasoner.OWLReasonerFactory;
 import uk.ac.manchester.cs.jfact.JFactFactory;
@@ -26,15 +22,10 @@ public class ReasonOperationTest extends CoreTest {
   /**
    * Test reasoning with StructuralReasoner.
    *
-   * @throws IOException on file problem
-   * @throws OWLOntologyCreationException on ontology problem
-   * @throws OntologyLogicException on logic error
-   * @throws InvalidReferenceException if a reference is invalid
+   * @throws Exception on any problem
    */
   @Test
-  public void testStructural()
-      throws IOException, OWLOntologyCreationException, OntologyLogicException,
-          InvalidReferenceException {
+  public void testStructural() throws Exception {
     OWLOntology reasoned = loadOntology("/simple.owl");
     OWLReasonerFactory reasonerFactory =
         new org.semanticweb.owlapi.reasoner.structural.StructuralReasonerFactory();
@@ -45,15 +36,10 @@ public class ReasonOperationTest extends CoreTest {
   /**
    * Test reasoning with ELK.
    *
-   * @throws IOException on file problem
-   * @throws OWLOntologyCreationException on ontology problem
-   * @throws OntologyLogicException on logic error
-   * @throws InvalidReferenceException if a reference is invalid
+   * @throws Exception on any problem
    */
   @Test
-  public void testELK()
-      throws IOException, OWLOntologyCreationException, OntologyLogicException,
-          InvalidReferenceException {
+  public void testELK() throws Exception {
     OWLOntology reasoned = loadOntology("/simple.owl");
     OWLReasonerFactory reasonerFactory = new ElkReasonerFactory();
     ReasonOperation.reason(reasoned, reasonerFactory);
@@ -63,15 +49,10 @@ public class ReasonOperationTest extends CoreTest {
   /**
    * Test reasoning with HermiT.
    *
-   * @throws IOException on file problem
-   * @throws OWLOntologyCreationException on ontology problem
-   * @throws OntologyLogicException on logic error
-   * @throws InvalidReferenceException if a reference is invalid
+   * @throws Exception on any problem
    */
   @Test
-  public void testHermit()
-      throws IOException, OWLOntologyCreationException, OntologyLogicException,
-          InvalidReferenceException {
+  public void testHermit() throws Exception {
     OWLOntology reasoned = loadOntology("/simple.owl");
     OWLReasonerFactory reasonerFactory = new org.semanticweb.HermiT.ReasonerFactory();
     ReasonOperation.reason(reasoned, reasonerFactory);
@@ -82,15 +63,10 @@ public class ReasonOperationTest extends CoreTest {
   /**
    * Test reasoning with JFact.
    *
-   * @throws IOException on file problem
-   * @throws OWLOntologyCreationException on ontology problem
-   * @throws OntologyLogicException on logic error
-   * @throws InvalidReferenceException if a reference is invalid
+   * @throws Exception on any problem
    */
   @Test
-  public void testJFact()
-      throws IOException, OWLOntologyCreationException, OntologyLogicException,
-          InvalidReferenceException {
+  public void testJFact() throws Exception {
     OWLOntology reasoned = loadOntology("/simple.owl");
     OWLReasonerFactory reasonerFactory = new JFactFactory();
     ReasonOperation.reason(reasoned, reasonerFactory);
@@ -101,15 +77,10 @@ public class ReasonOperationTest extends CoreTest {
   /**
    * Test inferring into new ontology.
    *
-   * @throws IOException on file problem
-   * @throws OWLOntologyCreationException on ontology problem
-   * @throws OntologyLogicException on logic error
-   * @throws InvalidReferenceException if a reference is invalid
+   * @throws Exception on any problem
    */
   @Test
-  public void testInferIntoNewOntology()
-      throws IOException, OWLOntologyCreationException, OntologyLogicException,
-          InvalidReferenceException {
+  public void testInferIntoNewOntology() throws Exception {
     OWLOntology reasoned = loadOntology("/simple.owl");
     OWLReasonerFactory reasonerFactory = new org.semanticweb.HermiT.ReasonerFactory();
     Map<String, String> opts = new HashMap<>();
@@ -125,15 +96,10 @@ public class ReasonOperationTest extends CoreTest {
   /**
    * Test inferring into new ontology.
    *
-   * @throws IOException on file problem
-   * @throws OWLOntologyCreationException on ontology problem
-   * @throws OntologyLogicException on logic error
-   * @throws InvalidReferenceException if a reference is invalid
+   * @throws Exception on any problem
    */
   @Test
-  public void testInferIntoNewOntologyNonTrivial()
-      throws IOException, OWLOntologyCreationException, OntologyLogicException,
-          InvalidReferenceException {
+  public void testInferIntoNewOntologyNonTrivial() throws Exception {
     OWLOntology reasoned = loadOntology("/relax_equivalence_axioms_test.obo");
     OWLReasonerFactory reasonerFactory = new org.semanticweb.HermiT.ReasonerFactory();
     Map<String, String> opts = new HashMap<>();
@@ -153,15 +119,10 @@ public class ReasonOperationTest extends CoreTest {
   /**
    * Test inferring into new ontology, excluding duplicates.
    *
-   * @throws IOException on file problem
-   * @throws OWLOntologyCreationException on ontology problem
-   * @throws OntologyLogicException on logic error
-   * @throws InvalidReferenceException if a reference is invalid
+   * @throws Exception on any problem
    */
   @Test
-  public void testInferIntoNewOntologyNoDupes()
-      throws IOException, OWLOntologyCreationException, OntologyLogicException,
-          InvalidReferenceException {
+  public void testInferIntoNewOntologyNoDupes() throws Exception {
     OWLOntology reasoned = loadOntology("/relax_equivalence_axioms_test.obo");
     OWLReasonerFactory reasonerFactory = new org.semanticweb.HermiT.ReasonerFactory();
     Map<String, String> opts = new HashMap<>();
@@ -176,15 +137,10 @@ public class ReasonOperationTest extends CoreTest {
   /**
    * Test removing redundant subclass axioms.
    *
-   * @throws IOException on file problem
-   * @throws OWLOntologyCreationException on ontology problem
-   * @throws OntologyLogicException on logic error
-   * @throws InvalidReferenceException if a reference is invalid
+   * @throws Exception on any problem
    */
   @Test
-  public void testRemoveRedundantSubClassAxioms()
-      throws IOException, OWLOntologyCreationException, OntologyLogicException,
-          InvalidReferenceException {
+  public void testRemoveRedundantSubClassAxioms() throws Exception {
     OWLOntology reasoned = loadOntology("/redundant_subclasses.owl");
     OWLReasonerFactory reasonerFactory = new org.semanticweb.elk.owlapi.ElkReasonerFactory();
     ReasonOperation.reason(reasoned, reasonerFactory, Collections.emptyMap());
@@ -203,15 +159,10 @@ public class ReasonOperationTest extends CoreTest {
    *
    * <p>This test should return the same results as running any other reasoner
    *
-   * @throws IOException on file problem
-   * @throws OWLOntologyCreationException on ontology problem
-   * @throws OntologyLogicException on logic error
-   * @throws InvalidReferenceException if a reference is invalid
+   * @throws Exception on any problem
    */
   @Test
-  public void testEMRBasic()
-      throws IOException, OWLOntologyCreationException, OntologyLogicException,
-          InvalidReferenceException {
+  public void testEMRBasic() throws Exception {
     OWLOntology reasoned = loadOntology("/simple.owl");
     OWLReasonerFactory coreReasonerFactory = new ElkReasonerFactory();
     OWLReasonerFactory reasonerFactory =
@@ -225,15 +176,10 @@ public class ReasonOperationTest extends CoreTest {
    *
    * <p>This test effectively relaxes an equivalence axiom
    *
-   * @throws IOException on file problem
-   * @throws OWLOntologyCreationException on ontology problem
-   * @throws OntologyLogicException on logic error
-   * @throws InvalidReferenceException if a reference is invalid
+   * @throws Exception on any problem
    */
   @Test
-  public void testEMRRelax()
-      throws IOException, OWLOntologyCreationException, OntologyLogicException,
-          InvalidReferenceException {
+  public void testEMRRelax() throws Exception {
     OWLOntology reasoned = loadOntology("/relax_equivalence_axioms_test.obo");
     OWLReasonerFactory coreReasonerFactory = new ElkReasonerFactory();
     OWLReasonerFactory reasonerFactory =
@@ -247,15 +193,10 @@ public class ReasonOperationTest extends CoreTest {
   /**
    * Test reasoning with intersection axioms
    *
-   * @throws IOException on file problem
-   * @throws OWLOntologyCreationException on ontology problem
-   * @throws OntologyLogicException on logic error
-   * @throws InvalidReferenceException if a reference is invalid
+   * @throws Exception on any problem
    */
   @Test
-  public void testIntersection()
-      throws IOException, OWLOntologyCreationException, OntologyLogicException,
-          InvalidReferenceException {
+  public void testIntersection() throws Exception {
     OWLOntology reasoned = loadOntology("/intersection.omn");
     OWLReasonerFactory reasonerFactory = new ElkReasonerFactory();
     ReasonOperation.reason(reasoned, reasonerFactory);
@@ -268,10 +209,7 @@ public class ReasonOperationTest extends CoreTest {
    * <p>Depending on user option, inferred axioms that refer solely to external ontology classes
    * (i.e. those in the import chain) should not be asserted
    *
-   * @throws IOException on file problem
-   * @throws OWLOntologyCreationException on ontology problem
-   * @throws OntologyLogicException on logic error
-   * @throws InvalidReferenceException if a reference is invalid
+   * @throws Exception on any problem
    */
   @Test
   public void testExternal() throws Exception {
@@ -299,6 +237,123 @@ public class ReasonOperationTest extends CoreTest {
     assertTrue(checkContains(mainOnt, "SubClassOf(<http://x.org/XA> <http://x.org/XB>)"));
   }
 
+  /**
+   * Test class axiom generators.
+   *
+   * @throws Exception on any problem
+   */
+  @Test
+  public void testClassAxiomGenerators() throws Exception {
+    OWLOntology ontology = loadOntology("/simple_logic.owl");
+    Map<String, String> options = ReasonOperation.getDefaultOptions();
+    OWLReasonerFactory reasonerFactory = new JFactFactory();
+
+    options.put("axiom-generators", "EquivalentClass Subclass DisjointClasses");
+    ReasonOperation.reason(ontology, reasonerFactory, options);
+
+    // subclass
+    assertTrue(
+        checkContains(
+            ontology,
+            "SubClassOf(<http://purl.obolibrary.org/obo/CLS_04> <http://purl.obolibrary.org/obo/CLS_01>)"));
+    // equivalent classes
+    assertTrue(
+        checkContains(
+            ontology,
+            "EquivalentClasses(<http://purl.obolibrary.org/obo/CLS_01> <http://purl.obolibrary.org/obo/CLS_02> )"));
+
+    // disjoint classes
+    assertTrue(
+        checkContains(
+            ontology,
+            "DisjointClasses(<http://purl.obolibrary.org/obo/CLS_04> <http://purl.obolibrary.org/obo/CLS_06>)"));
+  }
+
+  /**
+   * Test object property axiom generators.
+   *
+   * @throws Exception on any problem
+   */
+  @Test
+  public void testObjectPropertyAxiomGenerators() throws Exception {
+    OWLOntology ontology = loadOntology("/simple_logic.owl");
+    Map<String, String> options = ReasonOperation.getDefaultOptions();
+    OWLReasonerFactory reasonerFactory = new JFactFactory();
+
+    options.put(
+        "axiom-generators", "EquivalentObjectProperty InverseObjectProperties SubObjectProperty");
+    ReasonOperation.reason(ontology, reasonerFactory, options);
+
+    // subproperty
+    assertTrue(
+        checkContains(
+            ontology,
+            "SubObjectPropertyOf(<http://purl.obolibrary.org/obo/OP_05> <http://purl.obolibrary.org/obo/OP_04>)"));
+    // equivalent properties
+    assertTrue(
+        checkContains(
+            ontology,
+            "EquivalentObjectProperties(<http://purl.obolibrary.org/obo/OP_01> <http://purl.obolibrary.org/obo/OP_04> )"));
+    // inverse properties
+    assertTrue(
+        checkContains(
+            ontology,
+            "InverseObjectProperties(<http://purl.obolibrary.org/obo/OP_02> <http://purl.obolibrary.org/obo/OP_04>)"));
+  }
+
+  /**
+   * Test data property axiom generators.
+   *
+   * @throws Exception on any problem
+   */
+  @Test
+  public void testDataPropertyAxiomGenerators() throws Exception {
+    OWLOntology ontology = loadOntology("/simple_logic.owl");
+    Map<String, String> options = ReasonOperation.getDefaultOptions();
+    OWLReasonerFactory reasonerFactory = new JFactFactory();
+
+    options.put("axiom-generators", "EquivalentDataProperties SubDataProperty");
+    ReasonOperation.reason(ontology, reasonerFactory, options);
+    IOHelper ioHelper = new IOHelper();
+
+    // subproperty
+    assertTrue(
+        checkContains(
+            ontology,
+            "SubDataPropertyOf(<http://purl.obolibrary.org/obo/DP_03> <http://purl.obolibrary.org/obo/DP_01>)"));
+    // equivalent properties
+    assertTrue(
+        checkContains(
+            ontology,
+            "EquivalentDataProperties(<http://purl.obolibrary.org/obo/DP_01> <http://purl.obolibrary.org/obo/DP_04> )"));
+  }
+
+  /**
+   * Test individual axiom generators.
+   *
+   * @throws Exception on any problem
+   */
+  @Test
+  public void testIndividualAxiomGenerators() throws Exception {
+    OWLOntology ontology = loadOntology("/simple_logic.owl");
+    Map<String, String> options = ReasonOperation.getDefaultOptions();
+    OWLReasonerFactory reasonerFactory = new JFactFactory();
+
+    options.put("axiom-generators", "ClassAssertion");
+    ReasonOperation.reason(ontology, reasonerFactory, options);
+
+    // class assertion
+    assertTrue(
+        checkContains(
+            ontology,
+            "ClassAssertion(<http://purl.obolibrary.org/obo/CLS_02> <http://purl.obolibrary.org/obo/IND_03>)"));
+    // property assertion
+    assertTrue(
+        checkContains(
+            ontology,
+            "ObjectPropertyAssertion(<http://purl.obolibrary.org/obo/OP_08> <http://purl.obolibrary.org/obo/IND_02> <http://purl.obolibrary.org/obo/IND_03>)"));
+  }
+
   private boolean checkContains(OWLOntology reasoned, String axStr) {
     for (OWLAxiom a : reasoned.getLogicalAxioms()) {
       if (a.toString().equals(axStr)) return true;
diff --git a/robot-core/src/test/resources/simple_logic.owl b/robot-core/src/test/resources/simple_logic.owl
new file mode 100644
index 00000000..84f32d4f
--- /dev/null
+++ b/robot-core/src/test/resources/simple_logic.owl
@@ -0,0 +1,245 @@
+<?xml version="1.0"?>
+<rdf:RDF xmlns="http://www.semanticweb.org/tauber/ontologies/2019/1/untitled-ontology-482#"
+     xml:base="http://www.semanticweb.org/tauber/ontologies/2019/1/untitled-ontology-482"
+     xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+     xmlns:owl="http://www.w3.org/2002/07/owl#"
+     xmlns:xml="http://www.w3.org/XML/1998/namespace"
+     xmlns:xsd="http://www.w3.org/2001/XMLSchema#"
+     xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
+     xmlns:obo="http://purl.obolibrary.org/obo/">
+    <owl:Ontology rdf:about="http://www.semanticweb.org/tauber/ontologies/2019/1/untitled-ontology-482"/>
+    
+
+
+    <!-- 
+    ///////////////////////////////////////////////////////////////////////////////////////
+    //
+    // Object Properties
+    //
+    ///////////////////////////////////////////////////////////////////////////////////////
+     -->
+
+    
+
+
+    <!-- http://purl.obolibrary.org/obo/OP_01 -->
+
+    <owl:ObjectProperty rdf:about="http://purl.obolibrary.org/obo/OP_01">
+        <owl:equivalentProperty rdf:resource="http://purl.obolibrary.org/obo/OP_04"/>
+        <owl:inverseOf rdf:resource="http://purl.obolibrary.org/obo/OP_02"/>
+        <owl:propertyDisjointWith rdf:resource="http://purl.obolibrary.org/obo/OP_02"/>
+    </owl:ObjectProperty>
+    
+
+
+    <!-- http://purl.obolibrary.org/obo/OP_02 -->
+
+    <owl:ObjectProperty rdf:about="http://purl.obolibrary.org/obo/OP_02"/>
+    
+
+
+    <!-- http://purl.obolibrary.org/obo/OP_03 -->
+
+    <owl:ObjectProperty rdf:about="http://purl.obolibrary.org/obo/OP_03">
+        <rdfs:subPropertyOf rdf:resource="http://purl.obolibrary.org/obo/OP_02"/>
+    </owl:ObjectProperty>
+    
+
+
+    <!-- http://purl.obolibrary.org/obo/OP_04 -->
+
+    <owl:ObjectProperty rdf:about="http://purl.obolibrary.org/obo/OP_04"/>
+    
+
+
+    <!-- http://purl.obolibrary.org/obo/OP_05 -->
+
+    <owl:ObjectProperty rdf:about="http://purl.obolibrary.org/obo/OP_05">
+        <owl:equivalentProperty>
+            <rdf:Description>
+                <owl:inverseOf rdf:resource="http://purl.obolibrary.org/obo/OP_03"/>
+            </rdf:Description>
+        </owl:equivalentProperty>
+        <rdfs:subPropertyOf rdf:resource="http://purl.obolibrary.org/obo/OP_02"/>
+        <rdf:type rdf:resource="http://www.w3.org/2002/07/owl#FunctionalProperty"/>
+    </owl:ObjectProperty>
+    
+
+
+    <!-- http://purl.obolibrary.org/obo/OP_08 -->
+
+    <owl:ObjectProperty rdf:about="http://purl.obolibrary.org/obo/OP_08">
+        <rdf:type rdf:resource="http://www.w3.org/2002/07/owl#SymmetricProperty"/>
+    </owl:ObjectProperty>
+    
+
+
+    <!-- 
+    ///////////////////////////////////////////////////////////////////////////////////////
+    //
+    // Data properties
+    //
+    ///////////////////////////////////////////////////////////////////////////////////////
+     -->
+
+    
+
+
+    <!-- http://purl.obolibrary.org/obo/DP_01 -->
+
+    <owl:DatatypeProperty rdf:about="http://purl.obolibrary.org/obo/DP_01">
+        <owl:equivalentProperty rdf:resource="http://purl.obolibrary.org/obo/DP_02"/>
+        <owl:equivalentProperty rdf:resource="http://purl.obolibrary.org/obo/DP_04"/>
+    </owl:DatatypeProperty>
+    
+
+
+    <!-- http://purl.obolibrary.org/obo/DP_02 -->
+
+    <owl:DatatypeProperty rdf:about="http://purl.obolibrary.org/obo/DP_02"/>
+    
+
+
+    <!-- http://purl.obolibrary.org/obo/DP_03 -->
+
+    <owl:DatatypeProperty rdf:about="http://purl.obolibrary.org/obo/DP_03">
+        <rdfs:subPropertyOf rdf:resource="http://purl.obolibrary.org/obo/DP_02"/>
+    </owl:DatatypeProperty>
+    
+
+
+    <!-- http://purl.obolibrary.org/obo/DP_04 -->
+
+    <owl:DatatypeProperty rdf:about="http://purl.obolibrary.org/obo/DP_04"/>
+    
+
+
+    <!-- 
+    ///////////////////////////////////////////////////////////////////////////////////////
+    //
+    // Classes
+    //
+    ///////////////////////////////////////////////////////////////////////////////////////
+     -->
+
+    
+
+
+    <!-- http://purl.obolibrary.org/obo/CLS_01 -->
+
+    <owl:Class rdf:about="http://purl.obolibrary.org/obo/CLS_01">
+        <owl:equivalentClass>
+            <owl:Restriction>
+                <owl:onProperty rdf:resource="http://purl.obolibrary.org/obo/OP_01"/>
+                <owl:someValuesFrom rdf:resource="http://purl.obolibrary.org/obo/CLS_01"/>
+            </owl:Restriction>
+        </owl:equivalentClass>
+    </owl:Class>
+    
+
+
+    <!-- http://purl.obolibrary.org/obo/CLS_02 -->
+
+    <owl:Class rdf:about="http://purl.obolibrary.org/obo/CLS_02">
+        <owl:equivalentClass>
+            <owl:Restriction>
+                <owl:onProperty rdf:resource="http://purl.obolibrary.org/obo/OP_01"/>
+                <owl:someValuesFrom rdf:resource="http://purl.obolibrary.org/obo/CLS_01"/>
+            </owl:Restriction>
+        </owl:equivalentClass>
+    </owl:Class>
+    
+
+
+    <!-- http://purl.obolibrary.org/obo/CLS_03 -->
+
+    <owl:Class rdf:about="http://purl.obolibrary.org/obo/CLS_03"/>
+    
+
+
+    <!-- http://purl.obolibrary.org/obo/CLS_04 -->
+
+    <owl:Class rdf:about="http://purl.obolibrary.org/obo/CLS_04">
+        <rdfs:subClassOf rdf:resource="http://purl.obolibrary.org/obo/CLS_03"/>
+        <rdfs:subClassOf>
+            <owl:Restriction>
+                <owl:onProperty rdf:resource="http://purl.obolibrary.org/obo/OP_01"/>
+                <owl:someValuesFrom rdf:resource="http://purl.obolibrary.org/obo/CLS_01"/>
+            </owl:Restriction>
+        </rdfs:subClassOf>
+    </owl:Class>
+    
+
+
+    <!-- http://purl.obolibrary.org/obo/CLS_05 -->
+
+    <owl:Class rdf:about="http://purl.obolibrary.org/obo/CLS_05">
+        <rdfs:subClassOf rdf:resource="http://purl.obolibrary.org/obo/CLS_01"/>
+    </owl:Class>
+    
+
+
+    <!-- http://purl.obolibrary.org/obo/CLS_06 -->
+
+    <owl:Class rdf:about="http://purl.obolibrary.org/obo/CLS_06">
+        <owl:equivalentClass>
+            <owl:Class>
+                <owl:complementOf rdf:resource="http://purl.obolibrary.org/obo/CLS_01"/>
+            </owl:Class>
+        </owl:equivalentClass>
+    </owl:Class>
+    
+
+
+    <!-- http://purl.obolibrary.org/obo/CLS_07 -->
+
+    <owl:Class rdf:about="http://purl.obolibrary.org/obo/CLS_07">
+        <rdfs:subClassOf rdf:resource="http://purl.obolibrary.org/obo/CLS_03"/>
+    </owl:Class>
+    
+
+
+    <!-- 
+    ///////////////////////////////////////////////////////////////////////////////////////
+    //
+    // Individuals
+    //
+    ///////////////////////////////////////////////////////////////////////////////////////
+     -->
+
+    
+
+
+    <!-- http://purl.obolibrary.org/obo/IND_01 -->
+
+    <owl:NamedIndividual rdf:about="http://purl.obolibrary.org/obo/IND_01">
+        <rdf:type rdf:resource="http://purl.obolibrary.org/obo/CLS_07"/>
+    </owl:NamedIndividual>
+    
+
+
+    <!-- http://purl.obolibrary.org/obo/IND_02 -->
+
+    <owl:NamedIndividual rdf:about="http://purl.obolibrary.org/obo/IND_02">
+        <rdf:type rdf:resource="http://purl.obolibrary.org/obo/CLS_07"/>
+        <obo:OP_08 rdf:resource="http://purl.obolibrary.org/obo/IND_03"/>
+    </owl:NamedIndividual>
+    
+
+
+    <!-- http://purl.obolibrary.org/obo/IND_03 -->
+
+    <owl:NamedIndividual rdf:about="http://purl.obolibrary.org/obo/IND_03">
+        <rdf:type>
+            <owl:Restriction>
+                <owl:onProperty rdf:resource="http://purl.obolibrary.org/obo/OP_01"/>
+                <owl:someValuesFrom rdf:resource="http://purl.obolibrary.org/obo/CLS_01"/>
+            </owl:Restriction>
+        </rdf:type>
+    </owl:NamedIndividual>
+</rdf:RDF>
+
+
+
+<!-- Generated by the OWL API (version 4.2.8.20170104-2310) https://github.com/owlcs/owlapi -->
+
diff --git a/robot-core/src/test/resources/simple_update.owl b/robot-core/src/test/resources/simple_update.owl
deleted file mode 100644
index 81579e5a..00000000
--- a/robot-core/src/test/resources/simple_update.owl
+++ /dev/null
@@ -1,44 +0,0 @@
-<?xml version="1.0"?>
-<rdf:RDF xmlns="https://github.com/ontodev/robot/robot-core/src/test/resources/simple.owl#"
-     xml:base="https://github.com/ontodev/robot/robot-core/src/test/resources/simple.owl"
-     xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-     xmlns:owl="http://www.w3.org/2002/07/owl#"
-     xmlns:xml="http://www.w3.org/XML/1998/namespace"
-     xmlns:xsd="http://www.w3.org/2001/XMLSchema#"
-     xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#">
-    <owl:Ontology rdf:about="https://github.com/ontodev/robot/robot-core/src/test/resources/simple.owl"/>
-    
-
-
-    <!-- 
-    ///////////////////////////////////////////////////////////////////////////////////////
-    //
-    // Classes
-    //
-    ///////////////////////////////////////////////////////////////////////////////////////
-     -->
-
-    
-
-
-    <!-- https://github.com/ontodev/robot/robot-core/src/test/resources/simple.owl#test1 -->
-
-    <owl:Class rdf:about="https://github.com/ontodev/robot/robot-core/src/test/resources/simple.owl#test1">
-        <rdfs:label>Test 1</rdfs:label>
-        <rdfs:label>test one</rdfs:label>
-    </owl:Class>
-    
-
-
-    <!-- https://github.com/ontodev/robot/robot-core/src/test/resources/simple.owl#test2 -->
-
-    <owl:Class rdf:about="https://github.com/ontodev/robot/robot-core/src/test/resources/simple.owl#test2">
-        <rdfs:subClassOf rdf:resource="https://github.com/ontodev/robot/robot-core/src/test/resources/simple.owl#test1"/>
-        <rdfs:label>test 2</rdfs:label>
-    </owl:Class>
-</rdf:RDF>
-
-
-
-<!-- Generated by the OWL API (version 4.2.6) https://github.com/owlcs/owlapi -->
-