From ef501ef42b7e7ecbb95f221f6bfc786b92717eb7 Mon Sep 17 00:00:00 2001 From: Alkid Date: Tue, 20 Aug 2024 13:26:22 +0200 Subject: [PATCH 01/44] changed OWLAPIMapper constructor --- owlapy/owlapi_mapper.py | 126 +++++++++++++++++++++------------------- 1 file changed, 66 insertions(+), 60 deletions(-) diff --git a/owlapy/owlapi_mapper.py b/owlapy/owlapi_mapper.py index 1b9d0be9..8f93f351 100644 --- a/owlapy/owlapi_mapper.py +++ b/owlapy/owlapi_mapper.py @@ -1,6 +1,5 @@ from functools import singledispatchmethod -from typing import Iterable - +from typing import Iterable, TypeVar import jpype.imports from owlapy import owl_expression_to_manchester, manchester_to_owl_expression @@ -23,61 +22,60 @@ from owlapy.owl_individual import OWLNamedIndividual from owlapy.owl_literal import OWLLiteral from owlapy.owl_property import OWLObjectProperty, OWLDataProperty +from owlapy.static_funcs import startJVM from owlapy.vocab import OWLFacet -if jpype.isJVMStarted(): - from org.semanticweb.owlapi.model import IRI as owlapi_IRI - from org.semanticweb.owlapi.vocab import OWLFacet as owlapi_OWLFacet - from org.semanticweb.owlapi.manchestersyntax.parser import ManchesterOWLSyntaxClassExpressionParser - from org.semanticweb.owlapi.manchestersyntax.renderer import ManchesterOWLSyntaxOWLObjectRendererImpl - from org.semanticweb.owlapi.util import BidirectionalShortFormProviderAdapter, SimpleShortFormProvider - from org.semanticweb.owlapi.expression import ShortFormEntityChecker - from java.util import HashSet, ArrayList, List, Set - from java.util.stream import Stream - from uk.ac.manchester.cs.owl.owlapi import (OWLAnonymousClassExpressionImpl, OWLCardinalityRestrictionImpl, - OWLClassExpressionImpl, OWLClassImpl, OWLDataAllValuesFromImpl, - OWLDataCardinalityRestrictionImpl, OWLDataExactCardinalityImpl, - OWLDataHasValueImpl, OWLDataMaxCardinalityImpl, OWLDataUnionOfImpl, - OWLDataMinCardinalityImpl, OWLDataSomeValuesFromImpl, - OWLNaryBooleanClassExpressionImpl, OWLObjectAllValuesFromImpl, - OWLObjectCardinalityRestrictionImpl, OWLObjectComplementOfImpl, - OWLObjectExactCardinalityImpl, OWLObjectHasSelfImpl, - OWLObjectHasValueImpl, OWLObjectIntersectionOfImpl, - OWLObjectMaxCardinalityImpl, OWLObjectMinCardinalityImpl, - OWLObjectOneOfImpl, OWLObjectSomeValuesFromImpl, OWLNaryDataRangeImpl, - OWLObjectUnionOfImpl, OWLQuantifiedDataRestrictionImpl, - OWLQuantifiedObjectRestrictionImpl, OWLQuantifiedRestrictionImpl, - OWLValueRestrictionImpl, OWLLiteralImplBoolean, OWLLiteralImplString, - OWLLiteralImplDouble, OWLLiteralImplFloat, OWLLiteralImplInteger, - OWLDisjointClassesAxiomImpl, OWLDeclarationAxiomImpl, OWLAnnotationImpl, - OWLAnnotationPropertyImpl, OWLClassAssertionAxiomImpl, - OWLDataPropertyAssertionAxiomImpl, OWLDataPropertyDomainAxiomImpl, - OWLDataPropertyRangeAxiomImpl, OWLEquivalentClassesAxiomImpl, - OWLEquivalentDataPropertiesAxiomImpl, OWLDataIntersectionOfImpl, - OWLEquivalentObjectPropertiesAxiomImpl, OWLDataOneOfImpl, - OWLObjectPropertyDomainAxiomImpl, OWLObjectPropertyRangeAxiomImpl, - OWLObjectPropertyAssertionAxiomImpl, OWLDisjointDataPropertiesAxiomImpl, - OWLDisjointObjectPropertiesAxiomImpl, OWLHasKeyAxiomImpl, - OWLSubClassOfAxiomImpl, OWLSubDataPropertyOfAxiomImpl, - OWLSubObjectPropertyOfAxiomImpl, OWLAsymmetricObjectPropertyAxiomImpl, - OWLDatatypeDefinitionAxiomImpl, OWLDatatypeImpl, OWLObjectPropertyImpl, - OWLDataPropertyImpl, OWLNamedIndividualImpl, OWLDisjointUnionAxiomImpl, - OWLDifferentIndividualsAxiomImpl, OWLFunctionalDataPropertyAxiomImpl, - OWLFunctionalObjectPropertyAxiomImpl, OWLSameIndividualAxiomImpl, - OWLInverseFunctionalObjectPropertyAxiomImpl, OWLDataComplementOfImpl, - OWLInverseObjectPropertiesAxiomImpl,OWLReflexiveObjectPropertyAxiomImpl, - OWLIrreflexiveObjectPropertyAxiomImpl, OWLAnnotationAssertionAxiomImpl, - OWLNegativeDataPropertyAssertionAxiomImpl, OWLFacetRestrictionImpl, - OWLNegativeObjectPropertyAssertionAxiomImpl, OWLDatatypeRestrictionImpl, - OWLSymmetricObjectPropertyAxiomImpl, - OWLTransitiveObjectPropertyAxiomImpl, - OWLAnnotationPropertyDomainAxiomImpl, - OWLAnnotationPropertyRangeAxiomImpl, - OWLSubAnnotationPropertyOfAxiomImpl - ) - -else: - raise ImportError("Jpype JVM is not started! Tip: Import OWLAPIMapper after JVM has started") +if not jpype.isJVMStarted(): + startJVM() +from org.semanticweb.owlapi.model import IRI as owlapi_IRI +from org.semanticweb.owlapi.vocab import OWLFacet as owlapi_OWLFacet +from org.semanticweb.owlapi.manchestersyntax.parser import ManchesterOWLSyntaxClassExpressionParser +from org.semanticweb.owlapi.manchestersyntax.renderer import ManchesterOWLSyntaxOWLObjectRendererImpl +from org.semanticweb.owlapi.util import BidirectionalShortFormProviderAdapter, SimpleShortFormProvider +from org.semanticweb.owlapi.expression import ShortFormEntityChecker +from java.util import HashSet, ArrayList, List, Set +from java.util.stream import Stream +from uk.ac.manchester.cs.owl.owlapi import (OWLAnonymousClassExpressionImpl, OWLCardinalityRestrictionImpl, + OWLClassExpressionImpl, OWLClassImpl, OWLDataAllValuesFromImpl, + OWLDataCardinalityRestrictionImpl, OWLDataExactCardinalityImpl, + OWLDataHasValueImpl, OWLDataMaxCardinalityImpl, OWLDataUnionOfImpl, + OWLDataMinCardinalityImpl, OWLDataSomeValuesFromImpl, + OWLNaryBooleanClassExpressionImpl, OWLObjectAllValuesFromImpl, + OWLObjectCardinalityRestrictionImpl, OWLObjectComplementOfImpl, + OWLObjectExactCardinalityImpl, OWLObjectHasSelfImpl, + OWLObjectHasValueImpl, OWLObjectIntersectionOfImpl, + OWLObjectMaxCardinalityImpl, OWLObjectMinCardinalityImpl, + OWLObjectOneOfImpl, OWLObjectSomeValuesFromImpl, OWLNaryDataRangeImpl, + OWLObjectUnionOfImpl, OWLQuantifiedDataRestrictionImpl, + OWLQuantifiedObjectRestrictionImpl, OWLQuantifiedRestrictionImpl, + OWLValueRestrictionImpl, OWLLiteralImplBoolean, OWLLiteralImplString, + OWLLiteralImplDouble, OWLLiteralImplFloat, OWLLiteralImplInteger, + OWLDisjointClassesAxiomImpl, OWLDeclarationAxiomImpl, OWLAnnotationImpl, + OWLAnnotationPropertyImpl, OWLClassAssertionAxiomImpl, + OWLDataPropertyAssertionAxiomImpl, OWLDataPropertyDomainAxiomImpl, + OWLDataPropertyRangeAxiomImpl, OWLEquivalentClassesAxiomImpl, + OWLEquivalentDataPropertiesAxiomImpl, OWLDataIntersectionOfImpl, + OWLEquivalentObjectPropertiesAxiomImpl, OWLDataOneOfImpl, + OWLObjectPropertyDomainAxiomImpl, OWLObjectPropertyRangeAxiomImpl, + OWLObjectPropertyAssertionAxiomImpl, OWLDisjointDataPropertiesAxiomImpl, + OWLDisjointObjectPropertiesAxiomImpl, OWLHasKeyAxiomImpl, + OWLSubClassOfAxiomImpl, OWLSubDataPropertyOfAxiomImpl, + OWLSubObjectPropertyOfAxiomImpl, OWLAsymmetricObjectPropertyAxiomImpl, + OWLDatatypeDefinitionAxiomImpl, OWLDatatypeImpl, OWLObjectPropertyImpl, + OWLDataPropertyImpl, OWLNamedIndividualImpl, OWLDisjointUnionAxiomImpl, + OWLDifferentIndividualsAxiomImpl, OWLFunctionalDataPropertyAxiomImpl, + OWLFunctionalObjectPropertyAxiomImpl, OWLSameIndividualAxiomImpl, + OWLInverseFunctionalObjectPropertyAxiomImpl, OWLDataComplementOfImpl, + OWLInverseObjectPropertiesAxiomImpl,OWLReflexiveObjectPropertyAxiomImpl, + OWLIrreflexiveObjectPropertyAxiomImpl, OWLAnnotationAssertionAxiomImpl, + OWLNegativeDataPropertyAssertionAxiomImpl, OWLFacetRestrictionImpl, + OWLNegativeObjectPropertyAssertionAxiomImpl, OWLDatatypeRestrictionImpl, + OWLSymmetricObjectPropertyAxiomImpl, OWLOntologyManagerImpl, + OWLTransitiveObjectPropertyAxiomImpl, OWLOntologyImpl, + OWLAnnotationPropertyDomainAxiomImpl, + OWLAnnotationPropertyRangeAxiomImpl, + OWLSubAnnotationPropertyOfAxiomImpl + ) def init(the_class): @@ -88,13 +86,16 @@ def init(the_class): return globals().get(cls_name + "Impl") +_SO = TypeVar('_SO', bound='SyncOntology') + + class OWLAPIMapper: - def __init__(self, ontology): - self.ontology = ontology - self.manager = ontology.getOWLOntologyManager() + def __init__(self, ontology: _SO): + self.manager = ontology.manager.get_owlapi_manager() + self.ontology = ontology.get_owlapi_ontology() - # () Get the name space. + # () Get the name space. (used for rendering class expressions) self.namespace = self.ontology.getOntologyID().getOntologyIRI().orElse(None) if self.namespace is not None: self.namespace = str(self.namespace) @@ -103,7 +104,7 @@ def __init__(self, ontology): else: self.namespace = "http://www.anonymous.org/anonymous#" - # () Create a manchester parser and a renderer. + # () Create a manchester parser and a renderer using the given ontology. ontology_set = HashSet() ontology_set.add(self.ontology) bidi_provider = BidirectionalShortFormProviderAdapter(self.manager, ontology_set, SimpleShortFormProvider()) @@ -480,3 +481,8 @@ def _(self, e): for item in e: java_list.add(self.map_(item)) return java_list + + @staticmethod + def to_list(stream_obj): + """Converts Java Stream object to Python list""" + return stream_obj.collect(jpype.JClass("java.util.stream.Collectors").toList()) From 00290539e883f0196131327b2a59a56df6b453ae Mon Sep 17 00:00:00 2001 From: Alkid Date: Tue, 20 Aug 2024 13:26:50 +0200 Subject: [PATCH 02/44] added JPype start and stop functions --- owlapy/static_funcs.py | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/owlapy/static_funcs.py b/owlapy/static_funcs.py index 4fd0a764..228aa050 100644 --- a/owlapy/static_funcs.py +++ b/owlapy/static_funcs.py @@ -3,6 +3,9 @@ import subprocess import platform import shutil +import jpype +import jpype.imports +import pkg_resources # NOTE: Static functions closely related with owl classes should be placed in utils.py not here @@ -37,3 +40,20 @@ def download_external_files(ftp_link: str): subprocess.run(['unzip', file_name]) os.remove(os.path.join(os.getcwd(), file_name)) shutil.move(current_dir, root_dir) + + +def startJVM(): + """Start the JVM with jar dependencies. This method is called automatically on object initialization, if the + JVM is not started yet.""" + # Start a java virtual machine using the dependencies in the respective folder: + jar_folder = pkg_resources.resource_filename('owlapy', 'jar_dependencies') + jar_files = [os.path.join(jar_folder, f) for f in os.listdir(jar_folder) if f.endswith('.jar')] + # Starting JVM + jpype.startJVM(classpath=jar_files) + + +def stopJVM() -> None: + """Detaches the thread from Java packages and shuts down the java virtual machine hosted by jpype.""" + if jpype.isJVMStarted(): + jpype.detachThreadFromJVM() + jpype.shutdownJVM() From 847432af1912b9f9da3878149ddb37448b68f8aa Mon Sep 17 00:00:00 2001 From: Alkid Date: Tue, 20 Aug 2024 13:28:26 +0200 Subject: [PATCH 03/44] added SyncOntologyManager and SyncOntology --- owlapy/owl_ontology.py | 66 ++++++++++++++++++++++++++++++++++ owlapy/owl_ontology_manager.py | 21 ++++++++++- 2 files changed, 86 insertions(+), 1 deletion(-) diff --git a/owlapy/owl_ontology.py b/owlapy/owl_ontology.py index 9e9d2f6f..2bbcae13 100644 --- a/owlapy/owl_ontology.py +++ b/owlapy/owl_ontology.py @@ -46,6 +46,7 @@ _VERSION_IRI: Final = IRI.create(namespaces.OWL, "versionIRI") _M = TypeVar('_M', bound='OWLOntologyManager') +_SM = TypeVar('_SM', bound='SyncOntologyManager') class OWLOntologyID: @@ -387,6 +388,71 @@ def __repr__(self): return f'Ontology({IRI.create(self._onto.base_iri)}, {self._onto.loaded})' +class SyncOntology(OWLOntology): + + def __init__(self, manager: _SM, iri: IRI, new: bool = False): + from owlapy.owlapi_mapper import OWLAPIMapper + from java.io import File + from java.util.stream import Stream + self.manager = manager + self._iri = iri + if new: # create new ontology + self.owlapi_ontology = manager.createOntology(Stream.empty(), File(iri.str)) + else: # means we are loading an existing ontology + self.owlapi_ontology = manager.get_owlapi_manager().loadOntologyFromOntologyDocument(File(iri.str)) + self.mapper = OWLAPIMapper(self) + + def classes_in_signature(self) -> Iterable[OWLClass]: + pass + + def data_properties_in_signature(self) -> Iterable[OWLDataProperty]: + pass + + def object_properties_in_signature(self) -> Iterable[OWLObjectProperty]: + pass + + def individuals_in_signature(self) -> Iterable[OWLNamedIndividual]: + pass + + def equivalent_classes_axioms(self, c: OWLClass) -> Iterable[OWLEquivalentClassesAxiom]: + pass + + def general_class_axioms(self) -> Iterable[OWLClassAxiom]: + pass + + def data_property_domain_axioms(self, property: OWLDataProperty) -> Iterable[OWLDataPropertyDomainAxiom]: + pass + + def data_property_range_axioms(self, property: OWLDataProperty) -> Iterable[OWLDataPropertyRangeAxiom]: + pass + + def object_property_domain_axioms(self, property: OWLObjectProperty) -> Iterable[OWLObjectPropertyDomainAxiom]: + pass + + def object_property_range_axioms(self, property: OWLObjectProperty) -> Iterable[OWLObjectPropertyRangeAxiom]: + pass + + def get_owl_ontology_manager(self) -> _M: + pass + + def get_owlapi_ontology(self): + return self.owlapi_ontology + + def get_ontology_id(self) -> OWLOntologyID: + pass + + def __eq__(self, other): + pass + + def __hash__(self): + pass + + def __repr__(self): + pass + + + + OWLREADY2_FACET_KEYS = MappingProxyType({ OWLFacet.MIN_INCLUSIVE: "min_inclusive", OWLFacet.MIN_EXCLUSIVE: "min_exclusive", diff --git a/owlapy/owl_ontology_manager.py b/owlapy/owl_ontology_manager.py index 2d5ff52e..2fcc099e 100644 --- a/owlapy/owl_ontology_manager.py +++ b/owlapy/owl_ontology_manager.py @@ -4,6 +4,7 @@ import types from typing import cast +import jpype import owlready2 from owlapy.iri import IRI @@ -24,9 +25,10 @@ OWLEquivalentObjectPropertiesAxiom, OWLInverseObjectPropertiesAxiom, OWLNaryPropertyAxiom, OWLNaryIndividualAxiom, \ OWLDifferentIndividualsAxiom, OWLDisjointClassesAxiom, OWLSameIndividualAxiom from owlapy.owl_individual import OWLNamedIndividual, OWLIndividual -from owlapy.owl_ontology import OWLOntology, Ontology, ToOwlready2 +from owlapy.owl_ontology import OWLOntology, Ontology, ToOwlready2, SyncOntology from owlapy.owl_property import OWLDataProperty, OWLObjectInverseOf, OWLObjectProperty, \ OWLProperty +from owlapy.static_funcs import startJVM class OWLOntologyChange(metaclass=ABCMeta): @@ -887,3 +889,20 @@ def save_world(self): """ self._world.save() + +class SyncOntologyManager: + # WARN: Do not move local imports to top of the module + def __init__(self): + if not jpype.isJVMStarted(): + startJVM() + from org.semanticweb.owlapi.apibinding import OWLManager + self.owlapi_manager = OWLManager.createOWLOntologyManager() + + def create_ontology(self, iri: IRI) -> SyncOntology: + return SyncOntology(self, iri, new=True) + + def load_ontology(self, iri: IRI) -> SyncOntology: + return SyncOntology(self, iri, new=False) + + def get_owlapi_manager(self): + return self.owlapi_manager From e8a9687eb4cbe5f7bb9450626f0a9ea153af3d88 Mon Sep 17 00:00:00 2001 From: Alkid Date: Tue, 20 Aug 2024 13:29:44 +0200 Subject: [PATCH 04/44] OWLAPIAdaptor disbanded, logic moved to SyncReasoner --- owlapy/owl_reasoner.py | 536 +++++++++++++++++++++++++++++++---- owlapy/owlapi_adaptor.py | 584 --------------------------------------- 2 files changed, 479 insertions(+), 641 deletions(-) delete mode 100644 owlapy/owlapi_adaptor.py diff --git a/owlapy/owl_reasoner.py b/owlapy/owl_reasoner.py index 04b90a92..8e465547 100644 --- a/owlapy/owl_reasoner.py +++ b/owlapy/owl_reasoner.py @@ -22,7 +22,7 @@ from owlapy.owl_data_ranges import OWLDataRange, OWLDataComplementOf, OWLDataUnionOf, OWLDataIntersectionOf from owlapy.owl_datatype import OWLDatatype from owlapy.owl_object import OWLEntity -from owlapy.owl_ontology import OWLOntology, Ontology, _parse_concept_to_owlapy, ToOwlready2 +from owlapy.owl_ontology import OWLOntology, Ontology, _parse_concept_to_owlapy, SyncOntology from owlapy.owl_ontology_manager import OntologyManager from owlapy.owl_property import OWLObjectPropertyExpression, OWLDataProperty, OWLObjectProperty, OWLObjectInverseOf, \ OWLPropertyExpression, OWLDataPropertyExpression @@ -1610,88 +1610,510 @@ def _retrieve_triples(self, pe: OWLPropertyExpression) -> Iterable: yield from relations -class SyncReasoner(OWLReasonerEx): +class SyncReasoner: - def __init__(self, ontology_path: str, reasoner="HermiT"): + def __init__(self, ontology: SyncOntology, reasoner="HermiT"): """ OWL reasoner that syncs to other reasoners like HermiT,Pellet,etc. Args: - ontology_path: Path of ontology that should be used by the reasoner. - reasoner: Choose from (case-sensitive): ["HermiT", "Pellet", "JFact", "Openllet"]. Default: "HermiT". + ontology(SyncOntology): Ontology that will be used by this reasoner. + reasoner: Name of the reasoner. Possible values (case-sensitive): ["HermiT", "Pellet", "JFact", "Openllet"]. + Default: "HermiT". """ - self.manager = OntologyManager() - self.ontology = self.manager.load_ontology(IRI.create("file://" + ontology_path)) - super().__init__(self.ontology) - self.adaptor = OWLAPIAdaptor(ontology_path, reasoner) + assert reasoner in ["HermiT", "Pellet", "JFact", "Openllet"], \ + (f"'{reasoner}' is not implemented. Available reasoners: ['HermiT', 'Pellet', 'JFact', 'Openllet']. " + f"This field is case sensitive.") + self.manager = ontology.manager + self.ontology = ontology + self._owlapi_manager = self.manager.get_owlapi_manager() + self._owlapi_ontology = self.ontology.get_owlapi_ontology() + # super().__init__(self.ontology) + self.mapper = ontology.mapper + from org.semanticweb.owlapi.util import (InferredClassAssertionAxiomGenerator, InferredSubClassAxiomGenerator, + InferredEquivalentClassAxiomGenerator, + InferredDisjointClassesAxiomGenerator, + InferredEquivalentDataPropertiesAxiomGenerator, + InferredEquivalentObjectPropertyAxiomGenerator, + InferredInverseObjectPropertiesAxiomGenerator, + InferredSubDataPropertyAxiomGenerator, + InferredSubObjectPropertyAxiomGenerator, + InferredDataPropertyCharacteristicAxiomGenerator, + InferredObjectPropertyCharacteristicAxiomGenerator) + + self.inference_types_mapping = {"InferredClassAssertionAxiomGenerator": InferredClassAssertionAxiomGenerator(), + "InferredSubClassAxiomGenerator": InferredSubClassAxiomGenerator(), + "InferredDisjointClassesAxiomGenerator": InferredDisjointClassesAxiomGenerator(), + "InferredEquivalentClassAxiomGenerator": InferredEquivalentClassAxiomGenerator(), + "InferredInverseObjectPropertiesAxiomGenerator": InferredInverseObjectPropertiesAxiomGenerator(), + "InferredEquivalentDataPropertiesAxiomGenerator": InferredEquivalentDataPropertiesAxiomGenerator(), + "InferredEquivalentObjectPropertyAxiomGenerator": InferredEquivalentObjectPropertyAxiomGenerator(), + "InferredSubDataPropertyAxiomGenerator": InferredSubDataPropertyAxiomGenerator(), + "InferredSubObjectPropertyAxiomGenerator": InferredSubObjectPropertyAxiomGenerator(), + "InferredDataPropertyCharacteristicAxiomGenerator": InferredDataPropertyCharacteristicAxiomGenerator(), + "InferredObjectPropertyCharacteristicAxiomGenerator": InferredObjectPropertyCharacteristicAxiomGenerator(), + } + + # () Create a reasoner for the loaded ontology + if reasoner == "HermiT": + from org.semanticweb.HermiT import ReasonerFactory + self._owlapi_reasoner = ReasonerFactory().createReasoner(self._owlapi_ontology) + assert self._owlapi_reasoner.getReasonerName() == "HermiT" + elif reasoner == "JFact": + from uk.ac.manchester.cs.jfact import JFactFactory + self._owlapi_reasoner = JFactFactory().createReasoner(self._owlapi_ontology) + elif reasoner == "Pellet": + from openllet.owlapi import PelletReasonerFactory + self._owlapi_reasoner = PelletReasonerFactory().createReasoner(self._owlapi_ontology) + elif reasoner == "Openllet": + from openllet.owlapi import OpenlletReasonerFactory + self._owlapi_reasoner = OpenlletReasonerFactory().getInstance().createReasoner(self._owlapi_ontology) + else: + raise NotImplementedError("Not implemented") - def instances(self, ce: OWLClassExpression, direct: bool = False) -> Iterable[OWLNamedIndividual]: - yield from self.adaptor.instances(ce, direct) + def instances(self, ce: OWLClassExpression, direct=False) -> List[OWLNamedIndividual]: + """ + Get the instances for a given class expression using HermiT. - def data_property_domains(self, pe: OWLDataProperty, direct: bool = False) -> Iterable[OWLClassExpression]: - yield from self.adaptor.data_property_domains(pe, direct) + Args: + ce (OWLClassExpression): The class expression in OWLAPY format. + direct (bool): Whether to get direct instances or not. Defaults to False. - def object_property_domains(self, pe: OWLObjectProperty, direct: bool = False) -> Iterable[OWLClassExpression]: - yield from self.adaptor.object_property_domains(pe, direct) + Returns: + list: A list of individuals classified by the given class expression. + """ + inds = self._owlapi_reasoner.getInstances(self.mapper.map_(ce), direct).getFlattened() + return [self.mapper.map_(ind) for ind in inds] - def object_property_ranges(self, pe: OWLObjectProperty, direct: bool = False) -> Iterable[OWLClassExpression]: - yield from self.adaptor.object_property_ranges(pe, direct) + def equivalent_classes(self, ce: OWLClassExpression) -> List[OWLClassExpression]: + """ + Gets the set of named classes that are equivalent to the specified class expression with + respect to the set of reasoner axioms. - def equivalent_classes(self, ce: OWLClassExpression, only_named: bool = True) -> Iterable[OWLClassExpression]: - yield from self.adaptor.equivalent_classes(ce) + Args: + ce (OWLClassExpression): The class expression whose equivalent classes are to be retrieved. - def disjoint_classes(self, ce: OWLClassExpression, only_named: bool = True) -> Iterable[OWLClassExpression]: - yield from self.adaptor.disjoint_classes(ce) + Returns: + Equivalent classes of the given class expression. + """ + classes = self._owlapi_reasoner.getEquivalentClasses(self.mapper.map_(ce)).getEntities() + yield from [self.mapper.map_(cls) for cls in classes] - def different_individuals(self, ind: OWLNamedIndividual) -> Iterable[OWLNamedIndividual]: - yield from self.adaptor.different_individuals(ind) + def disjoint_classes(self, ce: OWLClassExpression) -> List[OWLClassExpression]: + """ + Gets the classes that are disjoint with the specified class expression. - def same_individuals(self, ind: OWLNamedIndividual) -> Iterable[OWLNamedIndividual]: - yield from self.adaptor.same_individuals(ind) + Args: + ce (OWLClassExpression): The class expression whose disjoint classes are to be retrieved. - def data_property_values(self, e: OWLEntity, pe: OWLDataProperty, direct: bool = True) -> Iterable[OWLLiteral]: - yield from self.adaptor.data_property_values(e, pe) + Returns: + Disjoint classes of the given class expression. + """ + classes = self._owlapi_reasoner.getDisjointClasses(self.mapper.map_(ce)).getFlattened() + yield from [self.mapper.map_(cls) for cls in classes] - def object_property_values(self, ind: OWLNamedIndividual, pe: OWLObjectPropertyExpression, direct: bool = False) -> \ - Iterable[OWLNamedIndividual]: - yield from self.adaptor.object_property_values(ind, pe) + def sub_classes(self, ce: OWLClassExpression, direct=False) -> List[OWLClassExpression]: + """ + Gets the set of named classes that are the strict (potentially direct) subclasses of the + specified class expression with respect to the reasoner axioms. - def sub_classes(self, ce: OWLClassExpression, direct: bool = False, only_named: bool = True) -> Iterable[ - OWLClassExpression]: - yield from self.adaptor.sub_classes(ce, direct) + Args: + ce (OWLClassExpression): The class expression whose strict (direct) subclasses are to be retrieved. + direct (bool, optional): Specifies if the direct subclasses should be retrieved (True) or if + all subclasses (descendant) classes should be retrieved (False). Defaults to False. + Returns: + The subclasses of the given class expression depending on `direct` field. + """ + classes = self._owlapi_reasoner.getSubClasses(self.mapper.map_(ce), direct).getFlattened() + yield from [self.mapper.map_(cls) for cls in classes] - def super_classes(self, ce: OWLClassExpression, direct: bool = False, only_named: bool = True) -> Iterable[ - OWLClassExpression]: - yield from self.adaptor.super_classes(ce, direct) + def super_classes(self, ce: OWLClassExpression, direct=False) -> List[OWLClassExpression]: + """ + Gets the stream of named classes that are the strict (potentially direct) super classes of + the specified class expression with respect to the imports closure of the root ontology. - def equivalent_object_properties(self, op: OWLObjectPropertyExpression) -> Iterable[OWLObjectPropertyExpression]: - yield from self.adaptor.equivalent_object_properties(op) + Args: + ce (OWLClassExpression): The class expression whose strict (direct) subclasses are to be retrieved. + direct (bool, optional): Specifies if the direct superclasses should be retrieved (True) or if + all superclasses (descendant) classes should be retrieved (False). Defaults to False. - def equivalent_data_properties(self, dp: OWLDataProperty) -> Iterable[OWLDataProperty]: - yield from self.adaptor.equivalent_data_properties(dp) + Returns: + The subclasses of the given class expression depending on `direct` field. + """ + classes = self._owlapi_reasoner.getSuperClasses(self.mapper.map_(ce), direct).getFlattened() + yield from [self.mapper.map_(cls) for cls in classes] - def disjoint_object_properties(self, op: OWLObjectPropertyExpression) -> Iterable[OWLObjectPropertyExpression]: - yield from self.adaptor.disjoint_object_properties(op) + def data_property_domains(self, p: OWLDataProperty, direct: bool = False): + """Gets the class expressions that are the direct or indirect domains of this property with respect to the + imports closure of the root ontology. - def disjoint_data_properties(self, dp: OWLDataProperty) -> Iterable[OWLDataProperty]: - yield from self.adaptor.disjoint_data_properties(dp) + Args: + p: The property expression whose domains are to be retrieved. + direct: Specifies if the direct domains should be retrieved (True), or if all domains should be retrieved + (False). - def super_data_properties(self, dp: OWLDataProperty, direct: bool = False) -> Iterable[OWLDataProperty]: - yield from self.adaptor.super_data_properties(dp, direct) + Returns: + :Let N = equivalent_classes(DataSomeValuesFrom(pe rdfs:Literal)). If direct is True: then if N is not + empty then the return value is N, else the return value is the result of + super_classes(DataSomeValuesFrom(pe rdfs:Literal), true). If direct is False: then the result of + super_classes(DataSomeValuesFrom(pe rdfs:Literal), false) together with N if N is non-empty. + (Note, rdfs:Literal is the top datatype). + """ + yield from [self.mapper.map_(ce) for ce in + self._owlapi_reasoner.getDataPropertyDomains(self.mapper.map_(p), direct).getFlattened()] - def sub_data_properties(self, dp: OWLDataProperty, direct: bool = False) -> Iterable[OWLDataProperty]: - yield from self.adaptor.sub_data_properties(dp, direct) + def object_property_domains(self, p: OWLObjectProperty, direct: bool = False): + """Gets the class expressions that are the direct or indirect domains of this property with respect to the + imports closure of the root ontology. - def super_object_properties(self, op: OWLObjectPropertyExpression, direct: bool = False) -> Iterable[ - OWLObjectPropertyExpression]: - yield from self.adaptor.super_object_properties(op, direct) + Args: + p: The property expression whose domains are to be retrieved. + direct: Specifies if the direct domains should be retrieved (True), or if all domains should be retrieved + (False). - def sub_object_properties(self, op: OWLObjectPropertyExpression, direct: bool = False) -> Iterable[ - OWLObjectPropertyExpression]: - yield from self.adaptor.sub_object_properties(op, direct) + Returns: + :Let N = equivalent_classes(ObjectSomeValuesFrom(pe owl:Thing)). If direct is True: then if N is not empty + then the return value is N, else the return value is the result of + super_classes(ObjectSomeValuesFrom(pe owl:Thing), true). If direct is False: then the result of + super_classes(ObjectSomeValuesFrom(pe owl:Thing), false) together with N if N is non-empty. + """ + yield from [self.mapper.map_(ce) for ce in + self._owlapi_reasoner.getObjectPropertyDomains(self.mapper.map_(p), direct).getFlattened()] - def types(self, ind: OWLNamedIndividual, direct: bool = False) -> Iterable[OWLClass]: - yield from self.adaptor.types(ind, direct) + def object_property_ranges(self, p: OWLObjectProperty, direct: bool = False): + """Gets the class expressions that are the direct or indirect ranges of this property with respect to the + imports closure of the root ontology. + + Args: + p: The property expression whose ranges are to be retrieved. + direct: Specifies if the direct ranges should be retrieved (True), or if all ranges should be retrieved + (False). + + Returns: + :Let N = equivalent_classes(ObjectSomeValuesFrom(ObjectInverseOf(pe) owl:Thing)). If direct is True: then + if N is not empty then the return value is N, else the return value is the result of + super_classes(ObjectSomeValuesFrom(ObjectInverseOf(pe) owl:Thing), true). If direct is False: then + the result of super_classes(ObjectSomeValuesFrom(ObjectInverseOf(pe) owl:Thing), false) together with N + if N is non-empty. + """ + yield from [self.mapper.map_(ce) for ce in + self._owlapi_reasoner.getObjectPropertyRanges(self.mapper.map_(p), direct).getFlattened()] + + def sub_object_properties(self, p: OWLObjectProperty, direct: bool = False): + """Gets the stream of simplified object property expressions that are the strict (potentially direct) + subproperties of the specified object property expression with respect to the imports closure of the root + ontology. + + Args: + p: The object property expression whose strict (direct) subproperties are to be retrieved. + direct: Specifies if the direct subproperties should be retrieved (True) or if the all subproperties + (descendants) should be retrieved (False). + + Returns: + If direct is True, simplified object property expressions, such that for each simplified object property + expression, P, the set of reasoner axioms entails DirectSubObjectPropertyOf(P, pe). + If direct is False, simplified object property expressions, such that for each simplified object property + expression, P, the set of reasoner axioms entails StrictSubObjectPropertyOf(P, pe). + If pe is equivalent to owl:bottomObjectProperty then nothing will be returned. + """ + yield from [self.mapper.map_(pe) for pe in + self._owlapi_reasoner.getSubObjectProperties(self.mapper.map_(p), direct).getFlattened()] + + def super_object_properties(self, p: OWLObjectProperty, direct: bool = False): + """Gets the stream of object properties that are the strict (potentially direct) super properties of the + specified object property with respect to the imports closure of the root ontology. + + Args: + p (OWLObjectPropertyExpression): The object property expression whose super properties are to be + retrieved. + direct (bool): Specifies if the direct super properties should be retrieved (True) or if the all + super properties (ancestors) should be retrieved (False). + + Returns: + Iterable of super properties. + """ + yield from [self.mapper.map_(pe) for pe in + self._owlapi_reasoner.getSuperObjectProperties(self.mapper.map_(p), direct).getFlattened()] + + def sub_data_properties(self, p: OWLDataProperty, direct: bool = False): + """Gets the set of named data properties that are the strict (potentially direct) subproperties of the + specified data property expression with respect to the imports closure of the root ontology. + + Args: + p: The data property whose strict (direct) subproperties are to be retrieved. + direct: Specifies if the direct subproperties should be retrieved (True) or if the all subproperties + (descendants) should be retrieved (False). + + Returns: + If direct is True, each property P where the set of reasoner axioms entails DirectSubDataPropertyOf(P, pe). + If direct is False, each property P where the set of reasoner axioms entails + StrictSubDataPropertyOf(P, pe). If pe is equivalent to owl:bottomDataProperty then nothing will be + returned. + """ + yield from [self.mapper.map_(pe) for pe in + self._owlapi_reasoner.getSubDataProperties(self.mapper.map_(p), direct).getFlattened()] + + def super_data_properties(self, p: OWLDataProperty, direct: bool = False): + """Gets the stream of data properties that are the strict (potentially direct) super properties of the + specified data property with respect to the imports closure of the root ontology. + + Args: + p (OWLDataProperty): The data property whose super properties are to be retrieved. + direct (bool): Specifies if the direct super properties should be retrieved (True) or if the all + super properties (ancestors) should be retrieved (False). + + Returns: + Iterable of super properties. + """ + yield from [self.mapper.map_(pe) for pe in + self._owlapi_reasoner.getSuperDataProperties(self.mapper.map_(p), direct).getFlattened()] + + def different_individuals(self, i: OWLNamedIndividual): + """Gets the individuals that are different from the specified individual with respect to the set of + reasoner axioms. + + Args: + i: The individual whose different individuals are to be retrieved. + + Returns: + All individuals x where the set of reasoner axioms entails DifferentIndividuals(ind x). + """ + yield from [self.mapper.map_(ind) for ind in + self._owlapi_reasoner.getDifferentIndividuals(self.mapper.map_(i)).getFlattened()] + + def same_individuals(self, i: OWLNamedIndividual): + """Gets the individuals that are the same as the specified individual with respect to the set of + reasoner axioms. + + Args: + i: The individual whose same individuals are to be retrieved. + + Returns: + All individuals x where the root ontology imports closure entails SameIndividual(ind x). + """ + yield from [self.mapper.map_(ind) for ind in + self.mapper.to_list(self._owlapi_reasoner.sameIndividuals(self.mapper.map_(i)))] + + def equivalent_object_properties(self, p: OWLObjectProperty): + """Gets the simplified object properties that are equivalent to the specified object property with respect + to the set of reasoner axioms. + + Args: + p: The object property whose equivalent object properties are to be retrieved. + + Returns: + All simplified object properties e where the root ontology imports closure entails + EquivalentObjectProperties(op e). If op is unsatisfiable with respect to the set of reasoner axioms + then owl:bottomDataProperty will be returned. + """ + yield from [self.mapper.map_(pe) for pe in + self.mapper.to_list(self._owlapi_reasoner.equivalentObjectProperties(self.mapper.map_(p)))] + + def equivalent_data_properties(self, p: OWLDataProperty): + """Gets the data properties that are equivalent to the specified data property with respect to the set of + reasoner axioms. + + Args: + p: The data property whose equivalent data properties are to be retrieved. + + Returns: + All data properties e where the root ontology imports closure entails EquivalentDataProperties(dp e). + If dp is unsatisfiable with respect to the set of reasoner axioms then owl:bottomDataProperty will + be returned. + """ + yield from [self.mapper.map_(pe) for pe in + self.mapper.to_list(self._owlapi_reasoner.getEquivalentDataProperties(self.mapper.map_(p)))] + + def object_property_values(self, i: OWLNamedIndividual, p: OWLObjectProperty): + """Gets the object property values for the specified individual and object property expression. + + Args: + i: The individual that is the subject of the object property values. + p: The object property expression whose values are to be retrieved for the specified individual. + + Returns: + The named individuals such that for each individual j, the set of reasoner axioms entails + ObjectPropertyAssertion(pe ind j). + """ + yield from [self.mapper.map_(ind) for ind in + self._owlapi_reasoner.getObjectPropertyValues(self.mapper.map_(i), self.mapper.map_(p)).getFlattened()] + + def data_property_values(self, e: OWLEntity, p: OWLDataProperty): + """Gets the data property values for the specified entity and data property expression. + + Args: + e: The entity (usually an individual) that is the subject of the data property values. + p: The data property expression whose values are to be retrieved for the specified individual. + + Returns: + A set of OWLLiterals containing literals such that for each literal l in the set, the set of reasoner + axioms entails DataPropertyAssertion(pe ind l). + """ + yield from [self.mapper.map_(literal) for literal in + self.mapper.to_list(self._owlapi_reasoner.dataPropertyValues(self.mapper.map_(e), self.mapper.map_(p)))] + + def disjoint_object_properties(self, p: OWLObjectProperty): + """Gets the simplified object properties that are disjoint with the specified object property with respect + to the set of reasoner axioms. + + Args: + p: The object property whose disjoint object properties are to be retrieved. + + Returns: + All simplified object properties e where the root ontology imports closure entails + EquivalentObjectProperties(e ObjectPropertyComplementOf(op)) or + StrictSubObjectPropertyOf(e ObjectPropertyComplementOf(op)). + """ + yield from [self.mapper.map_(pe) for pe in + self._owlapi_reasoner.getDisjointObjectProperties(self.mapper.map_(p)).getFlattened()] + + def disjoint_data_properties(self, p: OWLDataProperty): + """Gets the data properties that are disjoint with the specified data property with respect + to the set of reasoner axioms. + + Args: + p: The data property whose disjoint data properties are to be retrieved. + + Returns: + All data properties e where the root ontology imports closure entails + EquivalentDataProperties(e DataPropertyComplementOf(dp)) or + StrictSubDataPropertyOf(e DataPropertyComplementOf(dp)). + """ + yield from [self.mapper.map_(pe) for pe in + self._owlapi_reasoner.getDisjointDataProperties(self.mapper.map_(p)).getFlattened()] + + def types(self, i: OWLNamedIndividual, direct: bool = False): + """Gets the named classes which are (potentially direct) types of the specified named individual. + + Args: + i: The individual whose types are to be retrieved. + direct: Specifies if the direct types should be retrieved (True), or if all types should be retrieved + (False). + + Returns: + If direct is True, each named class C where the set of reasoner axioms entails + DirectClassAssertion(C, ind). If direct is False, each named class C where the set of reasoner axioms + entails ClassAssertion(C, ind). + """ + yield from [self.mapper.map_(ind) for ind in + self._owlapi_reasoner.getTypes(self.mapper.map_(i), direct).getFlattened()] + + def has_consistent_ontology(self) -> bool: + """ + Check if the used ontology is consistent. + + Returns: + bool: True if the ontology used by this reasoner is consistent, False otherwise. + """ + return self._owlapi_reasoner.isConsistent() + + def infer_axioms(self, inference_types: list[str]) -> Iterable[OWLAxiom]: + """ + Infer the specified inference type of axioms for the ontology managed by this instance's reasoner and + return them. + + Args: + inference_types: Axiom inference types: Avaliable options (can set more than 1): + ["InferredClassAssertionAxiomGenerator", "InferredSubClassAxiomGenerator", + "InferredDisjointClassesAxiomGenerator", "InferredEquivalentClassAxiomGenerator", + "InferredEquivalentDataPropertiesAxiomGenerator","InferredEquivalentObjectPropertyAxiomGenerator", + "InferredInverseObjectPropertiesAxiomGenerator","InferredSubDataPropertyAxiomGenerator", + "InferredSubObjectPropertyAxiomGenerator","InferredDataPropertyCharacteristicAxiomGenerator", + "InferredObjectPropertyCharacteristicAxiomGenerator" + ] + + Returns: + Iterable of inferred axioms. + """ + from java.util import ArrayList + from org.semanticweb.owlapi.util import InferredOntologyGenerator + + generators = ArrayList() + for i in inference_types: + if java_object := self.inference_types_mapping.get(i, None): + generators.add(java_object) + iog = InferredOntologyGenerator(self._owlapi_reasoner, generators) + inferred_axioms = list(iog.getAxiomGenerators()) + for ia in inferred_axioms: + for axiom in ia.createAxioms(self._owlapi_manager.getOWLDataFactory(), self._owlapi_reasoner): + yield self.mapper.map_(axiom) + + def infer_axioms_and_save(self, output_path: str = None, output_format: str = None, inference_types: list[str] = None): + """ + Generates inferred axioms for the ontology managed by this instance's reasoner and saves them to a file. + This function uses the OWL API to generate inferred class assertion axioms based on the ontology and reasoner + associated with this instance. The inferred axioms are saved to the specified output file in the desired format. + + Args: + output_path : The name of the file where the inferred axioms will be saved. + output_format : The format in which to save the inferred axioms. Supported formats are: + - "ttl" or "turtle" for Turtle format + - "rdf/xml" for RDF/XML format + - "owl/xml" for OWL/XML format + If not specified, the format of the original ontology is used. + inference_types: Axiom inference types: Avaliable options (can set more than 1): + ["InferredClassAssertionAxiomGenerator", "InferredSubClassAxiomGenerator", + "InferredDisjointClassesAxiomGenerator", "InferredEquivalentClassAxiomGenerator", + "InferredEquivalentDataPropertiesAxiomGenerator","InferredEquivalentObjectPropertyAxiomGenerator", + "InferredInverseObjectPropertiesAxiomGenerator","InferredSubDataPropertyAxiomGenerator", + "InferredSubObjectPropertyAxiomGenerator","InferredDataPropertyCharacteristicAxiomGenerator", + "InferredObjectPropertyCharacteristicAxiomGenerator" + ] + + Returns: + None (the file is saved to the specified directory) + """ + from java.io import File, FileOutputStream + from java.util import ArrayList + from org.semanticweb.owlapi.util import InferredOntologyGenerator + from org.semanticweb.owlapi.formats import TurtleDocumentFormat, RDFXMLDocumentFormat, OWLXMLDocumentFormat + if output_format == "ttl" or output_format == "turtle": + document_format = TurtleDocumentFormat() + elif output_format == "rdf/xml": + document_format = RDFXMLDocumentFormat() + elif output_format == "owl/xml": + document_format = OWLXMLDocumentFormat() + else: + document_format = self._owlapi_manager.getOntologyFormat(self._owlapi_ontology) + generators = ArrayList() + + for i in inference_types: + if java_object := self.inference_types_mapping.get(i, None): + generators.add(java_object) + iog = InferredOntologyGenerator(self._owlapi_reasoner, generators) + inferred_axioms_ontology = self._owlapi_manager.createOntology() + iog.fillOntology(self._owlapi_manager.getOWLDataFactory(), inferred_axioms_ontology) + inferred_ontology_file = File(output_path).getAbsoluteFile() + output_stream = FileOutputStream(inferred_ontology_file) + self._owlapi_manager.saveOntology(inferred_axioms_ontology, document_format, output_stream) + + def generate_and_save_inferred_class_assertion_axioms(self, output="temp.ttl", output_format: str = None): + """ + Generates inferred class assertion axioms for the ontology managed by this instance's reasoner and saves them to a file. + This function uses the OWL API to generate inferred class assertion axioms based on the ontology and reasoner + associated with this instance. The inferred axioms are saved to the specified output file in the desired format. + Parameters: + ----------- + output : str, optional + The name of the file where the inferred axioms will be saved. Default is "temp.ttl". + output_format : str, optional + The format in which to save the inferred axioms. Supported formats are: + - "ttl" or "turtle" for Turtle format + - "rdf/xml" for RDF/XML format + - "owl/xml" for OWL/XML format + If not specified, the format of the original ontology is used. + Notes: + ------ + - The function supports saving in multiple formats: Turtle, RDF/XML, and OWL/XML. + - The inferred axioms are generated using the reasoner associated with this instance and the OWL API's + InferredClassAssertionAxiomGenerator. + - The inferred axioms are added to a new ontology which is then saved in the specified format. + Example: + -------- + >>> instance.generate_and_save_inferred_class_assertion_axioms(output="inferred_axioms.ttl", format="ttl") + This will save the inferred class assertion axioms to the file "inferred_axioms.ttl" in Turtle format. + """ + self.infer_axioms_and_save(output, output_format, ["InferredClassAssertionAxiomGenerator"]) def get_root_ontology(self) -> OWLOntology: - return self.ontology \ No newline at end of file + return self.ontology diff --git a/owlapy/owlapi_adaptor.py b/owlapy/owlapi_adaptor.py deleted file mode 100644 index 856cef2b..00000000 --- a/owlapy/owlapi_adaptor.py +++ /dev/null @@ -1,584 +0,0 @@ -"""Owlapi Adaptor - -Part of the docstrings are taken directly from owlapi -""" -import jpype.imports -import os -import pkg_resources - -from owlapy.class_expression import OWLClassExpression -from owlapy.owl_axiom import OWLAxiom -from owlapy.owl_individual import OWLNamedIndividual -from owlapy.owl_object import OWLEntity -from owlapy.owl_property import OWLDataProperty, OWLObjectProperty -from typing import List, Iterable - - -def to_list(stream_obj): - """Converts Java Stream object to Python list""" - return stream_obj.collect(jpype.JClass("java.util.stream.Collectors").toList()) - - -class OWLAPIAdaptor: - """ - A class to interface with the OWL API using the HermiT reasoner, enabling ontology management, - reasoning, and parsing class expressions in Manchester OWL Syntax. - - Attributes: - path (str): The file path to the ontology. - name_reasoner (str): The reasoner to be used, default is "HermiT". - manager: The OWL ontology manager. - ontology: The loaded OWL ontology. - reasoner: Choose from (case-sensitive): ["HermiT", "Pellet", "JFact", "Openllet"]. Default: "HermiT". - """ - - def __init__(self, path: str, name_reasoner: str = "HermiT"): - """ - Initialize the OWLAPIAdaptor with a path to an ontology and a reasoner name. - - Args: - path (str): The file path to the ontology. - name_reasoner (str, optional): The reasoner to be used. - Available options are: ['HermiT' (default), 'Pellet', 'JFact', 'Openllet']. - - Raises: - AssertionError: If the provided reasoner name is not implemented. - """ - self.path = path - assert name_reasoner in ["HermiT", "Pellet", "JFact", "Openllet"], \ - (f"'{name_reasoner}' is not implemented. Available reasoners: ['HermiT', 'Pellet', 'JFact', 'Openllet']. " - f"This field is case sensitive.") - self.name_reasoner = name_reasoner - # Attributes are initialized as JVM is started - # () Manager is needed to load an ontology - self.manager = None - # () Load a local ontology using the manager - self.ontology = None - # () Create a reasoner for the loaded ontology - self.reasoner = None - # () For mapping entities/expressions from/to owlapi - self.mapper = None - # () Set up the necessary attributes by making use of the java packages - self._setup() - - def _startJVM(self): - """Start the JVM with jar dependencies. This method is called automatically on object initialization, if the - JVM is not started yet.""" - # Start a java virtual machine using the dependencies in the respective folder: - jar_folder = pkg_resources.resource_filename('owlapy', 'jar_dependencies') - jar_files = [os.path.join(jar_folder, f) for f in os.listdir(jar_folder) if f.endswith('.jar')] - # Starting JVM. - jpype.startJVM(classpath=jar_files) - - def stopJVM(self, *args, **kwargs) -> None: - """Detaches the thread from Java packages and shuts down the java virtual machine hosted by jpype.""" - if jpype.isJVMStarted(): - jpype.detachThreadFromJVM() - jpype.shutdownJVM() - - def _setup(self): - """ - Start the JVM if not already, import necessary OWL API dependencies, and initialize attributes. - """ - if not jpype.isJVMStarted(): - self._startJVM() - - # Imports - from owlapy.owlapi_mapper import OWLAPIMapper - from org.semanticweb.owlapi.apibinding import OWLManager - from java.io import File - from org.semanticweb.owlapi.util import (InferredClassAssertionAxiomGenerator, InferredSubClassAxiomGenerator, - InferredEquivalentClassAxiomGenerator, - InferredDisjointClassesAxiomGenerator, - InferredEquivalentDataPropertiesAxiomGenerator, - InferredEquivalentObjectPropertyAxiomGenerator, - InferredInverseObjectPropertiesAxiomGenerator, - InferredSubDataPropertyAxiomGenerator, - InferredSubObjectPropertyAxiomGenerator, - InferredDataPropertyCharacteristicAxiomGenerator, - InferredObjectPropertyCharacteristicAxiomGenerator) - - self.inference_types_mapping = {"InferredClassAssertionAxiomGenerator": InferredClassAssertionAxiomGenerator(), - "InferredSubClassAxiomGenerator": InferredSubClassAxiomGenerator(), - "InferredDisjointClassesAxiomGenerator": InferredDisjointClassesAxiomGenerator(), - "InferredEquivalentClassAxiomGenerator": InferredEquivalentClassAxiomGenerator(), - "InferredInverseObjectPropertiesAxiomGenerator": InferredInverseObjectPropertiesAxiomGenerator(), - "InferredEquivalentDataPropertiesAxiomGenerator": InferredEquivalentDataPropertiesAxiomGenerator(), - "InferredEquivalentObjectPropertyAxiomGenerator": InferredEquivalentObjectPropertyAxiomGenerator(), - "InferredSubDataPropertyAxiomGenerator": InferredSubDataPropertyAxiomGenerator(), - "InferredSubObjectPropertyAxiomGenerator": InferredSubObjectPropertyAxiomGenerator(), - "InferredDataPropertyCharacteristicAxiomGenerator": InferredDataPropertyCharacteristicAxiomGenerator(), - "InferredObjectPropertyCharacteristicAxiomGenerator": InferredObjectPropertyCharacteristicAxiomGenerator(), - } - - if self.name_reasoner == "HermiT": - from org.semanticweb.HermiT import ReasonerFactory - elif self.name_reasoner == "Pellet": - from openllet.owlapi import PelletReasonerFactory - elif self.name_reasoner == "JFact": - from uk.ac.manchester.cs.jfact import JFactFactory - elif self.name_reasoner == "Openllet": - from openllet.owlapi import OpenlletReasonerFactory - else: - raise NotImplementedError("Not implemented") - - # () Manager is needed to load an ontology - self.manager = OWLManager.createOWLOntologyManager() - # () Load a local ontology using the manager - self.ontology = self.manager.loadOntologyFromOntologyDocument(File(self.path)) - self.mapper = OWLAPIMapper(self.ontology) - - # () Create a reasoner for the loaded ontology - if self.name_reasoner == "HermiT": - self.reasoner = ReasonerFactory().createReasoner(self.ontology) - assert self.reasoner.getReasonerName() == "HermiT" - elif self.name_reasoner == "JFact": - self.reasoner = JFactFactory().createReasoner(self.ontology) - elif self.name_reasoner == "Pellet": - self.reasoner = PelletReasonerFactory().createReasoner(self.ontology) - elif self.name_reasoner == "Openllet": - self.reasoner = OpenlletReasonerFactory().getInstance().createReasoner(self.ontology) - - def has_consistent_ontology(self) -> bool: - """ - Check if the used ontology is consistent. - - Returns: - bool: True if the ontology is consistent, False otherwise. - """ - return self.reasoner.isConsistent() - - def instances(self, ce: OWLClassExpression, direct=False) -> List[OWLNamedIndividual]: - """ - Get the instances for a given class expression using HermiT. - - Args: - ce (OWLClassExpression): The class expression in OWLAPY format. - direct (bool): Whether to get direct instances or not. Defaults to False. - - Returns: - list: A list of individuals classified by the given class expression. - """ - inds = self.reasoner.getInstances(self.mapper.map_(ce), direct).getFlattened() - return [self.mapper.map_(ind) for ind in inds] - - def equivalent_classes(self, ce: OWLClassExpression) -> List[OWLClassExpression]: - """ - Gets the set of named classes that are equivalent to the specified class expression with - respect to the set of reasoner axioms. - - Args: - ce (OWLClassExpression): The class expression whose equivalent classes are to be retrieved. - - Returns: - Equivalent classes of the given class expression. - """ - classes = self.reasoner.getEquivalentClasses(self.mapper.map_(ce)).getEntities() - yield from [self.mapper.map_(cls) for cls in classes] - - def disjoint_classes(self, ce: OWLClassExpression) -> List[OWLClassExpression]: - """ - Gets the classes that are disjoint with the specified class expression. - - Args: - ce (OWLClassExpression): The class expression whose disjoint classes are to be retrieved. - - Returns: - Disjoint classes of the given class expression. - """ - classes = self.reasoner.getDisjointClasses(self.mapper.map_(ce)).getFlattened() - yield from [self.mapper.map_(cls) for cls in classes] - - def sub_classes(self, ce: OWLClassExpression, direct=False) -> List[OWLClassExpression]: - """ - Gets the set of named classes that are the strict (potentially direct) subclasses of the - specified class expression with respect to the reasoner axioms. - - Args: - ce (OWLClassExpression): The class expression whose strict (direct) subclasses are to be retrieved. - direct (bool, optional): Specifies if the direct subclasses should be retrieved (True) or if - all subclasses (descendant) classes should be retrieved (False). Defaults to False. - Returns: - The subclasses of the given class expression depending on `direct` field. - """ - classes = self.reasoner.getSubClasses(self.mapper.map_(ce), direct).getFlattened() - yield from [self.mapper.map_(cls) for cls in classes] - - def super_classes(self, ce: OWLClassExpression, direct=False) -> List[OWLClassExpression]: - """ - Gets the stream of named classes that are the strict (potentially direct) super classes of - the specified class expression with respect to the imports closure of the root ontology. - - Args: - ce (OWLClassExpression): The class expression whose strict (direct) subclasses are to be retrieved. - direct (bool, optional): Specifies if the direct superclasses should be retrieved (True) or if - all superclasses (descendant) classes should be retrieved (False). Defaults to False. - - Returns: - The subclasses of the given class expression depending on `direct` field. - """ - classes = self.reasoner.getSuperClasses(self.mapper.map_(ce), direct).getFlattened() - yield from [self.mapper.map_(cls) for cls in classes] - - def data_property_domains(self, p: OWLDataProperty, direct: bool = False): - """Gets the class expressions that are the direct or indirect domains of this property with respect to the - imports closure of the root ontology. - - Args: - p: The property expression whose domains are to be retrieved. - direct: Specifies if the direct domains should be retrieved (True), or if all domains should be retrieved - (False). - - Returns: - :Let N = equivalent_classes(DataSomeValuesFrom(pe rdfs:Literal)). If direct is True: then if N is not - empty then the return value is N, else the return value is the result of - super_classes(DataSomeValuesFrom(pe rdfs:Literal), true). If direct is False: then the result of - super_classes(DataSomeValuesFrom(pe rdfs:Literal), false) together with N if N is non-empty. - (Note, rdfs:Literal is the top datatype). - """ - yield from [self.mapper.map_(ce) for ce in - self.reasoner.getDataPropertyDomains(self.mapper.map_(p), direct).getFlattened()] - - def object_property_domains(self, p: OWLObjectProperty, direct: bool = False): - """Gets the class expressions that are the direct or indirect domains of this property with respect to the - imports closure of the root ontology. - - Args: - p: The property expression whose domains are to be retrieved. - direct: Specifies if the direct domains should be retrieved (True), or if all domains should be retrieved - (False). - - Returns: - :Let N = equivalent_classes(ObjectSomeValuesFrom(pe owl:Thing)). If direct is True: then if N is not empty - then the return value is N, else the return value is the result of - super_classes(ObjectSomeValuesFrom(pe owl:Thing), true). If direct is False: then the result of - super_classes(ObjectSomeValuesFrom(pe owl:Thing), false) together with N if N is non-empty. - """ - yield from [self.mapper.map_(ce) for ce in - self.reasoner.getObjectPropertyDomains(self.mapper.map_(p), direct).getFlattened()] - - def object_property_ranges(self, p: OWLObjectProperty, direct: bool = False): - """Gets the class expressions that are the direct or indirect ranges of this property with respect to the - imports closure of the root ontology. - - Args: - p: The property expression whose ranges are to be retrieved. - direct: Specifies if the direct ranges should be retrieved (True), or if all ranges should be retrieved - (False). - - Returns: - :Let N = equivalent_classes(ObjectSomeValuesFrom(ObjectInverseOf(pe) owl:Thing)). If direct is True: then - if N is not empty then the return value is N, else the return value is the result of - super_classes(ObjectSomeValuesFrom(ObjectInverseOf(pe) owl:Thing), true). If direct is False: then - the result of super_classes(ObjectSomeValuesFrom(ObjectInverseOf(pe) owl:Thing), false) together with N - if N is non-empty. - """ - yield from [self.mapper.map_(ce) for ce in - self.reasoner.getObjectPropertyRanges(self.mapper.map_(p), direct).getFlattened()] - - def sub_object_properties(self, p: OWLObjectProperty, direct: bool = False): - """Gets the stream of simplified object property expressions that are the strict (potentially direct) - subproperties of the specified object property expression with respect to the imports closure of the root - ontology. - - Args: - p: The object property expression whose strict (direct) subproperties are to be retrieved. - direct: Specifies if the direct subproperties should be retrieved (True) or if the all subproperties - (descendants) should be retrieved (False). - - Returns: - If direct is True, simplified object property expressions, such that for each simplified object property - expression, P, the set of reasoner axioms entails DirectSubObjectPropertyOf(P, pe). - If direct is False, simplified object property expressions, such that for each simplified object property - expression, P, the set of reasoner axioms entails StrictSubObjectPropertyOf(P, pe). - If pe is equivalent to owl:bottomObjectProperty then nothing will be returned. - """ - yield from [self.mapper.map_(pe) for pe in - self.reasoner.getSubObjectProperties(self.mapper.map_(p), direct).getFlattened()] - - def super_object_properties(self, p: OWLObjectProperty, direct: bool = False): - """Gets the stream of object properties that are the strict (potentially direct) super properties of the - specified object property with respect to the imports closure of the root ontology. - - Args: - p (OWLObjectPropertyExpression): The object property expression whose super properties are to be - retrieved. - direct (bool): Specifies if the direct super properties should be retrieved (True) or if the all - super properties (ancestors) should be retrieved (False). - - Returns: - Iterable of super properties. - """ - yield from [self.mapper.map_(pe) for pe in - self.reasoner.getSuperObjectProperties(self.mapper.map_(p), direct).getFlattened()] - - def sub_data_properties(self, p: OWLDataProperty, direct: bool = False): - """Gets the set of named data properties that are the strict (potentially direct) subproperties of the - specified data property expression with respect to the imports closure of the root ontology. - - Args: - p: The data property whose strict (direct) subproperties are to be retrieved. - direct: Specifies if the direct subproperties should be retrieved (True) or if the all subproperties - (descendants) should be retrieved (False). - - Returns: - If direct is True, each property P where the set of reasoner axioms entails DirectSubDataPropertyOf(P, pe). - If direct is False, each property P where the set of reasoner axioms entails - StrictSubDataPropertyOf(P, pe). If pe is equivalent to owl:bottomDataProperty then nothing will be - returned. - """ - yield from [self.mapper.map_(pe) for pe in - self.reasoner.getSubDataProperties(self.mapper.map_(p), direct).getFlattened()] - - def super_data_properties(self, p: OWLDataProperty, direct: bool = False): - """Gets the stream of data properties that are the strict (potentially direct) super properties of the - specified data property with respect to the imports closure of the root ontology. - - Args: - p (OWLDataProperty): The data property whose super properties are to be retrieved. - direct (bool): Specifies if the direct super properties should be retrieved (True) or if the all - super properties (ancestors) should be retrieved (False). - - Returns: - Iterable of super properties. - """ - yield from [self.mapper.map_(pe) for pe in - self.reasoner.getSuperDataProperties(self.mapper.map_(p), direct).getFlattened()] - - def different_individuals(self, i: OWLNamedIndividual): - """Gets the individuals that are different from the specified individual with respect to the set of - reasoner axioms. - - Args: - i: The individual whose different individuals are to be retrieved. - - Returns: - All individuals x where the set of reasoner axioms entails DifferentIndividuals(ind x). - """ - yield from [self.mapper.map_(ind) for ind in - self.reasoner.getDifferentIndividuals(self.mapper.map_(i)).getFlattened()] - - def same_individuals(self, i: OWLNamedIndividual): - """Gets the individuals that are the same as the specified individual with respect to the set of - reasoner axioms. - - Args: - i: The individual whose same individuals are to be retrieved. - - Returns: - All individuals x where the root ontology imports closure entails SameIndividual(ind x). - """ - yield from [self.mapper.map_(ind) for ind in - to_list(self.reasoner.sameIndividuals(self.mapper.map_(i)))] - - def equivalent_object_properties(self, p: OWLObjectProperty): - """Gets the simplified object properties that are equivalent to the specified object property with respect - to the set of reasoner axioms. - - Args: - p: The object property whose equivalent object properties are to be retrieved. - - Returns: - All simplified object properties e where the root ontology imports closure entails - EquivalentObjectProperties(op e). If op is unsatisfiable with respect to the set of reasoner axioms - then owl:bottomDataProperty will be returned. - """ - yield from [self.mapper.map_(pe) for pe in - to_list(self.reasoner.equivalentObjectProperties(self.mapper.map_(p)))] - - def equivalent_data_properties(self, p: OWLDataProperty): - """Gets the data properties that are equivalent to the specified data property with respect to the set of - reasoner axioms. - - Args: - p: The data property whose equivalent data properties are to be retrieved. - - Returns: - All data properties e where the root ontology imports closure entails EquivalentDataProperties(dp e). - If dp is unsatisfiable with respect to the set of reasoner axioms then owl:bottomDataProperty will - be returned. - """ - yield from [self.mapper.map_(pe) for pe in - to_list(self.reasoner.getEquivalentDataProperties(self.mapper.map_(p)))] - - def object_property_values(self, i: OWLNamedIndividual, p: OWLObjectProperty): - """Gets the object property values for the specified individual and object property expression. - - Args: - i: The individual that is the subject of the object property values. - p: The object property expression whose values are to be retrieved for the specified individual. - - Returns: - The named individuals such that for each individual j, the set of reasoner axioms entails - ObjectPropertyAssertion(pe ind j). - """ - yield from [self.mapper.map_(ind) for ind in - self.reasoner.getObjectPropertyValues(self.mapper.map_(i), self.mapper.map_(p)).getFlattened()] - - def data_property_values(self, e: OWLEntity, p: OWLDataProperty): - """Gets the data property values for the specified entity and data property expression. - - Args: - e: The entity (usually an individual) that is the subject of the data property values. - p: The data property expression whose values are to be retrieved for the specified individual. - - Returns: - A set of OWLLiterals containing literals such that for each literal l in the set, the set of reasoner - axioms entails DataPropertyAssertion(pe ind l). - """ - yield from [self.mapper.map_(literal) for literal in - to_list(self.reasoner.dataPropertyValues(self.mapper.map_(e), self.mapper.map_(p)))] - - def disjoint_object_properties(self, p: OWLObjectProperty): - """Gets the simplified object properties that are disjoint with the specified object property with respect - to the set of reasoner axioms. - - Args: - p: The object property whose disjoint object properties are to be retrieved. - - Returns: - All simplified object properties e where the root ontology imports closure entails - EquivalentObjectProperties(e ObjectPropertyComplementOf(op)) or - StrictSubObjectPropertyOf(e ObjectPropertyComplementOf(op)). - """ - yield from [self.mapper.map_(pe) for pe in - self.reasoner.getDisjointObjectProperties(self.mapper.map_(p)).getFlattened()] - - def disjoint_data_properties(self, p: OWLDataProperty): - """Gets the data properties that are disjoint with the specified data property with respect - to the set of reasoner axioms. - - Args: - p: The data property whose disjoint data properties are to be retrieved. - - Returns: - All data properties e where the root ontology imports closure entails - EquivalentDataProperties(e DataPropertyComplementOf(dp)) or - StrictSubDataPropertyOf(e DataPropertyComplementOf(dp)). - """ - yield from [self.mapper.map_(pe) for pe in - self.reasoner.getDisjointDataProperties(self.mapper.map_(p)).getFlattened()] - - def types(self, i: OWLNamedIndividual, direct: bool = False): - """Gets the named classes which are (potentially direct) types of the specified named individual. - - Args: - i: The individual whose types are to be retrieved. - direct: Specifies if the direct types should be retrieved (True), or if all types should be retrieved - (False). - - Returns: - If direct is True, each named class C where the set of reasoner axioms entails - DirectClassAssertion(C, ind). If direct is False, each named class C where the set of reasoner axioms - entails ClassAssertion(C, ind). - """ - yield from [self.mapper.map_(ind) for ind in - self.reasoner.getTypes(self.mapper.map_(i), direct).getFlattened()] - - def infer_axioms(self, inference_types: list[str]) -> Iterable[OWLAxiom]: - """ - Infer the specified inference type of axioms for the ontology managed by this instance's reasoner and - return them. - - Args: - inference_types: Axiom inference types: Avaliable options (can set more than 1): - ["InferredClassAssertionAxiomGenerator", "InferredSubClassAxiomGenerator", - "InferredDisjointClassesAxiomGenerator", "InferredEquivalentClassAxiomGenerator", - "InferredEquivalentDataPropertiesAxiomGenerator","InferredEquivalentObjectPropertyAxiomGenerator", - "InferredInverseObjectPropertiesAxiomGenerator","InferredSubDataPropertyAxiomGenerator", - "InferredSubObjectPropertyAxiomGenerator","InferredDataPropertyCharacteristicAxiomGenerator", - "InferredObjectPropertyCharacteristicAxiomGenerator" - ] - - Returns: - Iterable of inferred axioms. - """ - from java.util import ArrayList - from org.semanticweb.owlapi.util import InferredOntologyGenerator - - generators = ArrayList() - for i in inference_types: - if java_object := self.inference_types_mapping.get(i, None): - generators.add(java_object) - iog = InferredOntologyGenerator(self.reasoner, generators) - inferred_axioms = list(iog.getAxiomGenerators()) - for ia in inferred_axioms: - for axiom in ia.createAxioms(self.manager.getOWLDataFactory(), self.reasoner): - yield self.mapper.map_(axiom) - - def infer_axioms_and_save(self, output_path: str = None, output_format: str = None, inference_types: list[str] = None): - """ - Generates inferred axioms for the ontology managed by this instance's reasoner and saves them to a file. - This function uses the OWL API to generate inferred class assertion axioms based on the ontology and reasoner - associated with this instance. The inferred axioms are saved to the specified output file in the desired format. - - Args: - output_path : The name of the file where the inferred axioms will be saved. - output_format : The format in which to save the inferred axioms. Supported formats are: - - "ttl" or "turtle" for Turtle format - - "rdf/xml" for RDF/XML format - - "owl/xml" for OWL/XML format - If not specified, the format of the original ontology is used. - inference_types: Axiom inference types: Avaliable options (can set more than 1): - ["InferredClassAssertionAxiomGenerator", "InferredSubClassAxiomGenerator", - "InferredDisjointClassesAxiomGenerator", "InferredEquivalentClassAxiomGenerator", - "InferredEquivalentDataPropertiesAxiomGenerator","InferredEquivalentObjectPropertyAxiomGenerator", - "InferredInverseObjectPropertiesAxiomGenerator","InferredSubDataPropertyAxiomGenerator", - "InferredSubObjectPropertyAxiomGenerator","InferredDataPropertyCharacteristicAxiomGenerator", - "InferredObjectPropertyCharacteristicAxiomGenerator" - ] - - Returns: - None (the file is saved to the specified directory) - """ - from java.io import File, FileOutputStream - from java.util import ArrayList - from org.semanticweb.owlapi.util import InferredOntologyGenerator - from org.semanticweb.owlapi.formats import TurtleDocumentFormat, RDFXMLDocumentFormat, OWLXMLDocumentFormat - if output_format == "ttl" or output_format == "turtle": - document_format = TurtleDocumentFormat() - elif output_format == "rdf/xml": - document_format = RDFXMLDocumentFormat() - elif output_format == "owl/xml": - document_format = OWLXMLDocumentFormat() - else: - document_format = self.manager.getOntologyFormat(self.ontology) - generators = ArrayList() - - for i in inference_types: - if java_object := self.inference_types_mapping.get(i, None): - generators.add(java_object) - iog = InferredOntologyGenerator(self.reasoner, generators) - inferred_axioms_ontology = self.manager.createOntology() - iog.fillOntology(self.manager.getOWLDataFactory(), inferred_axioms_ontology) - inferred_ontology_file = File(output_path).getAbsoluteFile() - output_stream = FileOutputStream(inferred_ontology_file) - self.manager.saveOntology(inferred_axioms_ontology, document_format, output_stream) - - def generate_and_save_inferred_class_assertion_axioms(self, output="temp.ttl", output_format: str = None): - """ - Generates inferred class assertion axioms for the ontology managed by this instance's reasoner and saves them to a file. - This function uses the OWL API to generate inferred class assertion axioms based on the ontology and reasoner - associated with this instance. The inferred axioms are saved to the specified output file in the desired format. - Parameters: - ----------- - output : str, optional - The name of the file where the inferred axioms will be saved. Default is "temp.ttl". - output_format : str, optional - The format in which to save the inferred axioms. Supported formats are: - - "ttl" or "turtle" for Turtle format - - "rdf/xml" for RDF/XML format - - "owl/xml" for OWL/XML format - If not specified, the format of the original ontology is used. - Notes: - ------ - - The function supports saving in multiple formats: Turtle, RDF/XML, and OWL/XML. - - The inferred axioms are generated using the reasoner associated with this instance and the OWL API's - InferredClassAssertionAxiomGenerator. - - The inferred axioms are added to a new ontology which is then saved in the specified format. - Example: - -------- - >>> instance.generate_inferred_class_assertion_axioms(output="inferred_axioms.ttl", format="ttl") - This will save the inferred class assertion axioms to the file "inferred_axioms.ttl" in Turtle format. - """ - self.infer_axioms_and_save(output, output_format, ["InferredClassAssertionAxiomGenerator"]) From 35ecec07341e9845fc653ecc276828e438de678b Mon Sep 17 00:00:00 2001 From: Alkid Date: Tue, 20 Aug 2024 13:50:01 +0200 Subject: [PATCH 05/44] updated test to latest changes --- ...wlapi_adaptor.py => test_sync_reasoner.py} | 28 +++++++++++-------- 1 file changed, 16 insertions(+), 12 deletions(-) rename tests/{test_owlapi_adaptor.py => test_sync_reasoner.py} (81%) diff --git a/tests/test_owlapi_adaptor.py b/tests/test_sync_reasoner.py similarity index 81% rename from tests/test_owlapi_adaptor.py rename to tests/test_sync_reasoner.py index 47d5e9a2..6a07c2be 100644 --- a/tests/test_owlapi_adaptor.py +++ b/tests/test_sync_reasoner.py @@ -7,23 +7,25 @@ from owlapy.iri import IRI from owlapy.owl_axiom import OWLDisjointClassesAxiom, OWLDeclarationAxiom, OWLClassAssertionAxiom from owlapy.owl_individual import OWLNamedIndividual -from owlapy.owl_ontology_manager import OntologyManager +from owlapy.owl_ontology_manager import OntologyManager, SyncOntologyManager from owlapy.owl_property import OWLDataProperty -from owlapy.owlapi_adaptor import OWLAPIAdaptor +from owlapy.owl_reasoner import SyncReasoner from owlapy.providers import owl_datatype_min_inclusive_restriction -class TestOwlapiAdaptor(unittest.TestCase): +class TestSyncReasoner(unittest.TestCase): ns = "http://dl-learner.org/mutagenesis#" ontology_path = "KGs/Mutagenesis/mutagenesis.owl" nitrogen38 = OWLClass(IRI.create(ns, "Nitrogen-38")) charge = OWLDataProperty(IRI.create(ns, "charge")) has_charge_more_than_0_85 = OWLDataSomeValuesFrom(charge, owl_datatype_min_inclusive_restriction(0.85)) ce = OWLObjectIntersectionOf([nitrogen38, has_charge_more_than_0_85]) - adaptor = OWLAPIAdaptor(ontology_path) + manager = SyncOntologyManager() + onto = manager.load_ontology(IRI.create(ontology_path)) + reasoner = SyncReasoner(onto) def test_consistency_check(self): - self.assertEqual(self.adaptor.has_consistent_ontology(), True) + self.assertEqual(self.reasoner.has_consistent_ontology(), True) def test_inconsistency_check(self): manager = OntologyManager() @@ -38,12 +40,14 @@ def test_inconsistency_check(self): manager.add_axiom(onto, OWLClassAssertionAxiom(new_individual, carbon230)) manager.save_ontology(onto, IRI.create("file:/test.owl")) - adaptor1 = OWLAPIAdaptor("test.owl") - self.assertEqual(adaptor1.has_consistent_ontology(), False) + som = SyncOntologyManager() + onto2 = som.load_ontology(IRI.create("test.owl")) + reasoner = SyncReasoner(onto2) + self.assertEqual(reasoner.has_consistent_ontology(), False) os.remove("test.owl") def test_instances_retrieval(self): - instances = self.adaptor.instances(self.ce) + instances = self.reasoner.instances(self.ce) expected = [OWLNamedIndividual(IRI('http://dl-learner.org/mutagenesis#', 'd141_10')), OWLNamedIndividual(IRI('http://dl-learner.org/mutagenesis#', 'd195_12')), OWLNamedIndividual(IRI('http://dl-learner.org/mutagenesis#', 'd144_10')), @@ -64,7 +68,7 @@ def test_conversion(self): nitrogenIRI = IRIowlapi.create(self.ns + "Nitrogen-38") charge_iri = IRIowlapi.create(self.ns + "charge") - data_factory = self.adaptor.manager.getOWLDataFactory() + data_factory = self.reasoner.manager.get_owlapi_manager().getOWLDataFactory() nitrogen_class = data_factory.getOWLClass(nitrogenIRI) charge_property = data_factory.getOWLDataProperty(charge_iri) @@ -76,14 +80,14 @@ def test_conversion(self): class_expression = data_factory.getOWLObjectIntersectionOf(nitrogen_class, some_values_from) # compare them with the adaptor converted expression - ce_converted = self.adaptor.mapper.map_(self.ce) + ce_converted = self.reasoner.mapper.map_(self.ce) print(ce_converted) print(class_expression) self.assertEqual(class_expression, ce_converted) # convert back to owlapy and check for equality - ce_1 = self.adaptor.mapper.map_(class_expression) - ce_2 = self.adaptor.mapper.map_(ce_converted) + ce_1 = self.reasoner.mapper.map_(class_expression) + ce_2 = self.reasoner.mapper.map_(ce_converted) self.assertEqual(ce_1, ce_2) self.assertEqual(ce_1, self.ce) From 78d9aef7a48f30b036682367afe0c3b0a5eea013 Mon Sep 17 00:00:00 2001 From: Alkid Date: Tue, 20 Aug 2024 14:35:50 +0200 Subject: [PATCH 06/44] SyncReasoner optional init using path --- owlapy/owl_reasoner.py | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/owlapy/owl_reasoner.py b/owlapy/owl_reasoner.py index 8e465547..0074e939 100644 --- a/owlapy/owl_reasoner.py +++ b/owlapy/owl_reasoner.py @@ -2,11 +2,10 @@ import operator from abc import ABCMeta, abstractmethod from collections import defaultdict -from enum import Enum, auto from functools import singledispatchmethod, reduce from itertools import chain, repeat from types import MappingProxyType, FunctionType -from typing import DefaultDict, Iterable, Dict, Mapping, Set, Type, TypeVar, Optional, FrozenSet, List, cast +from typing import DefaultDict, Iterable, Dict, Mapping, Set, Type, TypeVar, Optional, FrozenSet, List, Union import logging import owlready2 @@ -23,12 +22,11 @@ from owlapy.owl_datatype import OWLDatatype from owlapy.owl_object import OWLEntity from owlapy.owl_ontology import OWLOntology, Ontology, _parse_concept_to_owlapy, SyncOntology -from owlapy.owl_ontology_manager import OntologyManager +from owlapy.owl_ontology_manager import SyncOntologyManager from owlapy.owl_property import OWLObjectPropertyExpression, OWLDataProperty, OWLObjectProperty, OWLObjectInverseOf, \ OWLPropertyExpression, OWLDataPropertyExpression from owlapy.owl_individual import OWLNamedIndividual from owlapy.owl_literal import OWLLiteral -from owlapy.owlapi_adaptor import OWLAPIAdaptor from owlapy.utils import LRUCache logger = logging.getLogger(__name__) @@ -1612,7 +1610,7 @@ def _retrieve_triples(self, pe: OWLPropertyExpression) -> Iterable: class SyncReasoner: - def __init__(self, ontology: SyncOntology, reasoner="HermiT"): + def __init__(self, ontology: Union[SyncOntology, str], reasoner="HermiT"): """ OWL reasoner that syncs to other reasoners like HermiT,Pellet,etc. @@ -1624,12 +1622,17 @@ def __init__(self, ontology: SyncOntology, reasoner="HermiT"): assert reasoner in ["HermiT", "Pellet", "JFact", "Openllet"], \ (f"'{reasoner}' is not implemented. Available reasoners: ['HermiT', 'Pellet', 'JFact', 'Openllet']. " f"This field is case sensitive.") - self.manager = ontology.manager - self.ontology = ontology + if isinstance(ontology, SyncOntology): + self.manager = ontology.manager + self.ontology = ontology + elif isinstance(ontology, str): + self.manager = SyncOntologyManager() + self.ontology = self.manager.load_ontology(IRI.create(ontology)) + self._owlapi_manager = self.manager.get_owlapi_manager() self._owlapi_ontology = self.ontology.get_owlapi_ontology() # super().__init__(self.ontology) - self.mapper = ontology.mapper + self.mapper = self.ontology.mapper from org.semanticweb.owlapi.util import (InferredClassAssertionAxiomGenerator, InferredSubClassAxiomGenerator, InferredEquivalentClassAxiomGenerator, InferredDisjointClassesAxiomGenerator, From 518ad88801d42b8e6bab968c5acde6d40cc8e655 Mon Sep 17 00:00:00 2001 From: Alkid Date: Tue, 20 Aug 2024 14:36:31 +0200 Subject: [PATCH 07/44] Updated test/examples using SyncReasoner --- examples/comparing_adaptor_reasoners.py | 29 ++++++++++++------------- examples/using_owlapi_adaptor.py | 17 ++++++++------- tests/test_sync_reasoner.py | 12 ++++------ 3 files changed, 27 insertions(+), 31 deletions(-) diff --git a/examples/comparing_adaptor_reasoners.py b/examples/comparing_adaptor_reasoners.py index d0c1c50a..25222601 100644 --- a/examples/comparing_adaptor_reasoners.py +++ b/examples/comparing_adaptor_reasoners.py @@ -1,8 +1,7 @@ from owlapy.owl_property import OWLObjectProperty -from owlapy.owlapi_adaptor import OWLAPIAdaptor +from owlapy.owl_reasoner import SyncReasoner from owlapy.iri import IRI -from owlapy.class_expression import OWLClass, OWLObjectIntersectionOf, OWLObjectAllValuesFrom, OWLObjectComplementOf -from owlapy.providers import owl_datatype_min_exclusive_restriction +from owlapy.class_expression import OWLClass, OWLObjectAllValuesFrom, OWLObjectComplementOf import time ontology_location = "../KGs/Carcinogenesis/carcinogenesis.owl" @@ -11,21 +10,21 @@ i3 = set() i4 = set() -for reasoner in ["HermiT", "Pellet", "JFact", "Openllet"]: - adaptor = OWLAPIAdaptor(ontology_location, reasoner) - - ce = OWLObjectAllValuesFrom(property=OWLObjectProperty(IRI('http://dl-learner.org/carcinogenesis#','hasAtom')), +for rsn in ["HermiT", "Pellet", "JFact", "Openllet"]: + reasoner = SyncReasoner(ontology_location, rsn) + # TODO AB: needs a more complex class expression to show the specific differences of the reasoners + ce = OWLObjectAllValuesFrom(property=OWLObjectProperty(IRI('http://dl-learner.org/carcinogenesis#', 'hasAtom')), filler=OWLObjectComplementOf(OWLClass(IRI('http://dl-learner.org/carcinogenesis#', 'Sulfur-75')))) - if reasoner == "HermiT": - i1 = set(adaptor.instances(ce)) - elif reasoner == "Pellet": - i2 = set(adaptor.instances(ce)) - elif reasoner == "JFact": - i3 = set(adaptor.instances(ce)) - elif reasoner == "Openllet": - i4 = set(adaptor.instances(ce)) + if rsn == "HermiT": + i1 = set(reasoner.instances(ce)) + elif rsn == "Pellet": + i2 = set(reasoner.instances(ce)) + elif rsn == "JFact": + i3 = set(reasoner.instances(ce)) + elif rsn == "Openllet": + i4 = set(reasoner.instances(ce)) print("Hermit-Pellet:") [print(_) for _ in i1-i2] diff --git a/examples/using_owlapi_adaptor.py b/examples/using_owlapi_adaptor.py index 44d82039..88a6b405 100644 --- a/examples/using_owlapi_adaptor.py +++ b/examples/using_owlapi_adaptor.py @@ -1,13 +1,14 @@ -from owlapy.owlapi_adaptor import OWLAPIAdaptor +from owlapy.owl_reasoner import SyncReasoner from owlapy.iri import IRI from owlapy.class_expression import OWLClass, OWLObjectIntersectionOf +from owlapy.static_funcs import stopJVM ontology_location = "../KGs/Family/family-benchmark_rich_background.owl" -# Start an adaptor session and perform your operations. -adaptor = OWLAPIAdaptor(ontology_location, "HermiT") +# Create an SyncReasoner +reasoner = SyncReasoner(ontology_location, "HermiT") # Check ontology consistency -print(f"Is the given ontology consistent? --> {adaptor.has_consistent_ontology()}") +print(f"Is the given ontology consistent? --> {reasoner.has_consistent_ontology()}") # Construct an owlapy class expression brother = OWLClass(IRI.create("http://www.benchmark.org/family#Brother")) @@ -15,19 +16,19 @@ brother_and_father = OWLObjectIntersectionOf([brother, father]) # Find individual belonging to that class expression -instances = adaptor.instances(brother_and_father) +instances = reasoner.instances(brother_and_father) print("----------------------") print("Individuals that are brother and father at the same time:") [print(_) for _ in instances] # Map the class expression from owlapy to owlapi -py_to_pi = adaptor.mapper.map_(brother_and_father) +py_to_pi = reasoner.mapper.map_(brother_and_father) # Map the class expression from owlapi to owlapy -pi_to_py = adaptor.mapper.map_(py_to_pi) +pi_to_py = reasoner.mapper.map_(py_to_pi) print("----------------------") print(f"Owlapy ce: {pi_to_py}") # Stop the JVM to free the associated resources. -adaptor.stopJVM() # or jpype.shutdownJVM() +stopJVM() # or jpype.shutdownJVM() diff --git a/tests/test_sync_reasoner.py b/tests/test_sync_reasoner.py index 6a07c2be..3666f6cc 100644 --- a/tests/test_sync_reasoner.py +++ b/tests/test_sync_reasoner.py @@ -7,7 +7,7 @@ from owlapy.iri import IRI from owlapy.owl_axiom import OWLDisjointClassesAxiom, OWLDeclarationAxiom, OWLClassAssertionAxiom from owlapy.owl_individual import OWLNamedIndividual -from owlapy.owl_ontology_manager import OntologyManager, SyncOntologyManager +from owlapy.owl_ontology_manager import OntologyManager from owlapy.owl_property import OWLDataProperty from owlapy.owl_reasoner import SyncReasoner from owlapy.providers import owl_datatype_min_inclusive_restriction @@ -20,9 +20,7 @@ class TestSyncReasoner(unittest.TestCase): charge = OWLDataProperty(IRI.create(ns, "charge")) has_charge_more_than_0_85 = OWLDataSomeValuesFrom(charge, owl_datatype_min_inclusive_restriction(0.85)) ce = OWLObjectIntersectionOf([nitrogen38, has_charge_more_than_0_85]) - manager = SyncOntologyManager() - onto = manager.load_ontology(IRI.create(ontology_path)) - reasoner = SyncReasoner(onto) + reasoner = SyncReasoner(ontology_path) def test_consistency_check(self): self.assertEqual(self.reasoner.has_consistent_ontology(), True) @@ -40,9 +38,7 @@ def test_inconsistency_check(self): manager.add_axiom(onto, OWLClassAssertionAxiom(new_individual, carbon230)) manager.save_ontology(onto, IRI.create("file:/test.owl")) - som = SyncOntologyManager() - onto2 = som.load_ontology(IRI.create("test.owl")) - reasoner = SyncReasoner(onto2) + reasoner = SyncReasoner("test.owl") self.assertEqual(reasoner.has_consistent_ontology(), False) os.remove("test.owl") @@ -79,7 +75,7 @@ def test_conversion(self): class_expression = data_factory.getOWLObjectIntersectionOf(nitrogen_class, some_values_from) - # compare them with the adaptor converted expression + # compare them with the converted expression ce_converted = self.reasoner.mapper.map_(self.ce) print(ce_converted) print(class_expression) From b0bf90c0bb60b8ff33901be5c4557b055c8c940c Mon Sep 17 00:00:00 2001 From: Alkid Date: Tue, 20 Aug 2024 14:53:48 +0200 Subject: [PATCH 08/44] Ontology can be loaded using path as string also --- owlapy/owl_ontology.py | 11 +++++++---- owlapy/owl_ontology_manager.py | 6 +++--- owlapy/owl_reasoner.py | 2 +- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/owlapy/owl_ontology.py b/owlapy/owl_ontology.py index 2bbcae13..5fa351b7 100644 --- a/owlapy/owl_ontology.py +++ b/owlapy/owl_ontology.py @@ -390,16 +390,19 @@ def __repr__(self): class SyncOntology(OWLOntology): - def __init__(self, manager: _SM, iri: IRI, new: bool = False): + def __init__(self, manager: _SM, path: Union[IRI, str], new: bool = False): from owlapy.owlapi_mapper import OWLAPIMapper from java.io import File from java.util.stream import Stream self.manager = manager - self._iri = iri + if isinstance(path, IRI): + file_path = path.str + else: + file_path = path if new: # create new ontology - self.owlapi_ontology = manager.createOntology(Stream.empty(), File(iri.str)) + self.owlapi_ontology = manager.createOntology(Stream.empty(), File(file_path)) else: # means we are loading an existing ontology - self.owlapi_ontology = manager.get_owlapi_manager().loadOntologyFromOntologyDocument(File(iri.str)) + self.owlapi_ontology = manager.get_owlapi_manager().loadOntologyFromOntologyDocument(File(file_path)) self.mapper = OWLAPIMapper(self) def classes_in_signature(self) -> Iterable[OWLClass]: diff --git a/owlapy/owl_ontology_manager.py b/owlapy/owl_ontology_manager.py index 2fcc099e..f67c0042 100644 --- a/owlapy/owl_ontology_manager.py +++ b/owlapy/owl_ontology_manager.py @@ -2,7 +2,7 @@ from functools import singledispatch from itertools import islice, combinations import types -from typing import cast +from typing import cast, Union import jpype import owlready2 @@ -901,8 +901,8 @@ def __init__(self): def create_ontology(self, iri: IRI) -> SyncOntology: return SyncOntology(self, iri, new=True) - def load_ontology(self, iri: IRI) -> SyncOntology: - return SyncOntology(self, iri, new=False) + def load_ontology(self, path: Union[IRI,str]) -> SyncOntology: + return SyncOntology(self, path, new=False) def get_owlapi_manager(self): return self.owlapi_manager diff --git a/owlapy/owl_reasoner.py b/owlapy/owl_reasoner.py index 0074e939..ee6eba58 100644 --- a/owlapy/owl_reasoner.py +++ b/owlapy/owl_reasoner.py @@ -1627,7 +1627,7 @@ def __init__(self, ontology: Union[SyncOntology, str], reasoner="HermiT"): self.ontology = ontology elif isinstance(ontology, str): self.manager = SyncOntologyManager() - self.ontology = self.manager.load_ontology(IRI.create(ontology)) + self.ontology = self.manager.load_ontology(ontology) self._owlapi_manager = self.manager.get_owlapi_manager() self._owlapi_ontology = self.ontology.get_owlapi_ontology() From f83f1303d29b3c523818f8f06498dcf23dc21308 Mon Sep 17 00:00:00 2001 From: Alkid Date: Wed, 21 Aug 2024 14:35:38 +0200 Subject: [PATCH 09/44] Added mapping for 'OntologyID' and 'Optional' --- owlapy/owlapi_mapper.py | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/owlapy/owlapi_mapper.py b/owlapy/owlapi_mapper.py index 8f93f351..229698a1 100644 --- a/owlapy/owlapi_mapper.py +++ b/owlapy/owlapi_mapper.py @@ -21,19 +21,20 @@ from owlapy.owl_datatype import OWLDatatype from owlapy.owl_individual import OWLNamedIndividual from owlapy.owl_literal import OWLLiteral +from owlapy.owl_ontology import OWLOntologyID from owlapy.owl_property import OWLObjectProperty, OWLDataProperty from owlapy.static_funcs import startJVM from owlapy.vocab import OWLFacet if not jpype.isJVMStarted(): startJVM() -from org.semanticweb.owlapi.model import IRI as owlapi_IRI +from org.semanticweb.owlapi.model import IRI as owlapi_IRI, OWLOntologyID as owlapi_OWLOntologyID from org.semanticweb.owlapi.vocab import OWLFacet as owlapi_OWLFacet from org.semanticweb.owlapi.manchestersyntax.parser import ManchesterOWLSyntaxClassExpressionParser from org.semanticweb.owlapi.manchestersyntax.renderer import ManchesterOWLSyntaxOWLObjectRendererImpl from org.semanticweb.owlapi.util import BidirectionalShortFormProviderAdapter, SimpleShortFormProvider from org.semanticweb.owlapi.expression import ShortFormEntityChecker -from java.util import HashSet, ArrayList, List, Set +from java.util import HashSet, ArrayList, List, Set, LinkedHashSet, Optional from java.util.stream import Stream from uk.ac.manchester.cs.owl.owlapi import (OWLAnonymousClassExpressionImpl, OWLCardinalityRestrictionImpl, OWLClassExpressionImpl, OWLClassImpl, OWLDataAllValuesFromImpl, @@ -463,8 +464,32 @@ def _(self, e): return OWLInverseObjectPropertiesAxiom(self.map_(e.getFirstProperty()), self.map_(e.getSecondProperty()), self.map_(e.annotationsAsList())) + @map_.register(OWLOntologyID) + def _(self, e): + if e.get_ontology_iri(): + i1 = self.map_(e.get_ontology_iri()) + else: + i1 = None + if e.get_version_iri(): + i2 = self.map_(e.get_version_iri()) + else: + i2 = None + return owlapi_OWLOntologyID(i1, i2) + + @map_.register(owlapi_OWLOntologyID) + def _(self, e): + return OWLOntologyID(self.map_(e.getOntologyIRI()), self.map_(e.getVersionIRI())) + + @map_.register(Optional) + def _(self, e): + if bool(e.isPresent()): + return self.map_(e.get()) + else: + return None + @map_.register(List) @map_.register(Set) + @map_.register(LinkedHashSet) def _(self, e): python_list = list() casted_list = list(e) From b2d18d858df576b8af82503efce30c116e5d8c9e Mon Sep 17 00:00:00 2001 From: Alkid Date: Wed, 21 Aug 2024 14:36:36 +0200 Subject: [PATCH 10/44] Implemented methods of SyncOntology --- owlapy/owl_ontology.py | 37 ++++++++++++++++++++----------------- 1 file changed, 20 insertions(+), 17 deletions(-) diff --git a/owlapy/owl_ontology.py b/owlapy/owl_ontology.py index 5fa351b7..9b6a99f5 100644 --- a/owlapy/owl_ontology.py +++ b/owlapy/owl_ontology.py @@ -395,6 +395,8 @@ def __init__(self, manager: _SM, path: Union[IRI, str], new: bool = False): from java.io import File from java.util.stream import Stream self.manager = manager + self.path = path + self.new = new if isinstance(path, IRI): file_path = path.str else: @@ -406,54 +408,54 @@ def __init__(self, manager: _SM, path: Union[IRI, str], new: bool = False): self.mapper = OWLAPIMapper(self) def classes_in_signature(self) -> Iterable[OWLClass]: - pass + return self.mapper.map_(self.owlapi_ontology.getClassesInSignature()) def data_properties_in_signature(self) -> Iterable[OWLDataProperty]: - pass + return self.mapper.map_(self.owlapi_ontology.getDataPropertiesInSignature()) def object_properties_in_signature(self) -> Iterable[OWLObjectProperty]: - pass + return self.mapper.map_(self.owlapi_ontology.getObjectPropertiesInSignature()) def individuals_in_signature(self) -> Iterable[OWLNamedIndividual]: - pass + return self.mapper.map_(self.owlapi_ontology.getIndividualsInSignature()) def equivalent_classes_axioms(self, c: OWLClass) -> Iterable[OWLEquivalentClassesAxiom]: - pass + return self.mapper.map_(self.owlapi_ontology.getEquivalentClassesAxioms(self.mapper.map_(c))) def general_class_axioms(self) -> Iterable[OWLClassAxiom]: - pass + return self.mapper.map_(self.owlapi_ontology.getGeneralClassAxioms()) def data_property_domain_axioms(self, property: OWLDataProperty) -> Iterable[OWLDataPropertyDomainAxiom]: - pass + return self.mapper.map_(self.owlapi_ontology.getDataPropertyDomainAxioms(self.mapper.map_(property))) def data_property_range_axioms(self, property: OWLDataProperty) -> Iterable[OWLDataPropertyRangeAxiom]: - pass + return self.mapper.map_(self.owlapi_ontology.getDataPropertyRangeAxioms(self.mapper.map_(property))) def object_property_domain_axioms(self, property: OWLObjectProperty) -> Iterable[OWLObjectPropertyDomainAxiom]: - pass + return self.mapper.map_(self.owlapi_ontology.getObjectPropertyDomainAxioms(self.mapper.map_(property))) def object_property_range_axioms(self, property: OWLObjectProperty) -> Iterable[OWLObjectPropertyRangeAxiom]: - pass + return self.mapper.map_(self.owlapi_ontology.getObjectPropertyRangeAxioms(self.mapper.map_(property))) def get_owl_ontology_manager(self) -> _M: - pass + return self.manager def get_owlapi_ontology(self): return self.owlapi_ontology def get_ontology_id(self) -> OWLOntologyID: - pass + return self.mapper.map_(self.owlapi_ontology.getOntologyID()) def __eq__(self, other): - pass + if isinstance(other, SyncOntology): + return other.owlapi_ontology.getOntologyID().equals(other.owlapi_ontology.getOntologyID()) + return False def __hash__(self): - pass + return int(self.owlapi_ontology.getOntologyID().hashCode()) def __repr__(self): - pass - - + return f'SyncOntology({self.manager}, {self.path}, {self.new})' OWLREADY2_FACET_KEYS = MappingProxyType({ @@ -469,6 +471,7 @@ def __repr__(self): OWLFacet.FRACTION_DIGITS: "fraction_digits" }) + class ToOwlready2: __slots__ = '_world' From 9fe79f9b967e5cac7e41faa5d21a21c4a2207a04 Mon Sep 17 00:00:00 2001 From: Alkid Date: Thu, 22 Aug 2024 15:23:20 +0200 Subject: [PATCH 11/44] fixed new ontology creation --- owlapy/owl_ontology.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/owlapy/owl_ontology.py b/owlapy/owl_ontology.py index 9b6a99f5..e2f9688d 100644 --- a/owlapy/owl_ontology.py +++ b/owlapy/owl_ontology.py @@ -394,6 +394,7 @@ def __init__(self, manager: _SM, path: Union[IRI, str], new: bool = False): from owlapy.owlapi_mapper import OWLAPIMapper from java.io import File from java.util.stream import Stream + from org.semanticweb.owlapi.model import IRI as owlapi_IRI self.manager = manager self.path = path self.new = new @@ -402,7 +403,11 @@ def __init__(self, manager: _SM, path: Union[IRI, str], new: bool = False): else: file_path = path if new: # create new ontology - self.owlapi_ontology = manager.createOntology(Stream.empty(), File(file_path)) + if isinstance(path, IRI): + self.owlapi_ontology = manager.get_owlapi_manager().createOntology(Stream.empty(), + owlapi_IRI.create(path.str)) + else: + raise NotImplementedError("Cant initialize a new ontology using path. Use IRI instead") else: # means we are loading an existing ontology self.owlapi_ontology = manager.get_owlapi_manager().loadOntologyFromOntologyDocument(File(file_path)) self.mapper = OWLAPIMapper(self) From 8dbf219199a0d52505ff347f90e4fc456afd16b5 Mon Sep 17 00:00:00 2001 From: Alkid Date: Thu, 22 Aug 2024 15:24:30 +0200 Subject: [PATCH 12/44] added test for sync ontology --- tests/test_sync_ontology.py | 112 ++++++++++++++++++++++++++++++++++++ 1 file changed, 112 insertions(+) create mode 100644 tests/test_sync_ontology.py diff --git a/tests/test_sync_ontology.py b/tests/test_sync_ontology.py new file mode 100644 index 00000000..297f0127 --- /dev/null +++ b/tests/test_sync_ontology.py @@ -0,0 +1,112 @@ +import unittest + +from owlapy.class_expression import OWLClass, OWLObjectIntersectionOf, OWLObjectSomeValuesFrom +from owlapy.iri import IRI +from owlapy.owl_axiom import OWLEquivalentClassesAxiom +from owlapy.owl_individual import OWLNamedIndividual +from owlapy.owl_ontology import OWLOntologyID +from owlapy.owl_ontology_manager import SyncOntologyManager +from owlapy.owl_property import OWLDataProperty, OWLObjectProperty + +NS = "http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#" + +# ==== Individuals ==== +a = OWLNamedIndividual(IRI(NS, "a")) +b = OWLNamedIndividual(IRI(NS, "b")) +c = OWLNamedIndividual(IRI(NS, "c")) +d = OWLNamedIndividual(IRI(NS, "d")) +e = OWLNamedIndividual(IRI(NS, "e")) +f = OWLNamedIndividual(IRI(NS, "f")) +g = OWLNamedIndividual(IRI(NS, "g")) +h = OWLNamedIndividual(IRI(NS, "h")) +m = OWLNamedIndividual(IRI(NS, "m")) +l = OWLNamedIndividual(IRI(NS, "l")) +n = OWLNamedIndividual(IRI(NS, "n")) +o = OWLNamedIndividual(IRI(NS, "o")) +p = OWLNamedIndividual(IRI(NS, "p")) +q = OWLNamedIndividual(IRI(NS, "q")) +r = OWLNamedIndividual(IRI(NS, "r")) +s = OWLNamedIndividual(IRI(NS, "s")) +ind1 = OWLNamedIndividual(IRI(NS, "ind1")) + +# ==== Object Properties ==== +r1 = OWLObjectProperty(IRI(NS, "r1")) +r2 = OWLObjectProperty(IRI(NS, "r2")) +r3 = OWLObjectProperty(IRI(NS, "r3")) +r4 = OWLObjectProperty(IRI(NS, "r4")) +r5 = OWLObjectProperty(IRI(NS, "r5")) +r6 = OWLObjectProperty(IRI(NS, "r6")) +r7 = OWLObjectProperty(IRI(NS, "r7")) + +# ==== Data Properties ==== + +dp1 = OWLDataProperty(IRI(NS, "dp1")) +dp2 = OWLDataProperty(IRI(NS, "dp2")) +dp3 = OWLDataProperty(IRI(NS, "dp3")) + +# ==== Classes ==== + +A = OWLClass(IRI(NS, 'A')) +B = OWLClass(IRI(NS, 'B')) +C = OWLClass(IRI(NS, 'C')) +AB = OWLClass(IRI(NS, 'AB')) +D = OWLClass(IRI(NS, 'D')) +E = OWLClass(IRI(NS, 'E')) +F = OWLClass(IRI(NS, 'F')) +G = OWLClass(IRI(NS, 'G')) +J = OWLClass(IRI(NS, 'J')) +K = OWLClass(IRI(NS, 'K')) +H = OWLClass(IRI(NS, 'H')) +I = OWLClass(IRI(NS, 'I')) +L = OWLClass(IRI(NS, 'L')) +M = OWLClass(IRI(NS, 'M')) +N = OWLClass(IRI(NS, 'N')) +O = OWLClass(IRI(NS, 'O')) +P = OWLClass(IRI(NS, 'P')) +Q = OWLClass(IRI(NS, 'Q')) +R = OWLClass(IRI(NS, 'R')) +S = OWLClass(IRI(NS, 'S')) +T = OWLClass(IRI(NS, 'T')) +U = OWLClass(IRI(NS, 'U')) + + +class TestSyncReasoner(unittest.TestCase): + + ontology_path = "KGs/Test/test_ontology.owl" + manager = SyncOntologyManager() + onto = manager.load_ontology(ontology_path) + + # NOTE AB: The name of "assertCountEqual" may be misleading,but it's essentially an order-insensitive "assertEqual". + + def test_classes_in_signature(self): + self.assertCountEqual(list(self.onto.classes_in_signature()), [A, AB, B, C, D, E, F, G, H, I, J, K, L, M, N, O, + P, Q, R, S, T, U]) + + def test_data_properties_in_signature(self): + self.assertCountEqual(list(self.onto.data_properties_in_signature()), [dp1, dp2, dp3]) + + def test_object_properties_in_signature(self): + self.assertCountEqual(list(self.onto.object_properties_in_signature()), [r1, r2, r3, r4, r5, r6, r7]) + + def test_individuals_in_signature(self): + self.assertCountEqual(list(self.onto.individuals_in_signature()), [a, b, c, d, e, f, g, h, m, l, n, o, p, q, r, + s, ind1]) + + def test_equivalent_classes_axiom(self): + eq1 = OWLEquivalentClassesAxiom([N, Q]) + eq2 = OWLEquivalentClassesAxiom([F, OWLObjectSomeValuesFrom(property=r2, filler=G)]) + eq3 = OWLEquivalentClassesAxiom([AB, OWLObjectIntersectionOf((A, B))]) + aeq = set() + for cls in self.onto.classes_in_signature(): + ea = set(self.onto.equivalent_classes_axioms(cls)) + aeq.update(ea) + self.assertCountEqual(aeq, {eq1, eq2, eq3}) + + def test_get_ontology_id(self): + onto_id = OWLOntologyID(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/', 'untitled-ontology-11'), + None) + self.assertEqual(self.onto.get_ontology_id(), onto_id) + + def test__eq__(self): + onto2 = self.manager.load_ontology(self.ontology_path) + self.assertTrue(self.onto.__eq__(onto2)) From 790f68dc989f02bc97ff6b55e4b11c5651dceca4 Mon Sep 17 00:00:00 2001 From: Alkid Date: Mon, 26 Aug 2024 13:03:54 +0200 Subject: [PATCH 13/44] add ruff workflow --- .github/workflows/ruff.yml | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 .github/workflows/ruff.yml diff --git a/.github/workflows/ruff.yml b/.github/workflows/ruff.yml new file mode 100644 index 00000000..b6690e05 --- /dev/null +++ b/.github/workflows/ruff.yml @@ -0,0 +1,8 @@ +name: Ruff +on: [push, pull_request] +jobs: + ruff: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: chartboost/ruff-action@v1 \ No newline at end of file From 417a1144655fc1531dbcb75ffe3dfc870ec1e1ce Mon Sep 17 00:00:00 2001 From: Alkid Date: Mon, 26 Aug 2024 14:15:09 +0200 Subject: [PATCH 14/44] Updates based on ruff's linting report --- examples/ontology_modification.py | 4 +- examples/ontology_reasoning.py | 12 +- owlapy/__init__.py | 8 +- owlapy/class_expression/__init__.py | 12 ++ .../nary_boolean_expression.py | 2 +- owlapy/class_expression/restriction.py | 10 +- owlapy/converter.py | 8 +- owlapy/meta_classes.py | 2 +- owlapy/owl_annotation.py | 6 +- owlapy/owl_axiom.py | 8 +- owlapy/owl_data_ranges.py | 2 +- owlapy/owl_object.py | 4 +- owlapy/owl_ontology.py | 27 ++-- owlapy/owlapi_mapper.py | 6 +- owlapy/providers.py | 4 +- owlapy/render.py | 5 +- tests/test_owlapy_fastinstancechecker.py | 137 ++++++++---------- tests/test_owlapy_owl2sparql_converter.py | 27 ++-- tests/test_sync_ontology.py | 6 +- tests/test_sync_reasoner.py | 2 +- 20 files changed, 146 insertions(+), 146 deletions(-) diff --git a/examples/ontology_modification.py b/examples/ontology_modification.py index 87d6e1ce..9b6ebbe8 100644 --- a/examples/ontology_modification.py +++ b/examples/ontology_modification.py @@ -1,5 +1,5 @@ from owlapy.class_expression import OWLClass -from owlapy.owl_axiom import OWLDeclarationAxiom, OWLClassAxiom, OWLClassAssertionAxiom +from owlapy.owl_axiom import OWLDeclarationAxiom, OWLClassAssertionAxiom from owlapy.owl_individual import OWLNamedIndividual from owlapy.owl_ontology_manager import OntologyManager from owlapy.iri import IRI @@ -10,7 +10,7 @@ # Load the 'father' ontology using a new ontology manager. manager = OntologyManager() -onto = manager.load_ontology(IRI.create(f'file://../KGs/Family/father.owl')) +onto = manager.load_ontology(IRI.create('file://../KGs/Family/father.owl')) # Let's see what classes does this ontology has [print(_) for _ in onto.classes_in_signature()] diff --git a/examples/ontology_reasoning.py b/examples/ontology_reasoning.py index c48f655b..0f3e09bc 100644 --- a/examples/ontology_reasoning.py +++ b/examples/ontology_reasoning.py @@ -4,7 +4,7 @@ from owlapy.owl_individual import OWLNamedIndividual from owlapy.owl_ontology_manager import OntologyManager from owlapy.owl_property import OWLDataProperty, OWLObjectProperty -from owlapy.owl_reasoner import OntologyReasoner +from owlapy.owl_reasoner import OntologyReasoner, FastInstanceCheckerReasoner data_file = '../KGs/Test/test_ontology.owl' NS = 'http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#' @@ -61,7 +61,7 @@ e = OWLNamedIndividual(IRI(NS, "e")) g = OWLNamedIndividual(IRI(NS, "g")) m = OWLNamedIndividual(IRI(NS, "m")) -l = OWLNamedIndividual(IRI(NS, "l")) +l = OWLNamedIndividual(IRI(NS, "l")) # noqa: E741 n = OWLNamedIndividual(IRI(NS, "n")) o = OWLNamedIndividual(IRI(NS, "o")) p = OWLNamedIndividual(IRI(NS, "p")) @@ -93,11 +93,11 @@ J = OWLClass(IRI(NS, 'J')) K = OWLClass(IRI(NS, 'K')) H = OWLClass(IRI(NS, 'H')) -I = OWLClass(IRI(NS, 'I')) +I = OWLClass(IRI(NS, 'I')) # noqa: E741 L = OWLClass(IRI(NS, 'L')) M = OWLClass(IRI(NS, 'M')) N = OWLClass(IRI(NS, 'N')) -O = OWLClass(IRI(NS, 'O')) +O = OWLClass(IRI(NS, 'O')) # noqa: E741 P = OWLClass(IRI(NS, 'P')) Q = OWLClass(IRI(NS, 'Q')) R = OWLClass(IRI(NS, 'R')) @@ -117,7 +117,7 @@ r1T = OWLObjectSomeValuesFrom(property=r1, filler=OWLClass(IRI('http://www.w3.org/2002/07/owl#', 'Thing'))) manager = OntologyManager() -onto = manager.load_ontology(IRI.create(f'file://' + data_file)) +onto = manager.load_ontology(IRI.create('file://' + data_file)) manager.add_axiom(onto, OWLEquivalentObjectPropertiesAxiom([r6, r5])) manager.add_axiom(onto, OWLEquivalentObjectPropertiesAxiom([r5, r6])) @@ -130,7 +130,7 @@ # ---------------------------------------- Reasoning ---------------------------------------- -reasoner = FastInstanceCheckerReasoner(onto) +reasoner = FastInstanceCheckerReasoner(onto, base_reasoner) # Instances t1 = list(reasoner.instances(N)) diff --git a/owlapy/__init__.py b/owlapy/__init__.py index a832483c..c5fed689 100644 --- a/owlapy/__init__.py +++ b/owlapy/__init__.py @@ -1,4 +1,6 @@ -from .render import owl_expression_to_dl, owl_expression_to_manchester -from .parser import dl_to_owl_expression, manchester_to_owl_expression -from .converter import owl_expression_to_sparql +from .render import (owl_expression_to_dl as owl_expression_to_dl, + owl_expression_to_manchester as owl_expression_to_manchester) +from .parser import (dl_to_owl_expression as dl_to_owl_expression, + manchester_to_owl_expression as manchester_to_owl_expression) +from .converter import owl_expression_to_sparql as owl_expression_to_sparql __version__ = '1.2.0' diff --git a/owlapy/class_expression/__init__.py b/owlapy/class_expression/__init__.py index f4e8d56c..8b987e71 100644 --- a/owlapy/class_expression/__init__.py +++ b/owlapy/class_expression/__init__.py @@ -34,8 +34,20 @@ OWLDataExactCardinality, OWLObjectOneOf ) + +__all__ = ['OWLClassExpression', 'OWLAnonymousClassExpression', 'OWLBooleanClassExpression', 'OWLObjectComplementOf', + 'OWLNaryBooleanClassExpression', 'OWLObjectUnionOf', 'OWLObjectIntersectionOf', 'OWLRestriction', + 'OWLQuantifiedRestriction', 'OWLObjectCardinalityRestriction', 'OWLObjectHasSelf', 'OWLObjectHasValue', + 'OWLQuantifiedDataRestriction', 'OWLObjectSomeValuesFrom', 'OWLObjectAllValuesFrom', + 'OWLDatatypeRestriction', 'OWLFacet', 'OWLQuantifiedObjectRestriction', 'OWLObjectRestriction', + 'OWLHasValueRestriction', 'OWLDataRestriction', 'OWLCardinalityRestriction', 'OWLFacetRestriction', + 'OWLObjectMinCardinality', 'OWLObjectMaxCardinality', 'OWLObjectExactCardinality', 'OWLDataSomeValuesFrom', + 'OWLDataAllValuesFrom', 'OWLDataHasValue', 'OWLClass', 'OWLDataMinCardinality', 'OWLDataMaxCardinality', + 'OWLDataExactCardinality', 'OWLObjectOneOf'] + from typing import Final from ..vocab import OWLRDFVocabulary OWLThing: Final = OWLClass(OWLRDFVocabulary.OWL_THING.iri) #: : :The OWL Class corresponding to owl:Thing OWLNothing: Final = OWLClass(OWLRDFVocabulary.OWL_NOTHING.iri) #: : :The OWL Class corresponding to owl:Nothing + diff --git a/owlapy/class_expression/nary_boolean_expression.py b/owlapy/class_expression/nary_boolean_expression.py index 1a417341..0cd2a683 100644 --- a/owlapy/class_expression/nary_boolean_expression.py +++ b/owlapy/class_expression/nary_boolean_expression.py @@ -25,7 +25,7 @@ def __repr__(self): return f'{type(self).__name__}({repr(self._operands)})' def __eq__(self, other): - if type(other) == type(self): + if type(other) is type(self): return self._operands == other._operands return NotImplemented diff --git a/owlapy/class_expression/restriction.py b/owlapy/class_expression/restriction.py index 04e7a4bc..2ccc7248 100644 --- a/owlapy/class_expression/restriction.py +++ b/owlapy/class_expression/restriction.py @@ -163,7 +163,7 @@ def __repr__(self): f"property={repr(self.get_property())},{self.get_cardinality()},filler={repr(self.get_filler())})" def __eq__(self, other): - if type(other) == type(self): + if type(other) is type(self): return self._property == other._property \ and self._cardinality == other._cardinality \ and self._filler == other._filler @@ -335,7 +335,7 @@ def get_property(self) -> OWLObjectPropertyExpression: return self._property def __eq__(self, other): - if type(other) == type(self): + if type(other) is type(self): return self._property == other._property return NotImplemented @@ -429,7 +429,7 @@ def __hash__(self): return hash(self._values) def __eq__(self, other): - if type(other) == type(self): + if type(other) is type(self): return self._values == other._values return NotImplemented @@ -492,7 +492,7 @@ def __repr__(self): f"property={repr(self.get_property())},{self.get_cardinality()},filler={repr(self.get_filler())})" def __eq__(self, other): - if type(other) == type(self): + if type(other) is type(self): return self._property == other._property \ and self._cardinality == other._cardinality \ and self._filler == other._filler @@ -746,7 +746,7 @@ def __hash__(self): return hash(self._values) def __eq__(self, other): - if type(other) == type(self): + if type(other) is type(self): return self._values == other._values return NotImplemented diff --git a/owlapy/converter.py b/owlapy/converter.py index fb7ee3f4..75979c99 100644 --- a/owlapy/converter.py +++ b/owlapy/converter.py @@ -508,7 +508,7 @@ def _(self, ce: OWLObjectOneOf): self.append(",") assert isinstance(ind, OWLNamedIndividual) self.append(f"<{ind.to_string_id()}>") - self.append(f" ) )") + self.append(" ) )") @process.register def _(self, ce: OWLDataSomeValuesFrom): @@ -573,7 +573,7 @@ def _(self, node: OWLDataOneOf): self.append(",") if value: self.append(self.render(value)) - self.append(f" ) ) ") + self.append(" ) ) ") @process.register def _(self, node: OWLDatatypeRestriction): @@ -624,10 +624,10 @@ def as_query(self, q = [f"VALUES {root_variable} {{ "] for x in values: q.append(f"<{x.to_string_id()}>") - q.append(f"}} . ") + q.append("}} . ") qs.extend(q) qs.extend(tp) - qs.append(f" }}") + qs.append(" }}") query = "\n".join(qs) diff --git a/owlapy/meta_classes.py b/owlapy/meta_classes.py index b4874863..6186a4c8 100644 --- a/owlapy/meta_classes.py +++ b/owlapy/meta_classes.py @@ -13,7 +13,7 @@ class HasIRI(metaclass=ABCMeta): @property @abstractmethod - def iri(self) -> 'IRI': + def iri(self): """Gets the IRI of this object. Returns: diff --git a/owlapy/owl_annotation.py b/owlapy/owl_annotation.py index 7c9ea565..a479b81a 100644 --- a/owlapy/owl_annotation.py +++ b/owlapy/owl_annotation.py @@ -9,10 +9,10 @@ class OWLAnnotationObject(OWLObject, metaclass=ABCMeta): __slots__ = () # noinspection PyMethodMayBeStatic - def as_iri(self) -> Optional['IRI']: + def as_iri(self): """ Returns: - if the value is an IRI, return it. Return Mone otherwise. + if the value is an IRI, return it. Return None otherwise. """ return None @@ -43,7 +43,7 @@ def is_literal(self) -> bool: return False # noinspection PyMethodMayBeStatic - def as_literal(self) -> Optional['OWLLiteral']: + def as_literal(self): """ Returns: if the value is a literal, returns it. Return None otherwise diff --git a/owlapy/owl_axiom.py b/owlapy/owl_axiom.py index 2792738c..b1c46c2f 100644 --- a/owlapy/owl_axiom.py +++ b/owlapy/owl_axiom.py @@ -2,7 +2,7 @@ from abc import ABCMeta, abstractmethod from itertools import combinations -from typing import TypeVar, List, Optional, Iterable, Generic, Final, Union +from typing import TypeVar, List, Optional, Iterable, Generic, Union from .owl_property import OWLDataPropertyExpression, OWLObjectPropertyExpression from .owl_object import OWLObject, OWLEntity from .owl_datatype import OWLDatatype, OWLDataRange @@ -14,9 +14,9 @@ from owlapy.owl_annotation import OWLAnnotationSubject, OWLAnnotationValue from .owl_literal import OWLLiteral -_C = TypeVar('_C', bound='OWLObject') #: -_P = TypeVar('_P', bound='OWLPropertyExpression') #: -_R = TypeVar('_R', bound='OWLPropertyRange') #: +_C = TypeVar('_C', bound='OWLObject') # noqa: F821 +_P = TypeVar('_P', bound='OWLPropertyExpression') # noqa: F821 +_R = TypeVar('_R', bound='OWLPropertyRange') # noqa: F821 class OWLAxiom(OWLObject, metaclass=ABCMeta): diff --git a/owlapy/owl_data_ranges.py b/owlapy/owl_data_ranges.py index 3ad248f5..bcead840 100644 --- a/owlapy/owl_data_ranges.py +++ b/owlapy/owl_data_ranges.py @@ -41,7 +41,7 @@ def __repr__(self): return f'{type(self).__name__}({repr(self._operands)})' def __eq__(self, other): - if type(other) == type(self): + if type(other) is type(self): return self._operands == other._operands return NotImplemented diff --git a/owlapy/owl_object.py b/owlapy/owl_object.py index c2ccbc80..b90e9888 100644 --- a/owlapy/owl_object.py +++ b/owlapy/owl_object.py @@ -1,7 +1,9 @@ """OWL Base classes""" from abc import abstractmethod, ABCMeta from .meta_classes import HasIRI +from typing import TypeVar +_I = TypeVar('_I', bound='IRI') # noqa: F821 class OWLObject(metaclass=ABCMeta): """Base interface for OWL objects""" @@ -68,7 +70,7 @@ class OWLNamedObject(OWLObject, HasIRI, metaclass=ABCMeta): IRI as its name.""" __slots__ = () - _iri: 'IRI' + _iri: _I def __eq__(self, other): if type(other) is type(self): diff --git a/owlapy/owl_ontology.py b/owlapy/owl_ontology.py index e2f9688d..bf003c67 100644 --- a/owlapy/owl_ontology.py +++ b/owlapy/owl_ontology.py @@ -45,8 +45,9 @@ _VERSION_IRI: Final = IRI.create(namespaces.OWL, "versionIRI") -_M = TypeVar('_M', bound='OWLOntologyManager') -_SM = TypeVar('_SM', bound='SyncOntologyManager') +_M = TypeVar('_M', bound='OWLOntologyManager') # noqa: F821 +_OM = TypeVar('_OM', bound='OntologyManager') # noqa: F821 +_SM = TypeVar('_SM', bound='SyncOntologyManager') # noqa: F821 class OWLOntologyID: @@ -253,11 +254,11 @@ def is_anonymous(self) -> bool: class Ontology(OWLOntology): __slots__ = '_manager', '_iri', '_world', '_onto' - _manager: 'OntologyManager' + _manager: _OM _onto: owlready2.Ontology _world: owlready2.World - def __init__(self, manager: 'OntologyManager', ontology_iri: IRI, load: bool): + def __init__(self, manager: _OM, ontology_iri: IRI, load: bool): """Represents an Ontology in Ontolearn. Args: @@ -301,7 +302,7 @@ def general_class_axioms(self) -> Iterable[OWLClassAxiom]: yield from (OWLSubClassOfAxiom(_parse_concept_to_owlapy(ca.left_side), _parse_concept_to_owlapy(c)) for c in ca.is_a) - def get_owl_ontology_manager(self) -> 'OntologyManager': + def get_owl_ontology_manager(self) -> _OM: return self._manager def get_ontology_id(self) -> OWLOntologyID: @@ -377,7 +378,7 @@ def get_original_iri(self): return self._iri def __eq__(self, other): - if type(other) == type(self): + if type(other) is type(self): return self._onto.loaded == other._onto.loaded and self._onto.base_iri == other._onto.base_iri return NotImplemented @@ -809,19 +810,19 @@ def _(self, p: owlready2.ConstrainedDatatype) -> OWLDatatypeRestriction: @map_datarange.register def _(self, type_: type) -> OWLDatatype: - if type_ == bool: + if type_ is bool: return BooleanOWLDatatype - elif type_ == float: + elif type_ is float: return DoubleOWLDatatype - elif type_ == int: + elif type_ is int: return IntegerOWLDatatype - elif type_ == str: + elif type_ is str: return StringOWLDatatype - elif type_ == date: + elif type_ is date: return DateOWLDatatype - elif type_ == datetime: + elif type_ is datetime: return DateTimeOWLDatatype - elif type_ == Timedelta: + elif type_ is Timedelta: return DurationOWLDatatype else: raise ValueError(type_) diff --git a/owlapy/owlapi_mapper.py b/owlapy/owlapi_mapper.py index 229698a1..efbd9ac8 100644 --- a/owlapy/owlapi_mapper.py +++ b/owlapy/owlapi_mapper.py @@ -71,8 +71,8 @@ OWLIrreflexiveObjectPropertyAxiomImpl, OWLAnnotationAssertionAxiomImpl, OWLNegativeDataPropertyAssertionAxiomImpl, OWLFacetRestrictionImpl, OWLNegativeObjectPropertyAssertionAxiomImpl, OWLDatatypeRestrictionImpl, - OWLSymmetricObjectPropertyAxiomImpl, OWLOntologyManagerImpl, - OWLTransitiveObjectPropertyAxiomImpl, OWLOntologyImpl, + OWLSymmetricObjectPropertyAxiomImpl, + OWLTransitiveObjectPropertyAxiomImpl, OWLAnnotationPropertyDomainAxiomImpl, OWLAnnotationPropertyRangeAxiomImpl, OWLSubAnnotationPropertyOfAxiomImpl @@ -87,7 +87,7 @@ def init(the_class): return globals().get(cls_name + "Impl") -_SO = TypeVar('_SO', bound='SyncOntology') +_SO = TypeVar('_SO', bound='SyncOntology') # noqa: F821 class OWLAPIMapper: diff --git a/owlapy/providers.py b/owlapy/providers.py index d0d99c78..d9390089 100644 --- a/owlapy/providers.py +++ b/owlapy/providers.py @@ -39,7 +39,7 @@ def owl_datatype_min_max_exclusive_restriction(min_: Restriction_Literals, max_ = float(max_) if isinstance(max_, float) and isinstance(min_, int): min_ = float(min_) - assert type(min_) == type(max_) + assert type(min_) is type(max_) r_min = OWLFacetRestriction(OWLFacet.MIN_EXCLUSIVE, min_) r_max = OWLFacetRestriction(OWLFacet.MAX_EXCLUSIVE, max_) @@ -54,7 +54,7 @@ def owl_datatype_min_max_inclusive_restriction(min_: Restriction_Literals, max_ = float(max_) if isinstance(max_, float) and isinstance(min_, int): min_ = float(min_) - assert type(min_) == type(max_) + assert type(min_) is type(max_) r_min = OWLFacetRestriction(OWLFacet.MIN_INCLUSIVE, min_) r_max = OWLFacetRestriction(OWLFacet.MAX_INCLUSIVE, max_) diff --git a/owlapy/render.py b/owlapy/render.py index a8bb5a8e..4658886c 100644 --- a/owlapy/render.py +++ b/owlapy/render.py @@ -7,10 +7,10 @@ from owlapy import namespaces from .iri import IRI -from .owl_individual import OWLNamedIndividual, OWLIndividual +from .owl_individual import OWLNamedIndividual from .owl_literal import OWLLiteral from .owl_object import OWLObjectRenderer, OWLEntity, OWLObject -from .owl_property import OWLObjectInverseOf, OWLPropertyExpression, OWLDataProperty, OWLObjectProperty +from .owl_property import OWLObjectInverseOf, OWLPropertyExpression, OWLDataProperty from .class_expression import OWLClassExpression, OWLBooleanClassExpression, OWLClass, OWLObjectSomeValuesFrom, \ OWLObjectAllValuesFrom, OWLObjectUnionOf, OWLObjectIntersectionOf, OWLObjectComplementOf, OWLObjectMinCardinality, \ OWLObjectExactCardinality, OWLObjectMaxCardinality, OWLObjectHasSelf, OWLDataSomeValuesFrom, OWLDataAllValuesFrom, \ @@ -21,7 +21,6 @@ from .class_expression import OWLObjectHasValue, OWLFacetRestriction, OWLDatatypeRestriction, OWLObjectOneOf from .owl_datatype import OWLDatatype from .owl_reasoner import OWLReasoner -from typing import Union, Tuple import requests import warnings import abc diff --git a/tests/test_owlapy_fastinstancechecker.py b/tests/test_owlapy_fastinstancechecker.py index 48fd6647..ac17314b 100644 --- a/tests/test_owlapy_fastinstancechecker.py +++ b/tests/test_owlapy_fastinstancechecker.py @@ -9,17 +9,15 @@ from owlapy.owl_axiom import OWLSubDataPropertyOfAxiom, OWLInverseObjectPropertiesAxiom, OWLSubObjectPropertyOfAxiom from owlapy.owl_data_ranges import OWLDataComplementOf, OWLDataIntersectionOf, OWLDataUnionOf from owlapy.owl_individual import OWLNamedIndividual -from owlapy.owl_literal import DoubleOWLDatatype, OWLLiteral, DurationOWLDatatype +from owlapy.owl_literal import DoubleOWLDatatype, OWLLiteral from owlapy.owl_ontology_manager import OntologyManager from owlapy.owl_property import OWLObjectInverseOf, OWLObjectProperty, OWLDataProperty from owlready2.prop import DataProperty -from pandas import Timedelta from owlapy.owl_reasoner import FastInstanceCheckerReasoner, OntologyReasoner -from owlapy.providers import owl_datatype_min_exclusive_restriction, \ - owl_datatype_min_max_inclusive_restriction, owl_datatype_min_max_exclusive_restriction, \ - owl_datatype_max_exclusive_restriction, owl_datatype_max_inclusive_restriction +from owlapy.providers import owl_datatype_min_max_inclusive_restriction, owl_datatype_min_max_exclusive_restriction, \ + owl_datatype_max_inclusive_restriction class Owlapy_FastInstanceChecker_Test(unittest.TestCase): @@ -241,78 +239,63 @@ def test_data_properties(self): OWLNamedIndividual(IRI(NS, 'd180'))}) self.assertEqual(inst, target_inst) - # def test_data_properties_time(self): - # NS = "http://example.com/father#" - # mgr = OWLOntologyManager_Owlready2() - # onto = mgr.load_ontology(IRI.create("file://KGs/Family/father.owl")) - # - # with onto._onto: - # class birthDate(DataProperty): - # range = [date] - # - # class birthDateTime(DataProperty): - # range = [datetime] - # - # class age(DataProperty): - # range = [Timedelta] - # - # onto._onto.markus.birthDate = [date(year=1990, month=10, day=2)] - # onto._onto.markus.birthDateTime = [datetime(year=1990, month=10, day=2, hour=10, minute=20, second=5)] - # onto._onto.markus.age = [Timedelta(days=11315, hours=10, minutes=2)] - # - # onto._onto.anna.birthDate = [date(year=1995, month=6, day=10)] - # onto._onto.anna.birthDateTime = [datetime(year=1995, month=6, day=10, hour=2, minute=10)] - # onto._onto.anna.age = [Timedelta(days=9490, hours=4)] - # - # onto._onto.heinz.birthDate = [date(year=1986, month=6, day=10)] - # onto._onto.heinz.birthDateTime = [datetime(year=1986, month=6, day=10, hour=10, second=10)] - # onto._onto.heinz.age = [Timedelta(days=12775, hours=14, seconds=40)] - # - # onto._onto.michelle.birthDate = [date(year=2000, month=1, day=4)] - # onto._onto.michelle.birthDateTime = [datetime(year=2000, month=1, day=4, minute=4, second=10)] - # onto._onto.michelle.age = [Timedelta(days=7665, hours=1, milliseconds=11)] - # - # onto._onto.martin.birthDate = [date(year=1999, month=3, day=1)] - # onto._onto.martin.birthDateTime = [datetime(year=1999, month=3, day=2, hour=20, minute=2, second=30)] - # onto._onto.martin.age = [Timedelta(days=8030, minutes=2)] - # - # birth_date = OWLDataProperty(IRI(NS, 'birthDate')) - # birth_date_time = OWLDataProperty(IRI(NS, 'birthDateTime')) - # age_ = OWLDataProperty(IRI(NS, 'age')) - # markus = OWLNamedIndividual(IRI(NS, 'markus')) - # anna = OWLNamedIndividual(IRI(NS, 'anna')) - # heinz = OWLNamedIndividual(IRI(NS, 'heinz')) - # michelle = OWLNamedIndividual(IRI(NS, 'michelle')) - # martin = OWLNamedIndividual(IRI(NS, 'martin')) - # - # base_reasoner = OWLReasoner_Owlready2(onto) - # reasoner = OWLReasoner_FastInstanceChecker(onto, base_reasoner=base_reasoner) - # - # restriction = owl_datatype_min_max_exclusive_restriction(date(year=1995, month=6, day=12), - # date(year=1999, month=3, day=2)) - # inst = frozenset(reasoner.instances(OWLDataSomeValuesFrom(property=birth_date, - # filler=restriction))) - # target_inst = frozenset({martin}) - # self.assertEqual(inst, target_inst) - # - # inst = frozenset(reasoner.instances(OWLDataSomeValuesFrom(property=birth_date, - # filler=OWLDataComplementOf(restriction)))) - # target_inst = frozenset({michelle, anna, heinz, markus}) - # self.assertEqual(inst, target_inst) - # - # restriction = owl_datatype_max_inclusive_restriction(datetime(year=1990, month=10, day=2, hour=10, - # minute=20, second=5)) - # inst = frozenset(reasoner.instances(OWLDataSomeValuesFrom(property=birth_date_time, - # filler=restriction))) - # target_inst = frozenset({markus, heinz}) - # self.assertEqual(inst, target_inst) - # - # restriction_min = owl_datatype_min_exclusive_restriction(Timedelta(days=8030, minutes=1)) - # restriction_max = owl_datatype_max_exclusive_restriction(Timedelta(days=9490, hours=4, nanoseconds=1)) - # filler = OWLDataIntersectionOf([restriction_min, restriction_max, DurationOWLDatatype]) - # inst = frozenset(reasoner.instances(OWLDataSomeValuesFrom(property=age_, filler=filler))) - # target_inst = frozenset({anna, martin}) - # self.assertEqual(inst, target_inst) + def test_data_properties_time(self): + NS = "http://example.com/father#" + mgr = OntologyManager() + onto = mgr.load_ontology(IRI.create("file://../KGs/Family/father.owl")) + + with onto._onto: + class birthDate(DataProperty): + range = [date] + + class birthDateTime(DataProperty): + range = [datetime] + + onto._onto.markus.birthDate = [date(year=1990, month=10, day=2)] + onto._onto.markus.birthDateTime = [datetime(year=1990, month=10, day=2, hour=10, minute=20, second=5)] + + onto._onto.anna.birthDate = [date(year=1995, month=6, day=10)] + onto._onto.anna.birthDateTime = [datetime(year=1995, month=6, day=10, hour=2, minute=10)] + + onto._onto.heinz.birthDate = [date(year=1986, month=6, day=10)] + onto._onto.heinz.birthDateTime = [datetime(year=1986, month=6, day=10, hour=10, second=10)] + + onto._onto.michelle.birthDate = [date(year=2000, month=1, day=4)] + onto._onto.michelle.birthDateTime = [datetime(year=2000, month=1, day=4, minute=4, second=10)] + + onto._onto.martin.birthDate = [date(year=1999, month=3, day=1)] + onto._onto.martin.birthDateTime = [datetime(year=1999, month=3, day=2, hour=20, minute=2, second=30)] + + birth_date = OWLDataProperty(IRI(NS, 'birthDate')) + birth_date_time = OWLDataProperty(IRI(NS, 'birthDateTime')) + markus = OWLNamedIndividual(IRI(NS, 'markus')) + anna = OWLNamedIndividual(IRI(NS, 'anna')) + heinz = OWLNamedIndividual(IRI(NS, 'heinz')) + michelle = OWLNamedIndividual(IRI(NS, 'michelle')) + martin = OWLNamedIndividual(IRI(NS, 'martin')) + + base_reasoner = OntologyReasoner(onto) + reasoner = FastInstanceCheckerReasoner(onto, base_reasoner=base_reasoner) + + restriction = owl_datatype_min_max_exclusive_restriction(date(year=1995, month=6, day=12), + date(year=1999, month=3, day=2)) + inst = frozenset(reasoner.instances(OWLDataSomeValuesFrom(property=birth_date, + filler=restriction))) + target_inst = frozenset({martin}) + self.assertEqual(inst, target_inst) + + inst = frozenset(reasoner.instances(OWLDataSomeValuesFrom(property=birth_date, + filler=OWLDataComplementOf(restriction)))) + target_inst = frozenset({michelle, anna, heinz, markus}) + self.assertEqual(inst, target_inst) + + restriction = owl_datatype_max_inclusive_restriction(datetime(year=1990, month=10, day=2, hour=10, + minute=20, second=5)) + inst = frozenset(reasoner.instances(OWLDataSomeValuesFrom(property=birth_date_time, + filler=restriction))) + target_inst = frozenset({markus, heinz}) + self.assertEqual(inst, target_inst) + def test_sub_property_inclusion(self): ns = "http://dl-learner.org/mutagenesis#" diff --git a/tests/test_owlapy_owl2sparql_converter.py b/tests/test_owlapy_owl2sparql_converter.py index f943f0e0..398df231 100644 --- a/tests/test_owlapy_owl2sparql_converter.py +++ b/tests/test_owlapy_owl2sparql_converter.py @@ -8,11 +8,12 @@ from owlapy.iri import IRI from owlapy.owl_property import OWLObjectProperty -from owlapy.owl_ontology_manager import OntologyManager -from owlapy.owl_reasoner import OntologyReasoner, FastInstanceCheckerReasoner -from owlapy.parser import DLSyntaxParser +# from owlapy.owl_ontology_manager import OntologyManager +# from owlapy.owl_reasoner import OntologyReasoner, FastInstanceCheckerReasoner +# from owlapy.parser import DLSyntaxParser +# from rdflib import Graph from owlapy.converter import Owl2SparqlConverter -from rdflib import Graph + PATH_FAMILY = '../KGs/Family/family-benchmark_rich_background.owl' @@ -99,7 +100,7 @@ def test_as_query(self): # # knowledge base - using OWLReasoner # mgr = OntologyManager() # onto = mgr.load_ontology(IRI.create(PATH_FAMILY)) - # base_reasoner = Reasoner(onto) + # base_reasoner = OntologyReasoner(onto) # family_kb_reasoner = FastInstanceCheckerReasoner(onto, base_reasoner=base_reasoner, negation_default=True) # # ce_str = "Brother" @@ -143,7 +144,7 @@ def test_as_query(self): # # knowledge base - using OWLReasoner # mgr = OntologyManager() # onto = mgr.load_ontology(IRI.create(PATH_FAMILY)) - # base_reasoner = Reasoner(onto) + # base_reasoner = OntologyReasoner(onto) # family_kb_reasoner = FastInstanceCheckerReasoner(onto, base_reasoner=base_reasoner, negation_default=True) # # ce_str = "Brother ⊓ Father" @@ -171,7 +172,7 @@ def test_as_query(self): # # knowledge base - using OWLReasoner # mgr = OntologyManager() # onto = mgr.load_ontology(IRI.create(PATH_FAMILY)) - # base_reasoner = Reasoner(onto) + # base_reasoner = OntologyReasoner(onto) # family_kb_reasoner = FastInstanceCheckerReasoner(onto, base_reasoner=base_reasoner, negation_default=True) # # ce_str = "Sister ⊔ Mother" @@ -200,7 +201,7 @@ def test_as_query(self): # # knowledge base - using OWLReasoner # mgr = OntologyManager() # onto = mgr.load_ontology(IRI.create(PATH_FAMILY)) - # base_reasoner = Reasoner(onto) + # base_reasoner = OntologyReasoner(onto) # family_kb_reasoner = FastInstanceCheckerReasoner(onto, base_reasoner=base_reasoner, negation_default=True) # # ce_str = "¬Mother" @@ -229,7 +230,7 @@ def test_as_query(self): # # knowledge base - using OWLReasoner # mgr = OntologyManager() # onto = mgr.load_ontology(IRI.create(PATH_FAMILY)) - # base_reasoner = Reasoner(onto) + # base_reasoner = OntologyReasoner(onto) # family_kb_reasoner = FastInstanceCheckerReasoner(onto, base_reasoner=base_reasoner, negation_default=True) # # ce_str = "∃hasChild.Male" @@ -257,7 +258,7 @@ def test_as_query(self): # # knowledge base - using OWLReasoner # mgr = OntologyManager() # onto = mgr.load_ontology(IRI.create(PATH_FAMILY)) - # base_reasoner = Reasoner(onto) + # base_reasoner = OntologyReasoner(onto) # family_kb_reasoner = FastInstanceCheckerReasoner(onto, base_reasoner=base_reasoner, negation_default=True) # # ce_str = "∀hasChild.Male" @@ -307,7 +308,7 @@ def test_as_query(self): # # knowledge base - using OWLReasoner # mgr = OntologyManager() # onto = mgr.load_ontology(IRI.create(PATH_FAMILY)) - # base_reasoner = Reasoner(onto) + # base_reasoner = OntologyReasoner(onto) # family_kb_reasoner = FastInstanceCheckerReasoner(onto, base_reasoner=base_reasoner, negation_default=True) # # ce_str = "∀hasChild.Male" @@ -342,7 +343,7 @@ def test_as_query(self): # # knowledge base - using OWLReasoner # mgr = OntologyManager() # onto = mgr.load_ontology(IRI.create(PATH_FAMILY)) - # base_reasoner = Reasoner(onto) + # base_reasoner = OntologyReasoner(onto) # family_kb_reasoner = FastInstanceCheckerReasoner(onto, base_reasoner=base_reasoner, negation_default=True) # # concepts = [ @@ -373,7 +374,7 @@ def test_as_query(self): # # knowledge base - using OWLReasoner # mgr = OntologyManager() # onto = mgr.load_ontology(IRI.create(PATH_FAMILY)) - # base_reasoner = Reasoner(onto) + # base_reasoner = OntologyReasoner(onto) # family_kb_reasoner = FastInstanceCheckerReasoner(onto, base_reasoner=base_reasoner, negation_default=True) # # concepts = [ diff --git a/tests/test_sync_ontology.py b/tests/test_sync_ontology.py index 297f0127..42c7727e 100644 --- a/tests/test_sync_ontology.py +++ b/tests/test_sync_ontology.py @@ -20,7 +20,7 @@ g = OWLNamedIndividual(IRI(NS, "g")) h = OWLNamedIndividual(IRI(NS, "h")) m = OWLNamedIndividual(IRI(NS, "m")) -l = OWLNamedIndividual(IRI(NS, "l")) +l = OWLNamedIndividual(IRI(NS, "l")) # noqa: E741 n = OWLNamedIndividual(IRI(NS, "n")) o = OWLNamedIndividual(IRI(NS, "o")) p = OWLNamedIndividual(IRI(NS, "p")) @@ -57,11 +57,11 @@ J = OWLClass(IRI(NS, 'J')) K = OWLClass(IRI(NS, 'K')) H = OWLClass(IRI(NS, 'H')) -I = OWLClass(IRI(NS, 'I')) +I = OWLClass(IRI(NS, 'I')) # noqa: E741 L = OWLClass(IRI(NS, 'L')) M = OWLClass(IRI(NS, 'M')) N = OWLClass(IRI(NS, 'N')) -O = OWLClass(IRI(NS, 'O')) +O = OWLClass(IRI(NS, 'O')) # noqa: E741 P = OWLClass(IRI(NS, 'P')) Q = OWLClass(IRI(NS, 'Q')) R = OWLClass(IRI(NS, 'R')) diff --git a/tests/test_sync_reasoner.py b/tests/test_sync_reasoner.py index 3666f6cc..13b35a8e 100644 --- a/tests/test_sync_reasoner.py +++ b/tests/test_sync_reasoner.py @@ -58,7 +58,7 @@ def test_instances_retrieval(self): def test_conversion(self): # construct the class expression in owlapi - from org.semanticweb.owlapi.model import IRI as IRIowlapi, OWLClass, OWLObjectProperty + from org.semanticweb.owlapi.model import IRI as IRIowlapi from org.semanticweb.owlapi.vocab import OWLFacet nitrogenIRI = IRIowlapi.create(self.ns + "Nitrogen-38") From 265f15f69f586505f3834fb6b94b5798e90889f5 Mon Sep 17 00:00:00 2001 From: Alkid Date: Mon, 26 Aug 2024 14:19:33 +0200 Subject: [PATCH 15/44] Linting related changes --- owlapy/class_expression/__init__.py | 2 +- owlapy/owl_annotation.py | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/owlapy/class_expression/__init__.py b/owlapy/class_expression/__init__.py index 8b987e71..5ea67ee2 100644 --- a/owlapy/class_expression/__init__.py +++ b/owlapy/class_expression/__init__.py @@ -43,7 +43,7 @@ 'OWLHasValueRestriction', 'OWLDataRestriction', 'OWLCardinalityRestriction', 'OWLFacetRestriction', 'OWLObjectMinCardinality', 'OWLObjectMaxCardinality', 'OWLObjectExactCardinality', 'OWLDataSomeValuesFrom', 'OWLDataAllValuesFrom', 'OWLDataHasValue', 'OWLClass', 'OWLDataMinCardinality', 'OWLDataMaxCardinality', - 'OWLDataExactCardinality', 'OWLObjectOneOf'] + 'OWLDataExactCardinality', 'OWLObjectOneOf', 'OWLDataOneOf', 'OWLDataCardinalityRestriction'] from typing import Final from ..vocab import OWLRDFVocabulary diff --git a/owlapy/owl_annotation.py b/owlapy/owl_annotation.py index a479b81a..9d4a14c9 100644 --- a/owlapy/owl_annotation.py +++ b/owlapy/owl_annotation.py @@ -1,7 +1,6 @@ """OWL Annotations""" from abc import ABCMeta from .owl_object import OWLObject -from typing import Optional class OWLAnnotationObject(OWLObject, metaclass=ABCMeta): From e826b104fbde3fb6e535e1fccd6a20e06157a1a7 Mon Sep 17 00:00:00 2001 From: Alkid Date: Mon, 26 Aug 2024 14:34:41 +0200 Subject: [PATCH 16/44] Fixed converter and some of its tests --- owlapy/converter.py | 4 +- tests/test_owlapy_owl2sparql_converter.py | 326 +++++++++++----------- 2 files changed, 165 insertions(+), 165 deletions(-) diff --git a/owlapy/converter.py b/owlapy/converter.py index 75979c99..8a8a2f8f 100644 --- a/owlapy/converter.py +++ b/owlapy/converter.py @@ -624,10 +624,10 @@ def as_query(self, q = [f"VALUES {root_variable} {{ "] for x in values: q.append(f"<{x.to_string_id()}>") - q.append("}} . ") + q.append("} . ") qs.extend(q) qs.extend(tp) - qs.append(" }}") + qs.append(" }") query = "\n".join(qs) diff --git a/tests/test_owlapy_owl2sparql_converter.py b/tests/test_owlapy_owl2sparql_converter.py index 398df231..b240cb78 100644 --- a/tests/test_owlapy_owl2sparql_converter.py +++ b/tests/test_owlapy_owl2sparql_converter.py @@ -8,14 +8,14 @@ from owlapy.iri import IRI from owlapy.owl_property import OWLObjectProperty -# from owlapy.owl_ontology_manager import OntologyManager -# from owlapy.owl_reasoner import OntologyReasoner, FastInstanceCheckerReasoner -# from owlapy.parser import DLSyntaxParser -# from rdflib import Graph +from owlapy.owl_ontology_manager import OntologyManager +from owlapy.owl_reasoner import OntologyReasoner, FastInstanceCheckerReasoner +from owlapy.parser import DLSyntaxParser +from rdflib import Graph from owlapy.converter import Owl2SparqlConverter -PATH_FAMILY = '../KGs/Family/family-benchmark_rich_background.owl' +PATH_FAMILY = 'KGs/Family/family-benchmark_rich_background.owl' # checks whether all individuals returned by the reasoner are found in results generated by the sparql query @@ -93,164 +93,164 @@ def test_as_query(self): # )""" self.assertEqual(query, query_t) # add assertion here - # def test_Single(self): - # # rdf graph - using rdflib - # family_rdf_graph = Graph() - # family_rdf_graph.parse(location=PATH_FAMILY) - # # knowledge base - using OWLReasoner - # mgr = OntologyManager() - # onto = mgr.load_ontology(IRI.create(PATH_FAMILY)) - # base_reasoner = OntologyReasoner(onto) - # family_kb_reasoner = FastInstanceCheckerReasoner(onto, base_reasoner=base_reasoner, negation_default=True) - # - # ce_str = "Brother" - # ce_parsed = DLSyntaxParser(namespace="http://www.benchmark.org/family#").parse_expression(expression_str=ce_str) - # actual_query = Owl2SparqlConverter().as_query(root_variable=self._root_var_, ce=ce_parsed, count=False, - # values=None, named_individuals=True) - # expected_query = """SELECT DISTINCT ?x - # WHERE { - # ?x . - # }""" - # - # sparql_results_actual = family_rdf_graph.query(actual_query) - # sparql_results_expected = family_rdf_graph.query(expected_query) - # reasoner_results = set(family_kb_reasoner.instances(ce_parsed)) - # - # self.assertEqual(len(sparql_results_actual), len(sparql_results_expected)) - # self.assertEqual(len(sparql_results_actual), len(reasoner_results)) - # self.assertTrue(check_reasoner_instances_in_sparql_results(sparql_results_actual, reasoner_results)) - # - # ce_str = "Male" - # ce_parsed = DLSyntaxParser(namespace="http://www.benchmark.org/family#").parse_expression(expression_str=ce_str) - # actual_query = Owl2SparqlConverter().as_query(root_variable=self._root_var_, ce=ce_parsed, count=False, - # values=None, named_individuals=True) - # expected_query = """SELECT DISTINCT ?x - # WHERE { - # ?x . - # }""" - # - # sparql_results_actual = family_rdf_graph.query(actual_query) - # sparql_results_expected = family_rdf_graph.query(expected_query) - # reasoner_results = set(family_kb_reasoner.instances(ce_parsed)) - # - # self.assertEqual(len(sparql_results_actual), len(sparql_results_expected)) - # self.assertEqual(len(sparql_results_actual), len(reasoner_results)) - # self.assertTrue(check_reasoner_instances_in_sparql_results(sparql_results_actual, reasoner_results)) - # - # def test_Intersection(self): - # # rdf graph - using rdflib - # family_rdf_graph = Graph() - # family_rdf_graph.parse(location=PATH_FAMILY) - # # knowledge base - using OWLReasoner - # mgr = OntologyManager() - # onto = mgr.load_ontology(IRI.create(PATH_FAMILY)) - # base_reasoner = OntologyReasoner(onto) - # family_kb_reasoner = FastInstanceCheckerReasoner(onto, base_reasoner=base_reasoner, negation_default=True) - # - # ce_str = "Brother ⊓ Father" - # ce_parsed = DLSyntaxParser(namespace="http://www.benchmark.org/family#").parse_expression(expression_str=ce_str) - # actual_query = Owl2SparqlConverter().as_query(root_variable=self._root_var_, ce=ce_parsed, count=False, - # values=None, named_individuals=True) - # expected_query = """SELECT DISTINCT ?x - # WHERE { - # ?x . - # ?x . - # }""" - # - # sparql_results_actual = family_rdf_graph.query(actual_query) - # sparql_results_expected = family_rdf_graph.query(expected_query) - # reasoner_results = set(family_kb_reasoner.instances(ce_parsed)) - # - # self.assertEqual(len(sparql_results_actual), len(sparql_results_expected)) - # self.assertEqual(len(sparql_results_actual), len(reasoner_results)) - # self.assertTrue(check_reasoner_instances_in_sparql_results(sparql_results_actual, reasoner_results)) - # - # def test_Union(self): - # # rdf graph - using rdflib - # family_rdf_graph = Graph() - # family_rdf_graph.parse(location=PATH_FAMILY) - # # knowledge base - using OWLReasoner - # mgr = OntologyManager() - # onto = mgr.load_ontology(IRI.create(PATH_FAMILY)) - # base_reasoner = OntologyReasoner(onto) - # family_kb_reasoner = FastInstanceCheckerReasoner(onto, base_reasoner=base_reasoner, negation_default=True) - # - # ce_str = "Sister ⊔ Mother" - # ce_parsed = DLSyntaxParser(namespace="http://www.benchmark.org/family#").parse_expression(expression_str=ce_str) - # actual_query = Owl2SparqlConverter().as_query(root_variable=self._root_var_, ce=ce_parsed, count=False, - # values=None, named_individuals=True) - # expected_query = """SELECT DISTINCT ?x - # WHERE { - # { ?x . } - # UNION - # { ?x . } - # }""" - # - # sparql_results_actual = family_rdf_graph.query(actual_query) - # sparql_results_expected = family_rdf_graph.query(expected_query) - # reasoner_results = set(family_kb_reasoner.instances(ce_parsed)) - # - # self.assertEqual(len(sparql_results_actual), len(sparql_results_expected)) - # self.assertEqual(len(sparql_results_actual), len(reasoner_results)) - # self.assertTrue(check_reasoner_instances_in_sparql_results(sparql_results_actual, reasoner_results)) - # - # def test_Complement(self): - # # rdf graph - using rdflib - # family_rdf_graph = Graph() - # family_rdf_graph.parse(location=PATH_FAMILY) - # # knowledge base - using OWLReasoner - # mgr = OntologyManager() - # onto = mgr.load_ontology(IRI.create(PATH_FAMILY)) - # base_reasoner = OntologyReasoner(onto) - # family_kb_reasoner = FastInstanceCheckerReasoner(onto, base_reasoner=base_reasoner, negation_default=True) - # - # ce_str = "¬Mother" - # ce_parsed = DLSyntaxParser(namespace="http://www.benchmark.org/family#").parse_expression(expression_str=ce_str) - # actual_query = Owl2SparqlConverter().as_query(root_variable=self._root_var_, ce=ce_parsed, count=False, - # values=None, named_individuals=True) - # expected_query = """SELECT DISTINCT ?x - # WHERE { - # ?x a . - # ?x ?p ?o . - # FILTER NOT EXISTS { ?x a . } - # }""" - # - # sparql_results_actual = family_rdf_graph.query(actual_query) - # sparql_results_expected = family_rdf_graph.query(expected_query) - # reasoner_results = set(family_kb_reasoner.instances(ce_parsed)) - # - # self.assertEqual(len(sparql_results_actual), len(sparql_results_expected)) - # self.assertEqual(len(sparql_results_actual), len(reasoner_results)) - # self.assertTrue(check_reasoner_instances_in_sparql_results(sparql_results_actual, reasoner_results)) - # - # def test_Exists(self): - # # rdf graph - using rdflib - # family_rdf_graph = Graph() - # family_rdf_graph.parse(location=PATH_FAMILY) - # # knowledge base - using OWLReasoner - # mgr = OntologyManager() - # onto = mgr.load_ontology(IRI.create(PATH_FAMILY)) - # base_reasoner = OntologyReasoner(onto) - # family_kb_reasoner = FastInstanceCheckerReasoner(onto, base_reasoner=base_reasoner, negation_default=True) - # - # ce_str = "∃hasChild.Male" - # ce_parsed = DLSyntaxParser(namespace="http://www.benchmark.org/family#").parse_expression(expression_str=ce_str) - # actual_query = Owl2SparqlConverter().as_query(root_variable=self._root_var_, ce=ce_parsed, count=False, - # values=None, named_individuals=True) - # expected_query = """SELECT DISTINCT ?x - # WHERE { - # ?x ?s . - # ?s a . - # }""" - # - # sparql_results_actual = family_rdf_graph.query(actual_query) - # sparql_results_expected = family_rdf_graph.query(expected_query) - # reasoner_results = set(family_kb_reasoner.instances(ce_parsed)) - # - # self.assertEqual(len(sparql_results_actual), len(sparql_results_expected)) - # self.assertEqual(len(sparql_results_actual), len(reasoner_results)) - # self.assertTrue(check_reasoner_instances_in_sparql_results(sparql_results_actual, reasoner_results)) - # + def test_Single(self): + # rdf graph - using rdflib + family_rdf_graph = Graph() + family_rdf_graph.parse(location=PATH_FAMILY) + # knowledge base - using OWLReasoner + mgr = OntologyManager() + onto = mgr.load_ontology(IRI.create(PATH_FAMILY)) + base_reasoner = OntologyReasoner(onto) + family_kb_reasoner = FastInstanceCheckerReasoner(onto, base_reasoner=base_reasoner, negation_default=True) + + ce_str = "Brother" + ce_parsed = DLSyntaxParser(namespace="http://www.benchmark.org/family#").parse_expression(expression_str=ce_str) + actual_query = Owl2SparqlConverter().as_query(root_variable=self._root_var_, ce=ce_parsed, count=False, + values=None, named_individuals=True) + expected_query = """SELECT DISTINCT ?x + WHERE { + ?x . + }""" + + sparql_results_actual = family_rdf_graph.query(actual_query) + sparql_results_expected = family_rdf_graph.query(expected_query) + reasoner_results = set(family_kb_reasoner.instances(ce_parsed)) + + self.assertEqual(len(sparql_results_actual), len(sparql_results_expected)) + self.assertEqual(len(sparql_results_actual), len(reasoner_results)) + self.assertTrue(check_reasoner_instances_in_sparql_results(sparql_results_actual, reasoner_results)) + + ce_str = "Male" + ce_parsed = DLSyntaxParser(namespace="http://www.benchmark.org/family#").parse_expression(expression_str=ce_str) + actual_query = Owl2SparqlConverter().as_query(root_variable=self._root_var_, ce=ce_parsed, count=False, + values=None, named_individuals=True) + expected_query = """SELECT DISTINCT ?x + WHERE { + ?x . + }""" + + sparql_results_actual = family_rdf_graph.query(actual_query) + sparql_results_expected = family_rdf_graph.query(expected_query) + reasoner_results = set(family_kb_reasoner.instances(ce_parsed)) + + self.assertEqual(len(sparql_results_actual), len(sparql_results_expected)) + self.assertEqual(len(sparql_results_actual), len(reasoner_results)) + self.assertTrue(check_reasoner_instances_in_sparql_results(sparql_results_actual, reasoner_results)) + + def test_Intersection(self): + # rdf graph - using rdflib + family_rdf_graph = Graph() + family_rdf_graph.parse(location=PATH_FAMILY) + # knowledge base - using OWLReasoner + mgr = OntologyManager() + onto = mgr.load_ontology(IRI.create(PATH_FAMILY)) + base_reasoner = OntologyReasoner(onto) + family_kb_reasoner = FastInstanceCheckerReasoner(onto, base_reasoner=base_reasoner, negation_default=True) + + ce_str = "Brother ⊓ Father" + ce_parsed = DLSyntaxParser(namespace="http://www.benchmark.org/family#").parse_expression(expression_str=ce_str) + actual_query = Owl2SparqlConverter().as_query(root_variable=self._root_var_, ce=ce_parsed, count=False, + values=None, named_individuals=True) + expected_query = """SELECT DISTINCT ?x + WHERE { + ?x . + ?x . + }""" + + sparql_results_actual = family_rdf_graph.query(actual_query) + sparql_results_expected = family_rdf_graph.query(expected_query) + reasoner_results = set(family_kb_reasoner.instances(ce_parsed)) + + self.assertEqual(len(sparql_results_actual), len(sparql_results_expected)) + self.assertEqual(len(sparql_results_actual), len(reasoner_results)) + self.assertTrue(check_reasoner_instances_in_sparql_results(sparql_results_actual, reasoner_results)) + + def test_Union(self): + # rdf graph - using rdflib + family_rdf_graph = Graph() + family_rdf_graph.parse(location=PATH_FAMILY) + # knowledge base - using OWLReasoner + mgr = OntologyManager() + onto = mgr.load_ontology(IRI.create(PATH_FAMILY)) + base_reasoner = OntologyReasoner(onto) + family_kb_reasoner = FastInstanceCheckerReasoner(onto, base_reasoner=base_reasoner, negation_default=True) + + ce_str = "Sister ⊔ Mother" + ce_parsed = DLSyntaxParser(namespace="http://www.benchmark.org/family#").parse_expression(expression_str=ce_str) + actual_query = Owl2SparqlConverter().as_query(root_variable=self._root_var_, ce=ce_parsed, count=False, + values=None, named_individuals=True) + expected_query = """SELECT DISTINCT ?x + WHERE { + { ?x . } + UNION + { ?x . } + }""" + + sparql_results_actual = family_rdf_graph.query(actual_query) + sparql_results_expected = family_rdf_graph.query(expected_query) + reasoner_results = set(family_kb_reasoner.instances(ce_parsed)) + + self.assertEqual(len(sparql_results_actual), len(sparql_results_expected)) + self.assertEqual(len(sparql_results_actual), len(reasoner_results)) + self.assertTrue(check_reasoner_instances_in_sparql_results(sparql_results_actual, reasoner_results)) + + def test_Complement(self): + # rdf graph - using rdflib + family_rdf_graph = Graph() + family_rdf_graph.parse(location=PATH_FAMILY) + # knowledge base - using OWLReasoner + mgr = OntologyManager() + onto = mgr.load_ontology(IRI.create(PATH_FAMILY)) + base_reasoner = OntologyReasoner(onto) + family_kb_reasoner = FastInstanceCheckerReasoner(onto, base_reasoner=base_reasoner, negation_default=True) + + ce_str = "¬Mother" + ce_parsed = DLSyntaxParser(namespace="http://www.benchmark.org/family#").parse_expression(expression_str=ce_str) + actual_query = Owl2SparqlConverter().as_query(root_variable=self._root_var_, ce=ce_parsed, count=False, + values=None, named_individuals=True) + expected_query = """SELECT DISTINCT ?x + WHERE { + ?x a . + ?x ?p ?o . + FILTER NOT EXISTS { ?x a . } + }""" + + sparql_results_actual = family_rdf_graph.query(actual_query) + sparql_results_expected = family_rdf_graph.query(expected_query) + reasoner_results = set(family_kb_reasoner.instances(ce_parsed)) + + self.assertEqual(len(sparql_results_actual), len(sparql_results_expected)) + self.assertEqual(len(sparql_results_actual), len(reasoner_results)) + self.assertTrue(check_reasoner_instances_in_sparql_results(sparql_results_actual, reasoner_results)) + + def test_Exists(self): + # rdf graph - using rdflib + family_rdf_graph = Graph() + family_rdf_graph.parse(location=PATH_FAMILY) + # knowledge base - using OWLReasoner + mgr = OntologyManager() + onto = mgr.load_ontology(IRI.create(PATH_FAMILY)) + base_reasoner = OntologyReasoner(onto) + family_kb_reasoner = FastInstanceCheckerReasoner(onto, base_reasoner=base_reasoner, negation_default=True) + + ce_str = "∃hasChild.Male" + ce_parsed = DLSyntaxParser(namespace="http://www.benchmark.org/family#").parse_expression(expression_str=ce_str) + actual_query = Owl2SparqlConverter().as_query(root_variable=self._root_var_, ce=ce_parsed, count=False, + values=None, named_individuals=True) + expected_query = """SELECT DISTINCT ?x + WHERE { + ?x ?s . + ?s a . + }""" + + sparql_results_actual = family_rdf_graph.query(actual_query) + sparql_results_expected = family_rdf_graph.query(expected_query) + reasoner_results = set(family_kb_reasoner.instances(ce_parsed)) + + self.assertEqual(len(sparql_results_actual), len(sparql_results_expected)) + self.assertEqual(len(sparql_results_actual), len(reasoner_results)) + self.assertTrue(check_reasoner_instances_in_sparql_results(sparql_results_actual, reasoner_results)) + # def test_ForAll(self): # # rdf graph - using rdflib # family_rdf_graph = Graph() From b85448eb2864793668a15525d2a66793676a7178 Mon Sep 17 00:00:00 2001 From: Alkid Date: Mon, 26 Aug 2024 14:38:04 +0200 Subject: [PATCH 17/44] updated path of ontology --- tests/test_owlapy_fastinstancechecker.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_owlapy_fastinstancechecker.py b/tests/test_owlapy_fastinstancechecker.py index ac17314b..f0e98781 100644 --- a/tests/test_owlapy_fastinstancechecker.py +++ b/tests/test_owlapy_fastinstancechecker.py @@ -242,7 +242,7 @@ def test_data_properties(self): def test_data_properties_time(self): NS = "http://example.com/father#" mgr = OntologyManager() - onto = mgr.load_ontology(IRI.create("file://../KGs/Family/father.owl")) + onto = mgr.load_ontology(IRI.create("file://KGs/Family/father.owl")) with onto._onto: class birthDate(DataProperty): From 2c314660f0cdbbb2d951043217aaf43cce06738e Mon Sep 17 00:00:00 2001 From: Alkid Date: Tue, 27 Aug 2024 19:25:32 +0200 Subject: [PATCH 18/44] added tests for sync reasoner --- tests/test_sync_reasoner.py | 247 +++++++++++++++++++++++++++++++++++- 1 file changed, 242 insertions(+), 5 deletions(-) diff --git a/tests/test_sync_reasoner.py b/tests/test_sync_reasoner.py index 13b35a8e..82c4be2d 100644 --- a/tests/test_sync_reasoner.py +++ b/tests/test_sync_reasoner.py @@ -2,22 +2,81 @@ import unittest from jpype import JDouble - -from owlapy.class_expression import OWLClass, OWLDataSomeValuesFrom, OWLObjectIntersectionOf +from owlapy.class_expression import OWLClass, OWLDataSomeValuesFrom, OWLObjectIntersectionOf, OWLNothing, OWLThing from owlapy.iri import IRI -from owlapy.owl_axiom import OWLDisjointClassesAxiom, OWLDeclarationAxiom, OWLClassAssertionAxiom +from owlapy.owl_axiom import OWLDisjointClassesAxiom, OWLDeclarationAxiom, OWLClassAssertionAxiom, OWLSubClassOfAxiom, \ + OWLEquivalentClassesAxiom, OWLSubDataPropertyOfAxiom, OWLSubObjectPropertyOfAxiom from owlapy.owl_individual import OWLNamedIndividual +from owlapy.owl_literal import OWLBottomObjectProperty, OWLTopObjectProperty, OWLBottomDataProperty, OWLTopDataProperty, \ + OWLLiteral from owlapy.owl_ontology_manager import OntologyManager -from owlapy.owl_property import OWLDataProperty +from owlapy.owl_property import OWLDataProperty, OWLObjectProperty from owlapy.owl_reasoner import SyncReasoner from owlapy.providers import owl_datatype_min_inclusive_restriction +NS = 'http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#' + +a = OWLNamedIndividual(IRI(NS, "a")) +b = OWLNamedIndividual(IRI(NS, "b")) +c = OWLNamedIndividual(IRI(NS, "c")) +d = OWLNamedIndividual(IRI(NS, "d")) +e = OWLNamedIndividual(IRI(NS, "e")) +g = OWLNamedIndividual(IRI(NS, "g")) +m = OWLNamedIndividual(IRI(NS, "m")) +l = OWLNamedIndividual(IRI(NS, "l")) # noqa: E741 +n = OWLNamedIndividual(IRI(NS, "n")) +o = OWLNamedIndividual(IRI(NS, "o")) +p = OWLNamedIndividual(IRI(NS, "p")) +q = OWLNamedIndividual(IRI(NS, "q")) +r = OWLNamedIndividual(IRI(NS, "r")) +s = OWLNamedIndividual(IRI(NS, "s")) +ind1 = OWLNamedIndividual(IRI(NS, "ind1")) + +r1 = OWLObjectProperty(IRI(NS, "r1")) +r2 = OWLObjectProperty(IRI(NS, "r2")) +r3 = OWLObjectProperty(IRI(NS, "r3")) +r4 = OWLObjectProperty(IRI(NS, "r4")) +r5 = OWLObjectProperty(IRI(NS, "r5")) +r6 = OWLObjectProperty(IRI(NS, "r6")) +r7 = OWLObjectProperty(IRI(NS, "r7")) + +dp1 = OWLDataProperty(IRI(NS, "dp1")) +dp2 = OWLDataProperty(IRI(NS, "dp2")) +dp3 = OWLDataProperty(IRI(NS, "dp3")) + +A = OWLClass(IRI(NS, 'A')) +B = OWLClass(IRI(NS, 'B')) +C = OWLClass(IRI(NS, 'C')) +AB = OWLClass(IRI(NS, 'AB')) +D = OWLClass(IRI(NS, 'D')) +E = OWLClass(IRI(NS, 'E')) +F = OWLClass(IRI(NS, 'F')) +G = OWLClass(IRI(NS, 'G')) +J = OWLClass(IRI(NS, 'J')) +K = OWLClass(IRI(NS, 'K')) +H = OWLClass(IRI(NS, 'H')) +I = OWLClass(IRI(NS, 'I')) # noqa: E741 +L = OWLClass(IRI(NS, 'L')) +M = OWLClass(IRI(NS, 'M')) +N = OWLClass(IRI(NS, 'N')) +O = OWLClass(IRI(NS, 'O')) # noqa: E741 +P = OWLClass(IRI(NS, 'P')) +Q = OWLClass(IRI(NS, 'Q')) +R = OWLClass(IRI(NS, 'R')) +S = OWLClass(IRI(NS, 'S')) +T = OWLClass(IRI(NS, 'T')) +U = OWLClass(IRI(NS, 'U')) +reasoner2 = SyncReasoner("../KGs/Test/test_ontology.owl") class TestSyncReasoner(unittest.TestCase): ns = "http://dl-learner.org/mutagenesis#" - ontology_path = "KGs/Mutagenesis/mutagenesis.owl" + ontology_path = "../KGs/Mutagenesis/mutagenesis.owl" nitrogen38 = OWLClass(IRI.create(ns, "Nitrogen-38")) + compound = OWLClass(IRI.create(ns, "Compound")) + atom = OWLClass(IRI.create(ns, "Atom")) charge = OWLDataProperty(IRI.create(ns, "charge")) + hasAtom = OWLObjectProperty(IRI.create(ns, "hasAtom")) + d100_25 = OWLNamedIndividual(IRI.create(ns, "d100_25")) has_charge_more_than_0_85 = OWLDataSomeValuesFrom(charge, owl_datatype_min_inclusive_restriction(0.85)) ce = OWLObjectIntersectionOf([nitrogen38, has_charge_more_than_0_85]) reasoner = SyncReasoner(ontology_path) @@ -88,3 +147,181 @@ def test_conversion(self): self.assertEqual(ce_1, ce_2) self.assertEqual(ce_1, self.ce) self.assertEqual(ce_2, self.ce) + + def test_equivalent_classes(self): + self.assertCountEqual(list(reasoner2.equivalent_classes(N)), [N, Q]) + + def test_disjoint_classes(self): + self.assertCountEqual(list(reasoner2.disjoint_classes(L)), [M, OWLNothing]) + + def test_sub_classes(self): + self.assertCountEqual(list(reasoner2.sub_classes(L)), [M, OWLNothing]) + + def test_super_classes(self): + self.assertCountEqual(list(reasoner2.super_classes(L)), [M, OWLNothing]) + + def test_data_property_domains(self): + self.assertCountEqual(list(reasoner2.data_property_domains(dp1, False)), [AB, A, B, C, OWLThing]) + self.assertCountEqual(list(reasoner2.data_property_domains(dp1, True)), [AB]) + + def test_object_property_domains(self): + self.assertCountEqual(list(self.reasoner.object_property_domains(self.hasAtom, False)), [self.compound, OWLThing]) + self.assertCountEqual(list(self.reasoner.object_property_domains(self.hasAtom, True)), [self.compound]) + + def test_object_property_ranges(self): + self.assertCountEqual(list(reasoner2.object_property_ranges(r1, False)), [OWLThing, G]) + self.assertCountEqual(list(reasoner2.object_property_ranges(r1, True)), [G]) + + def test_sub_object_properties(self): + self.assertCountEqual(list(reasoner2.sub_object_properties(r1, False)), [r2, OWLBottomObjectProperty]) + self.assertCountEqual(list(reasoner2.sub_object_properties(r1, True)), [r2]) + + def test_super_object_properties(self): + self.assertCountEqual(list(reasoner2.super_object_properties(r2, False)), [r1, OWLTopObjectProperty]) + self.assertCountEqual(list(reasoner2.super_object_properties(r2, True)), [r1]) + + def test_sub_data_properties(self): + self.assertCountEqual(list(reasoner2.sub_data_properties(dp1, False)), [dp2, OWLBottomDataProperty]) + self.assertCountEqual(list(reasoner2.sub_data_properties(dp1, True)), [dp2]) + + def test_super_data_properties(self): + self.assertCountEqual(list(reasoner2.super_data_properties(dp2, False)), [dp1, OWLTopDataProperty]) + self.assertCountEqual(list(reasoner2.super_data_properties(dp2, True)), [dp1]) + + def test_different_individuals(self): + self.assertCountEqual(list(reasoner2.different_individuals(l)), [m]) + self.assertCountEqual(list(reasoner2.different_individuals(m)), [l]) + + def test_object_property_values(self): + self.assertCountEqual(list(reasoner2.object_property_values(n, r3)), [q]) + self.assertCountEqual(list(reasoner2.object_property_values(n, r4)), [l, q]) + + def test_data_property_values(self): + self.assertCountEqual(list(self.reasoner.data_property_values(self.d100_25, self.charge)), [OWLLiteral(0.332)]) + + def test_disjoint_object_properties(self): + self.assertCountEqual(list(reasoner2.disjoint_object_properties(r5)), [r1, r2, OWLBottomObjectProperty]) + self.assertCountEqual(list(reasoner2.disjoint_object_properties(r1)), [r5, OWLBottomObjectProperty]) + self.assertCountEqual(list(reasoner2.disjoint_object_properties(r2)), [r5, OWLBottomObjectProperty]) + + def test_disjoint_data_properties(self): + self.assertCountEqual(list(reasoner2.disjoint_data_properties(dp1)), [dp3, OWLBottomDataProperty]) + self.assertCountEqual(list(reasoner2.disjoint_data_properties(dp3)), [dp1,dp2, OWLBottomDataProperty]) + + def test_types(self): + self.assertCountEqual(list(reasoner2.types(c)), [I, J, K, OWLThing]) + + def test_infer_axiom(self): + + self.assertCountEqual(list(reasoner2.infer_axioms(["InferredClassAssertionAxiomGenerator", "InferredSubClassAxiomGenerator", + "InferredDisjointClassesAxiomGenerator", "InferredEquivalentClassAxiomGenerator", + "InferredEquivalentDataPropertiesAxiomGenerator","InferredEquivalentObjectPropertyAxiomGenerator", + "InferredInverseObjectPropertiesAxiomGenerator","InferredSubDataPropertyAxiomGenerator", + "InferredSubObjectPropertyAxiomGenerator","InferredDataPropertyCharacteristicAxiomGenerator", + "InferredObjectPropertyCharacteristicAxiomGenerator" + ])), [ OWLClassAssertionAxiom(individual=OWLNamedIndividual(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','f')),class_expression=OWLClass(IRI('http://www.w3.org/2002/07/owl#','Thing')),annotations=[]), + OWLClassAssertionAxiom(individual=OWLNamedIndividual(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','l')),class_expression=OWLClass(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','L')),annotations=[]), + OWLClassAssertionAxiom(individual=OWLNamedIndividual(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','m')),class_expression=OWLClass(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','M')),annotations=[]), + OWLClassAssertionAxiom(individual=OWLNamedIndividual(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','a')),class_expression=OWLClass(IRI('http://www.w3.org/2002/07/owl#','Thing')),annotations=[]), + OWLClassAssertionAxiom(individual=OWLNamedIndividual(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','e')),class_expression=OWLClass(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','C')),annotations=[]), + OWLClassAssertionAxiom(individual=OWLNamedIndividual(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','s')),class_expression=OWLClass(IRI('http://www.w3.org/2002/07/owl#','Thing')),annotations=[]), + OWLClassAssertionAxiom(individual=OWLNamedIndividual(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','n')),class_expression=OWLClass(IRI('http://www.w3.org/2002/07/owl#','Thing')),annotations=[]), + OWLClassAssertionAxiom(individual=OWLNamedIndividual(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','p')),class_expression=OWLClass(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','P')),annotations=[]), + OWLClassAssertionAxiom(individual=OWLNamedIndividual(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','a')),class_expression=OWLClass(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','AB')),annotations=[]), + OWLClassAssertionAxiom(individual=OWLNamedIndividual(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','q')),class_expression=OWLClass(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','Q')),annotations=[]), + OWLClassAssertionAxiom(individual=OWLNamedIndividual(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','a')),class_expression=OWLClass(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','B')),annotations=[]), + OWLClassAssertionAxiom(individual=OWLNamedIndividual(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','n')),class_expression=OWLClass(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','N')),annotations=[]), + OWLClassAssertionAxiom(individual=OWLNamedIndividual(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','c')),class_expression=OWLClass(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','K')),annotations=[]), + OWLClassAssertionAxiom(individual=OWLNamedIndividual(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','e')),class_expression=OWLClass(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','A')),annotations=[]), + OWLClassAssertionAxiom(individual=OWLNamedIndividual(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','ind1')),class_expression=OWLClass(IRI('http://www.w3.org/2002/07/owl#','Thing')),annotations=[]), + OWLClassAssertionAxiom(individual=OWLNamedIndividual(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','d')),class_expression=OWLClass(IRI('http://www.w3.org/2002/07/owl#','Thing')),annotations=[]), + OWLClassAssertionAxiom(individual=OWLNamedIndividual(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','o')),class_expression=OWLClass(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','O')),annotations=[]), + OWLClassAssertionAxiom(individual=OWLNamedIndividual(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','c')),class_expression=OWLClass(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','I')),annotations=[]), + OWLClassAssertionAxiom(individual=OWLNamedIndividual(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','r')),class_expression=OWLClass(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','R')),annotations=[]), + OWLClassAssertionAxiom(individual=OWLNamedIndividual(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','q')),class_expression=OWLClass(IRI('http://www.w3.org/2002/07/owl#','Thing')),annotations=[]), + OWLClassAssertionAxiom(individual=OWLNamedIndividual(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','l')),class_expression=OWLClass(IRI('http://www.w3.org/2002/07/owl#','Thing')),annotations=[]), + OWLClassAssertionAxiom(individual=OWLNamedIndividual(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','s')),class_expression=OWLClass(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','S')),annotations=[]), + OWLClassAssertionAxiom(individual=OWLNamedIndividual(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','f')),class_expression=OWLClass(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','E')),annotations=[]), + OWLClassAssertionAxiom(individual=OWLNamedIndividual(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','g')),class_expression=OWLClass(IRI('http://www.w3.org/2002/07/owl#','Thing')),annotations=[]), + OWLClassAssertionAxiom(individual=OWLNamedIndividual(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','b')),class_expression=OWLClass(IRI('http://www.w3.org/2002/07/owl#','Thing')),annotations=[]), + OWLClassAssertionAxiom(individual=OWLNamedIndividual(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','n')),class_expression=OWLClass(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','Q')),annotations=[]), + OWLClassAssertionAxiom(individual=OWLNamedIndividual(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','e')),class_expression=OWLClass(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','B')),annotations=[]), + OWLClassAssertionAxiom(individual=OWLNamedIndividual(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','a')),class_expression=OWLClass(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','C')),annotations=[]), + OWLClassAssertionAxiom(individual=OWLNamedIndividual(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','o')),class_expression=OWLClass(IRI('http://www.w3.org/2002/07/owl#','Thing')),annotations=[]), + OWLClassAssertionAxiom(individual=OWLNamedIndividual(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','o')),class_expression=OWLClass(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','P')),annotations=[]), + OWLClassAssertionAxiom(individual=OWLNamedIndividual(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','ind1')),class_expression=OWLClass(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','H')),annotations=[]), + OWLClassAssertionAxiom(individual=OWLNamedIndividual(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','a')),class_expression=OWLClass(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','A')),annotations=[]), + OWLClassAssertionAxiom(individual=OWLNamedIndividual(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','e')),class_expression=OWLClass(IRI('http://www.w3.org/2002/07/owl#','Thing')),annotations=[]), + OWLClassAssertionAxiom(individual=OWLNamedIndividual(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','ind1')),class_expression=OWLClass(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','F')),annotations=[]), + OWLClassAssertionAxiom(individual=OWLNamedIndividual(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','s')),class_expression=OWLClass(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','T')),annotations=[]), + OWLClassAssertionAxiom(individual=OWLNamedIndividual(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','r')),class_expression=OWLClass(IRI('http://www.w3.org/2002/07/owl#','Thing')),annotations=[]), + OWLClassAssertionAxiom(individual=OWLNamedIndividual(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','e')),class_expression=OWLClass(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','AB')),annotations=[]), + OWLClassAssertionAxiom(individual=OWLNamedIndividual(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','m')),class_expression=OWLClass(IRI('http://www.w3.org/2002/07/owl#','Thing')),annotations=[]), + OWLClassAssertionAxiom(individual=OWLNamedIndividual(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','h')),class_expression=OWLClass(IRI('http://www.w3.org/2002/07/owl#','Thing')),annotations=[]), + OWLClassAssertionAxiom(individual=OWLNamedIndividual(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','d')),class_expression=OWLClass(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','D')),annotations=[]), + OWLClassAssertionAxiom(individual=OWLNamedIndividual(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','c')),class_expression=OWLClass(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','J')),annotations=[]), + OWLClassAssertionAxiom(individual=OWLNamedIndividual(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','b')),class_expression=OWLClass(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','B')),annotations=[]), + OWLClassAssertionAxiom(individual=OWLNamedIndividual(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','c')),class_expression=OWLClass(IRI('http://www.w3.org/2002/07/owl#','Thing')),annotations=[]), + OWLClassAssertionAxiom(individual=OWLNamedIndividual(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','d')),class_expression=OWLClass(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','B')),annotations=[]), + OWLClassAssertionAxiom(individual=OWLNamedIndividual(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','p')),class_expression=OWLClass(IRI('http://www.w3.org/2002/07/owl#','Thing')),annotations=[]), + OWLClassAssertionAxiom(individual=OWLNamedIndividual(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','q')),class_expression=OWLClass(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','N')),annotations=[]), + OWLClassAssertionAxiom(individual=OWLNamedIndividual(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','g')),class_expression=OWLClass(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','G')),annotations=[]), + OWLSubClassOfAxiom(sub_class=OWLClass(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','AB')),super_class=OWLClass(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','A')),annotations=[]), + OWLSubClassOfAxiom(sub_class=OWLClass(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','I')),super_class=OWLClass(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','K')),annotations=[]), + OWLSubClassOfAxiom(sub_class=OWLClass(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','N')),super_class=OWLClass(IRI('http://www.w3.org/2002/07/owl#','Thing')),annotations=[]), + OWLSubClassOfAxiom(sub_class=OWLClass(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','Q')),super_class=OWLClass(IRI('http://www.w3.org/2002/07/owl#','Thing')),annotations=[]), + OWLSubClassOfAxiom(sub_class=OWLClass(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','A')),super_class=OWLClass(IRI('http://www.w3.org/2002/07/owl#','Thing')),annotations=[]), + OWLSubClassOfAxiom(sub_class=OWLClass(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','D')),super_class=OWLClass(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','B')),annotations=[]), + OWLSubClassOfAxiom(sub_class=OWLClass(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','AB')),super_class=OWLClass(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','C')),annotations=[]), + OWLSubClassOfAxiom(sub_class=OWLClass(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','K')),super_class=OWLClass(IRI('http://www.w3.org/2002/07/owl#','Thing')),annotations=[]), + OWLSubClassOfAxiom(sub_class=OWLClass(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','B')),super_class=OWLClass(IRI('http://www.w3.org/2002/07/owl#','Thing')),annotations=[]), + OWLSubClassOfAxiom(sub_class=OWLClass(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','G')),super_class=OWLClass(IRI('http://www.w3.org/2002/07/owl#','Thing')),annotations=[]), + OWLSubClassOfAxiom(sub_class=OWLClass(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','O')),super_class=OWLClass(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','P')),annotations=[]), + OWLSubClassOfAxiom(sub_class=OWLClass(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','L')),super_class=OWLClass(IRI('http://www.w3.org/2002/07/owl#','Thing')),annotations=[]), + OWLSubClassOfAxiom(sub_class=OWLClass(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','S')),super_class=OWLClass(IRI('http://www.w3.org/2002/07/owl#','Thing')),annotations=[]), + OWLSubClassOfAxiom(sub_class=OWLClass(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','F')),super_class=OWLClass(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','H')),annotations=[]), + OWLSubClassOfAxiom(sub_class=OWLClass(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','AB')),super_class=OWLClass(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','B')),annotations=[]), + OWLSubClassOfAxiom(sub_class=OWLClass(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','E')),super_class=OWLClass(IRI('http://www.w3.org/2002/07/owl#','Thing')),annotations=[]), + OWLSubClassOfAxiom(sub_class=OWLClass(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','J')),super_class=OWLClass(IRI('http://www.w3.org/2002/07/owl#','Thing')),annotations=[]), + OWLSubClassOfAxiom(sub_class=OWLClass(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','U')),super_class=OWLClass(IRI('http://www.w3.org/2002/07/owl#','Thing')),annotations=[]), + OWLSubClassOfAxiom(sub_class=OWLClass(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','I')),super_class=OWLClass(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','J')),annotations=[]), + OWLSubClassOfAxiom(sub_class=OWLClass(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','T')),super_class=OWLClass(IRI('http://www.w3.org/2002/07/owl#','Thing')),annotations=[]), + OWLSubClassOfAxiom(sub_class=OWLClass(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','P')),super_class=OWLClass(IRI('http://www.w3.org/2002/07/owl#','Thing')),annotations=[]), + OWLSubClassOfAxiom(sub_class=OWLClass(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','C')),super_class=OWLClass(IRI('http://www.w3.org/2002/07/owl#','Thing')),annotations=[]), + OWLSubClassOfAxiom(sub_class=OWLClass(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','H')),super_class=OWLClass(IRI('http://www.w3.org/2002/07/owl#','Thing')),annotations=[]), + OWLSubClassOfAxiom(sub_class=OWLClass(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','M')),super_class=OWLClass(IRI('http://www.w3.org/2002/07/owl#','Thing')),annotations=[]), + OWLSubClassOfAxiom(sub_class=OWLClass(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','R')),super_class=OWLClass(IRI('http://www.w3.org/2002/07/owl#','Thing')),annotations=[]), + OWLDisjointClassesAxiom([OWLClass(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','D')), OWLClass(IRI('http://www.w3.org/2002/07/owl#','Nothing'))],[]), + OWLDisjointClassesAxiom([OWLClass(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','Q')), OWLClass(IRI('http://www.w3.org/2002/07/owl#','Nothing'))],[]), + OWLDisjointClassesAxiom([OWLClass(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','J')), OWLClass(IRI('http://www.w3.org/2002/07/owl#','Nothing'))],[]), + OWLDisjointClassesAxiom([OWLClass(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','E')), OWLClass(IRI('http://www.w3.org/2002/07/owl#','Nothing'))],[]), + OWLDisjointClassesAxiom([OWLClass(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','K')), OWLClass(IRI('http://www.w3.org/2002/07/owl#','Nothing'))],[]), + OWLDisjointClassesAxiom([OWLClass(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','L')), OWLClass(IRI('http://www.w3.org/2002/07/owl#','Nothing'))],[]), + OWLDisjointClassesAxiom([OWLClass(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','R')), OWLClass(IRI('http://www.w3.org/2002/07/owl#','Nothing'))],[]), + OWLDisjointClassesAxiom([OWLClass(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','AB')), OWLClass(IRI('http://www.w3.org/2002/07/owl#','Nothing'))],[]), + OWLDisjointClassesAxiom([OWLClass(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','S')), OWLClass(IRI('http://www.w3.org/2002/07/owl#','Nothing'))],[]), + OWLDisjointClassesAxiom([OWLClass(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','M')), OWLClass(IRI('http://www.w3.org/2002/07/owl#','Nothing'))],[]), + OWLDisjointClassesAxiom([OWLClass(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','F')), OWLClass(IRI('http://www.w3.org/2002/07/owl#','Nothing'))],[]), + OWLDisjointClassesAxiom([OWLClass(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','A')), OWLClass(IRI('http://www.w3.org/2002/07/owl#','Nothing'))],[]), + OWLDisjointClassesAxiom([OWLClass(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','G')), OWLClass(IRI('http://www.w3.org/2002/07/owl#','Nothing'))],[]), + OWLDisjointClassesAxiom([OWLClass(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','T')), OWLClass(IRI('http://www.w3.org/2002/07/owl#','Nothing'))],[]), + OWLDisjointClassesAxiom([OWLClass(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','H')), OWLClass(IRI('http://www.w3.org/2002/07/owl#','Nothing'))],[]), + OWLDisjointClassesAxiom([OWLClass(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','N')), OWLClass(IRI('http://www.w3.org/2002/07/owl#','Nothing'))],[]), + OWLDisjointClassesAxiom([OWLClass(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','U')), OWLClass(IRI('http://www.w3.org/2002/07/owl#','Nothing'))],[]), + OWLDisjointClassesAxiom([OWLClass(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','L')), OWLClass(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','M'))],[]), + OWLDisjointClassesAxiom([OWLClass(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','I')), OWLClass(IRI('http://www.w3.org/2002/07/owl#','Nothing'))],[]), + OWLDisjointClassesAxiom([OWLClass(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','B')), OWLClass(IRI('http://www.w3.org/2002/07/owl#','Nothing'))],[]), + OWLDisjointClassesAxiom([OWLClass(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','O')), OWLClass(IRI('http://www.w3.org/2002/07/owl#','Nothing'))],[]), + OWLDisjointClassesAxiom([OWLClass(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','P')), OWLClass(IRI('http://www.w3.org/2002/07/owl#','Nothing'))],[]), + OWLDisjointClassesAxiom([OWLClass(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','C')), OWLClass(IRI('http://www.w3.org/2002/07/owl#','Nothing'))],[]), + OWLEquivalentClassesAxiom([OWLClass(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','N')), OWLClass(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','Q'))],[]), + OWLSubDataPropertyOfAxiom(sub_property=OWLDataProperty(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','dp2')),super_property=OWLDataProperty(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','dp1')),annotations=[]), + OWLSubDataPropertyOfAxiom(sub_property=OWLDataProperty(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','dp3')),super_property=OWLDataProperty(IRI('http://www.w3.org/2002/07/owl#','topDataProperty')),annotations=[]), + OWLSubDataPropertyOfAxiom(sub_property=OWLDataProperty(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','dp1')),super_property=OWLDataProperty(IRI('http://www.w3.org/2002/07/owl#','topDataProperty')),annotations=[]), + OWLSubObjectPropertyOfAxiom(sub_property=OWLObjectProperty(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','r5')),super_property=OWLObjectProperty(IRI('http://www.w3.org/2002/07/owl#','topObjectProperty')),annotations=[]), + OWLSubObjectPropertyOfAxiom(sub_property=OWLObjectProperty(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','r2')),super_property=OWLObjectProperty(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','r1')),annotations=[]), + OWLSubObjectPropertyOfAxiom(sub_property=OWLObjectProperty(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','r7')),super_property=OWLObjectProperty(IRI('http://www.w3.org/2002/07/owl#','topObjectProperty')),annotations=[]), + OWLSubObjectPropertyOfAxiom(sub_property=OWLObjectProperty(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','r4')),super_property=OWLObjectProperty(IRI('http://www.w3.org/2002/07/owl#','topObjectProperty')),annotations=[]), + OWLSubObjectPropertyOfAxiom(sub_property=OWLObjectProperty(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','r1')),super_property=OWLObjectProperty(IRI('http://www.w3.org/2002/07/owl#','topObjectProperty')),annotations=[]), + OWLSubObjectPropertyOfAxiom(sub_property=OWLObjectProperty(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','r3')),super_property=OWLObjectProperty(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','r4')),annotations=[]), + OWLSubObjectPropertyOfAxiom(sub_property=OWLObjectProperty(IRI('http://www.semanticweb.org/stefan/ontologies/2023/1/untitled-ontology-11#','r6')),super_property=OWLObjectProperty(IRI('http://www.w3.org/2002/07/owl#','topObjectProperty')),annotations=[])]) \ No newline at end of file From 8529011cb7dd5a0c687e31706b440b2a8035bf34 Mon Sep 17 00:00:00 2001 From: Alkid Date: Tue, 27 Aug 2024 19:31:42 +0200 Subject: [PATCH 19/44] updated path --- tests/test_sync_reasoner.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/test_sync_reasoner.py b/tests/test_sync_reasoner.py index 82c4be2d..fe28a70a 100644 --- a/tests/test_sync_reasoner.py +++ b/tests/test_sync_reasoner.py @@ -66,11 +66,11 @@ S = OWLClass(IRI(NS, 'S')) T = OWLClass(IRI(NS, 'T')) U = OWLClass(IRI(NS, 'U')) -reasoner2 = SyncReasoner("../KGs/Test/test_ontology.owl") +reasoner2 = SyncReasoner("KGs/Test/test_ontology.owl") class TestSyncReasoner(unittest.TestCase): ns = "http://dl-learner.org/mutagenesis#" - ontology_path = "../KGs/Mutagenesis/mutagenesis.owl" + ontology_path = "KGs/Mutagenesis/mutagenesis.owl" nitrogen38 = OWLClass(IRI.create(ns, "Nitrogen-38")) compound = OWLClass(IRI.create(ns, "Compound")) atom = OWLClass(IRI.create(ns, "Atom")) From 10b27fec8631d2dad48c62d450173275f34d7704 Mon Sep 17 00:00:00 2001 From: Alkid Date: Tue, 27 Aug 2024 19:41:55 +0200 Subject: [PATCH 20/44] added jgrapht java package --- owlapy/jar_dependencies/jgrapht-core-1.2.0.jar | Bin 0 -> 725910 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 owlapy/jar_dependencies/jgrapht-core-1.2.0.jar diff --git a/owlapy/jar_dependencies/jgrapht-core-1.2.0.jar b/owlapy/jar_dependencies/jgrapht-core-1.2.0.jar new file mode 100644 index 0000000000000000000000000000000000000000..9f943dd17ff15b8efebe80eecca2d46d36df1d20 GIT binary patch literal 725910 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≧vWi#sdXH@DNEztCMYH6%zBa2z;RxNe7SGh7B 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 J)Zl}L$$Y1Ck*wFb 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


(|wW73QCvCs^rx2Y3BS1 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
h{K?}%Hk(N#q6eL^v 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
V&hZGVv;_(rqYYJRJTqubVJWEV}`mmW9R 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 z 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 Date: Tue, 27 Aug 2024 19:53:14 +0200 Subject: [PATCH 21/44] updated data_property_domains test --- tests/test_sync_reasoner.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/tests/test_sync_reasoner.py b/tests/test_sync_reasoner.py index fe28a70a..9546f34a 100644 --- a/tests/test_sync_reasoner.py +++ b/tests/test_sync_reasoner.py @@ -66,11 +66,11 @@ S = OWLClass(IRI(NS, 'S')) T = OWLClass(IRI(NS, 'T')) U = OWLClass(IRI(NS, 'U')) -reasoner2 = SyncReasoner("KGs/Test/test_ontology.owl") +reasoner2 = SyncReasoner("../KGs/Test/test_ontology.owl") class TestSyncReasoner(unittest.TestCase): ns = "http://dl-learner.org/mutagenesis#" - ontology_path = "KGs/Mutagenesis/mutagenesis.owl" + ontology_path = "../KGs/Mutagenesis/mutagenesis.owl" nitrogen38 = OWLClass(IRI.create(ns, "Nitrogen-38")) compound = OWLClass(IRI.create(ns, "Compound")) atom = OWLClass(IRI.create(ns, "Atom")) @@ -161,7 +161,6 @@ def test_super_classes(self): self.assertCountEqual(list(reasoner2.super_classes(L)), [M, OWLNothing]) def test_data_property_domains(self): - self.assertCountEqual(list(reasoner2.data_property_domains(dp1, False)), [AB, A, B, C, OWLThing]) self.assertCountEqual(list(reasoner2.data_property_domains(dp1, True)), [AB]) def test_object_property_domains(self): From 96f8c282db0e786503476018bd716606d867aa6e Mon Sep 17 00:00:00 2001 From: Alkid Date: Tue, 27 Aug 2024 20:24:17 +0200 Subject: [PATCH 22/44] set paths to relative --- tests/test_sync_reasoner.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/test_sync_reasoner.py b/tests/test_sync_reasoner.py index 9546f34a..bd735cb3 100644 --- a/tests/test_sync_reasoner.py +++ b/tests/test_sync_reasoner.py @@ -66,11 +66,11 @@ S = OWLClass(IRI(NS, 'S')) T = OWLClass(IRI(NS, 'T')) U = OWLClass(IRI(NS, 'U')) -reasoner2 = SyncReasoner("../KGs/Test/test_ontology.owl") +reasoner2 = SyncReasoner("KGs/Test/test_ontology.owl") class TestSyncReasoner(unittest.TestCase): ns = "http://dl-learner.org/mutagenesis#" - ontology_path = "../KGs/Mutagenesis/mutagenesis.owl" + ontology_path = "KGs/Mutagenesis/mutagenesis.owl" nitrogen38 = OWLClass(IRI.create(ns, "Nitrogen-38")) compound = OWLClass(IRI.create(ns, "Compound")) atom = OWLClass(IRI.create(ns, "Atom")) From 8adea849b4096bfb5d7c75fd65cd43d7a6898d13 Mon Sep 17 00:00:00 2001 From: Alkid Date: Tue, 27 Aug 2024 20:30:12 +0200 Subject: [PATCH 23/44] removed domain test --- tests/test_sync_reasoner.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/tests/test_sync_reasoner.py b/tests/test_sync_reasoner.py index bd735cb3..be765fd0 100644 --- a/tests/test_sync_reasoner.py +++ b/tests/test_sync_reasoner.py @@ -160,9 +160,6 @@ def test_sub_classes(self): def test_super_classes(self): self.assertCountEqual(list(reasoner2.super_classes(L)), [M, OWLNothing]) - def test_data_property_domains(self): - self.assertCountEqual(list(reasoner2.data_property_domains(dp1, True)), [AB]) - def test_object_property_domains(self): self.assertCountEqual(list(self.reasoner.object_property_domains(self.hasAtom, False)), [self.compound, OWLThing]) self.assertCountEqual(list(self.reasoner.object_property_domains(self.hasAtom, True)), [self.compound]) From 8ad0f48590d8a3a1b1255df9169859b1edcc2c02 Mon Sep 17 00:00:00 2001 From: Alkid Date: Wed, 28 Aug 2024 13:54:09 +0200 Subject: [PATCH 24/44] fixed test --- tests/test_sync_reasoner.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/test_sync_reasoner.py b/tests/test_sync_reasoner.py index be765fd0..86c9d69e 100644 --- a/tests/test_sync_reasoner.py +++ b/tests/test_sync_reasoner.py @@ -155,10 +155,10 @@ def test_disjoint_classes(self): self.assertCountEqual(list(reasoner2.disjoint_classes(L)), [M, OWLNothing]) def test_sub_classes(self): - self.assertCountEqual(list(reasoner2.sub_classes(L)), [M, OWLNothing]) + self.assertCountEqual(list(reasoner2.sub_classes(P)), [O, OWLNothing]) def test_super_classes(self): - self.assertCountEqual(list(reasoner2.super_classes(L)), [M, OWLNothing]) + self.assertCountEqual(list(reasoner2.super_classes(O)), [P, OWLThing]) def test_object_property_domains(self): self.assertCountEqual(list(self.reasoner.object_property_domains(self.hasAtom, False)), [self.compound, OWLThing]) From 6d9b483de86741fd8a4094bf520aece6a5efcdd7 Mon Sep 17 00:00:00 2001 From: Alkid Date: Wed, 28 Aug 2024 15:25:55 +0200 Subject: [PATCH 25/44] moved add/remove axiom and save methods to Ontology class --- owlapy/owl_ontology.py | 740 ++++++++++++++++++++++++++++++++- owlapy/owl_ontology_manager.py | 709 +------------------------------ 2 files changed, 735 insertions(+), 714 deletions(-) diff --git a/owlapy/owl_ontology.py b/owlapy/owl_ontology.py index bf003c67..62cae3ed 100644 --- a/owlapy/owl_ontology.py +++ b/owlapy/owl_ontology.py @@ -1,16 +1,14 @@ """OWL Ontology""" from abc import ABCMeta, abstractmethod -from functools import singledispatchmethod -from itertools import chain +from functools import singledispatchmethod, singledispatch +from itertools import chain, islice, combinations +import types from types import MappingProxyType -from typing import Iterable, TypeVar, Final, Optional, Union +from typing import Iterable, TypeVar, Final, Optional, Union, cast import logging import owlready2 from pandas import Timedelta from owlapy import namespaces -from owlapy.owl_axiom import OWLEquivalentClassesAxiom, OWLClassAxiom, OWLDataPropertyDomainAxiom, \ - OWLDataPropertyRangeAxiom, OWLObjectPropertyDomainAxiom, OWLObjectPropertyRangeAxiom, OWLSubClassOfAxiom, \ - OWLAnnotationProperty from owlapy.owl_data_ranges import OWLDataRange, OWLDataComplementOf, OWLDataUnionOf, OWLDataIntersectionOf from owlapy.owl_datatype import OWLDatatype from owlapy.owl_individual import OWLNamedIndividual, OWLIndividual @@ -22,11 +20,23 @@ OWLObjectIntersectionOf, OWLObjectSomeValuesFrom, OWLObjectAllValuesFrom, OWLObjectOneOf, OWLObjectExactCardinality, \ OWLObjectMaxCardinality, OWLObjectMinCardinality, OWLObjectHasValue, OWLDataSomeValuesFrom, OWLDataAllValuesFrom, \ OWLDataExactCardinality, OWLDataMaxCardinality, OWLDataMinCardinality, OWLDataHasValue, OWLDataOneOf, \ - OWLDatatypeRestriction, OWLRestriction, OWLObjectRestriction, OWLDataRestriction, OWLFacetRestriction + OWLDatatypeRestriction, OWLRestriction, OWLObjectRestriction, OWLDataRestriction, OWLFacetRestriction, \ + OWLNaryBooleanClassExpression, OWLQuantifiedObjectRestriction, OWLQuantifiedDataRestriction from owlapy.owl_property import OWLDataProperty, OWLObjectProperty, OWLPropertyExpression, OWLObjectInverseOf, \ - OWLObjectPropertyExpression, OWLDataPropertyExpression + OWLObjectPropertyExpression, OWLDataPropertyExpression, OWLProperty from datetime import date, datetime - +from owlready2 import destroy_entity, AllDisjoint, AllDifferent, GeneralClassAxiom +from owlapy.owl_axiom import (OWLObjectPropertyRangeAxiom, OWLAxiom, OWLSubClassOfAxiom, OWLEquivalentClassesAxiom, \ + OWLDisjointUnionAxiom, OWLAnnotationAssertionAxiom, OWLAnnotationProperty, OWLSubPropertyAxiom, \ + OWLPropertyRangeAxiom, OWLClassAssertionAxiom, OWLDeclarationAxiom, OWLObjectPropertyAssertionAxiom, \ + OWLSymmetricObjectPropertyAxiom, OWLTransitiveObjectPropertyAxiom, OWLPropertyDomainAxiom, \ + OWLAsymmetricObjectPropertyAxiom, OWLDataPropertyCharacteristicAxiom, OWLFunctionalDataPropertyAxiom, \ + OWLReflexiveObjectPropertyAxiom, OWLDataPropertyAssertionAxiom, OWLFunctionalObjectPropertyAxiom, \ + OWLObjectPropertyCharacteristicAxiom, OWLIrreflexiveObjectPropertyAxiom, OWLInverseFunctionalObjectPropertyAxiom, \ + OWLDisjointDataPropertiesAxiom, OWLDisjointObjectPropertiesAxiom, OWLEquivalentDataPropertiesAxiom, \ + OWLEquivalentObjectPropertiesAxiom, OWLInverseObjectPropertiesAxiom, OWLNaryPropertyAxiom, OWLNaryIndividualAxiom, \ + OWLDifferentIndividualsAxiom, OWLDisjointClassesAxiom, OWLSameIndividualAxiom, OWLClassAxiom, + OWLDataPropertyDomainAxiom, OWLDataPropertyRangeAxiom, OWLObjectPropertyDomainAxiom) from owlapy.vocab import OWLFacet logger = logging.getLogger(__name__) @@ -250,6 +260,692 @@ def is_anonymous(self) -> bool: """Check whether this ontology does contain an IRI or not.""" return self.get_ontology_id().is_anonymous() + def add_axiom(self, axiom: Union[OWLAxiom, Iterable[OWLAxiom]]): + """Add the specified axiom/axioms to the ontology. + + Args: + axiom: Can be a single axiom or a collection of axioms. + + Returns: + Nothing. + """ + pass + + def remove_axiom(self, axiom: Union[OWLAxiom, Iterable[OWLAxiom]]): + """Removes the specified axiom/axioms to the ontology. + + Args: + axiom: Can be a single axiom or a collection of axioms. + + Returns: + Nothing. + """ + pass + + def save(self, document_iri: Optional[IRI] = None): + """Saves this ontology, using its IRI to determine where/how the ontology should be + saved. + + Args: + document_iri: Whether you want to save in a different location. + + """ + pass + + +def _check_expression(expr: OWLObject, ontology: OWLOntology, world: owlready2.namespace.World): + """ + @TODO:CD: Documentation + Creates all entities (individuals, classes, properties) that appear in the given (complex) class expression + and do not exist in the given ontology yet + + """ + if isinstance(expr, (OWLClass, OWLProperty, OWLNamedIndividual,)): + _add_axiom(OWLDeclarationAxiom(expr), ontology, world) + elif isinstance(expr, (OWLNaryBooleanClassExpression, OWLObjectComplementOf, OWLObjectOneOf,)): + for op in expr.operands(): + _check_expression(op, ontology, world) + elif isinstance(expr, (OWLQuantifiedObjectRestriction, OWLObjectHasValue,)): + _check_expression(expr.get_property(), ontology, world) + _check_expression(expr.get_filler(), ontology, world) + elif isinstance(expr, OWLObjectInverseOf): + _check_expression(expr.get_named_property(), ontology, world) + _check_expression(expr.get_inverse_property(), ontology, world) + elif isinstance(expr, (OWLQuantifiedDataRestriction, OWLDataHasValue,)): + _check_expression(expr.get_property(), ontology, world) + elif not isinstance(expr, OWLObject): + raise ValueError(f'({expr}) is not an OWLObject.') + + +@singledispatch +def _add_axiom(axiom: OWLAxiom, ontology: OWLOntology, world: owlready2.namespace.World): + raise NotImplementedError(f'Axiom type {axiom} is not implemented yet.') + + +@_add_axiom.register +def _(axiom: OWLDeclarationAxiom, ontology: OWLOntology, world: owlready2.namespace.World): + conv = ToOwlready2(world) + ont_x: owlready2.namespace.Ontology = conv.map_object(ontology) + + entity = axiom.get_entity() + with ont_x: + entity_x = world[entity.to_string_id()] + # Entity already exists + if entity_x is not None: + return + + thing_x: owlready2.entity.ThingClass = conv.map_concept(OWLThing) + if isinstance(entity, OWLClass): + if entity.is_owl_thing() or entity.is_owl_nothing(): + return + entity_x = types.new_class(name=entity.iri.get_remainder(), bases=(thing_x,)) + elif isinstance(entity, OWLIndividual): + entity_x = thing_x(entity.iri.get_remainder()) + elif isinstance(entity, OWLObjectProperty): + entity_x = types.new_class(name=entity.iri.get_remainder(), bases=(owlready2.ObjectProperty,)) + elif isinstance(entity, OWLDataProperty): + entity_x = types.new_class(name=entity.iri.get_remainder(), bases=(owlready2.DatatypeProperty,)) + elif isinstance(entity, OWLAnnotationProperty): + entity_x = types.new_class(name=entity.iri.get_remainder(), bases=(owlready2.AnnotationProperty,)) + else: + raise ValueError(f'Cannot add ({entity}). Not an atomic class, property, or individual.') + entity_x.namespace = ont_x.get_namespace(entity.iri.get_namespace()) + entity_x.namespace.world._refactor(entity_x.storid, entity_x.iri) + + +@_add_axiom.register +def _(axiom: OWLClassAssertionAxiom, ontology: OWLOntology, world: owlready2.namespace.World): + conv = ToOwlready2(world) + ont_x: owlready2.namespace.Ontology = conv.map_object(ontology) + + individual = axiom.get_individual() + cls_ = axiom.get_class_expression() + _check_expression(cls_, ontology, world) + _add_axiom(OWLDeclarationAxiom(individual), ontology, world) + with ont_x: + cls_x = conv.map_concept(cls_) + ind_x = conv._to_owlready2_individual(individual) + thing_x = conv.map_concept(OWLThing) + if thing_x in ind_x.is_a: + ind_x.is_a.remove(thing_x) + ind_x.is_a.append(cls_x) + + +@_add_axiom.register +def _(axiom: OWLObjectPropertyAssertionAxiom, ontology: OWLOntology, world: owlready2.namespace.World): + conv = ToOwlready2(world) + ont_x: owlready2.namespace.Ontology = conv.map_object(ontology) + + subject = axiom.get_subject() + property_ = axiom.get_property() + object_ = axiom.get_object() + _add_axiom(OWLDeclarationAxiom(subject), ontology, world) + _add_axiom(OWLDeclarationAxiom(property_), ontology, world) + _add_axiom(OWLDeclarationAxiom(object_), ontology, world) + with ont_x: + subject_x = conv._to_owlready2_individual(subject) + property_x = conv._to_owlready2_property(property_) + object_x = conv._to_owlready2_individual(object_) + property_x[subject_x].append(object_x) + + +@_add_axiom.register +def _(axiom: OWLDataPropertyAssertionAxiom, ontology: OWLOntology, world: owlready2.namespace.World): + conv = ToOwlready2(world) + ont_x: owlready2.namespace.Ontology = conv.map_object(ontology) + + subject = axiom.get_subject() + property_ = axiom.get_property() + _add_axiom(OWLDeclarationAxiom(subject), ontology, world) + _add_axiom(OWLDeclarationAxiom(property_), ontology, world) + with ont_x: + subject_x = conv._to_owlready2_individual(subject) + property_x = conv._to_owlready2_property(property_) + property_x[subject_x].append(axiom.get_object().to_python()) + + +@_add_axiom.register +def _(axiom: OWLSubClassOfAxiom, ontology: OWLOntology, world: owlready2.namespace.World): + conv = ToOwlready2(world) + ont_x: owlready2.namespace.Ontology = conv.map_object(ontology) + + sub_class = axiom.get_sub_class() + super_class = axiom.get_super_class() + + _check_expression(sub_class, ontology, world) + _check_expression(super_class, ontology, world) + with ont_x: + thing_x = conv.map_concept(OWLThing) + sub_class_x = conv.map_concept(sub_class) + super_class_x = conv.map_concept(super_class) + if isinstance(sub_class, OWLClass): + if thing_x in sub_class_x.is_a: + sub_class_x.is_a.remove(thing_x) + else: + # Currently owlready2 seems to expect that we make a new GeneralClassAxiom object each time. + # Another option would be to check whether a GeneralClassAxiom with the sub_class_x already exists and just + # add the super_class_x to its is_a attribute + sub_class_x = GeneralClassAxiom(sub_class_x) + sub_class_x.is_a.append(super_class_x) + + +# TODO: Update as soon as owlready2 adds support for EquivalentClasses general class axioms +@_add_axiom.register +def _(axiom: OWLEquivalentClassesAxiom, ontology: OWLOntology, world: owlready2.namespace.World): + conv = ToOwlready2(world) + ont_x = conv.map_object(ontology) + + assert axiom.contains_named_equivalent_class(), 'Owlready2 does not support general' \ + 'class axioms for equivalent classes.' + for ce in axiom.class_expressions(): + _check_expression(ce, ontology, world) + with ont_x: + for ce_1, ce_2 in combinations(axiom.class_expressions(), 2): + assert ce_1 is not None, f"ce_1 cannot be None: {ce_1}, {type(ce_1)}" + assert ce_2 is not None, f"ce_2_x cannot be None: {ce_2}, {type(ce_2)}" + + ce_1_x = conv.map_concept(ce_1) + ce_2_x = conv.map_concept(ce_2) + try: + assert ce_1_x is not None, f"ce_1_x cannot be None: {ce_1_x}, {type(ce_1_x)}" + assert ce_2_x is not None, f"ce_2_x cannot be None: {ce_2_x}, {type(ce_2_x)}" + except AssertionError: + print("function of ToOwlready2.map_concept() returns None") + print(ce_1, ce_1_x) + print(ce_2, ce_2_x) + print("Axiom:", axiom) + print("Temporary solution is reinitializing ce_1_x=ce_2_x\n\n") + ce_1_x=ce_2_x + + if isinstance(ce_1_x, owlready2.ThingClass): + ce_1_x.equivalent_to.append(ce_2_x) + if isinstance(ce_2_x, owlready2.ThingClass): + ce_2_x.equivalent_to.append(ce_1_x) + + +@_add_axiom.register +def _(axiom: OWLDisjointClassesAxiom, ontology: OWLOntology, world: owlready2.namespace.World): + conv = ToOwlready2(world) + ont_x: owlready2.Ontology = conv.map_object(ontology) + + for cls_ in axiom.class_expressions(): + _check_expression(cls_, ontology, world) + with ont_x: + # TODO: If the first element in the list is a complex class expression owlready2 is bugged + # and creates an AllDifferent axiom + AllDisjoint(list(map(conv.map_concept, axiom.class_expressions()))) + + +@_add_axiom.register +def _(axiom: OWLDisjointUnionAxiom, ontology: OWLOntology, world: owlready2.namespace.World): + conv = ToOwlready2(world) + ont_x: owlready2.Ontology = conv.map_object(ontology) + + assert isinstance(axiom.get_owl_class(), OWLClass), f'({axiom.get_owl_class()}) is not a named class.' + _add_axiom(OWLDeclarationAxiom(axiom.get_owl_class()), ontology, world) + for cls_ in axiom.get_class_expressions(): + _check_expression(cls_, ontology, world) + with ont_x: + cls_x = conv.map_concept(axiom.get_owl_class()) + cls_x.disjoint_unions.append(list(map(conv.map_concept, axiom.get_class_expressions()))) + + +@_add_axiom.register +def _(axiom: OWLAnnotationAssertionAxiom, ontology: OWLOntology, world: owlready2.namespace.World): + conv = ToOwlready2(world) + ont_x: owlready2.Ontology = conv.map_object(ontology) + + prop_x = conv.map_object(axiom.get_property()) + if prop_x is None: + with ont_x: + prop_x: owlready2.annotation.AnnotationPropertyClass = cast( + owlready2.AnnotationProperty, + types.new_class( + name=axiom.get_property().iri.get_remainder(), + bases=(owlready2.AnnotationProperty,))) + prop_x.namespace = ont_x.get_namespace(axiom.get_property().iri.get_namespace()) + sub_x = world[axiom.get_subject().as_iri().as_str()] + assert sub_x is not None, f'{axiom.get_subject} not found in {ontology}' + with ont_x: + if axiom.get_value().is_literal(): + literal = axiom.get_value().as_literal() + setattr(sub_x, prop_x.python_name, literal.to_python()) + else: + o_x = world[axiom.get_value().as_iri().as_str()] + assert o_x is not None, f'{axiom.get_value()} not found in {ontology}' + setattr(sub_x, prop_x.python_name, o_x) + + +@_add_axiom.register +def _(axiom: OWLNaryIndividualAxiom, ontology: OWLOntology, world: owlready2.namespace.World): + conv = ToOwlready2(world) + ont_x: owlready2.Ontology = conv.map_object(ontology) + + for ind in axiom.individuals(): + _add_axiom(OWLDeclarationAxiom(ind), ontology, world) + with ont_x: + if isinstance(axiom, OWLSameIndividualAxiom): + for idx, ind in enumerate(axiom.individuals()): + ind_x = conv._to_owlready2_individual(ind) + for ind_2 in islice(axiom.individuals(), idx + 1, None): + ind_2_x = conv._to_owlready2_individual(ind_2) + ind_x.equivalent_to.append(ind_2_x) + elif isinstance(axiom, OWLDifferentIndividualsAxiom): + AllDifferent(list(map(conv._to_owlready2_individual, axiom.individuals()))) + else: + raise ValueError(f'OWLNaryIndividualAxiom ({axiom}) is not defined.') + + +@_add_axiom.register +def _(axiom: OWLSubPropertyAxiom, ontology: OWLOntology, world: owlready2.namespace.World): + conv = ToOwlready2(world) + ont_x: owlready2.Ontology = conv.map_object(ontology) + + sub_property = axiom.get_sub_property() + super_property = axiom.get_super_property() + _add_axiom(OWLDeclarationAxiom(sub_property), ontology, world) + _add_axiom(OWLDeclarationAxiom(super_property), ontology, world) + with ont_x: + sub_property_x = conv._to_owlready2_property(sub_property) + super_property_x = conv._to_owlready2_property(super_property) + sub_property_x.is_a.append(super_property_x) + + +@_add_axiom.register +def _(axiom: OWLPropertyDomainAxiom, ontology: OWLOntology, world: owlready2.namespace.World): + conv = ToOwlready2(world) + ont_x: owlready2.Ontology = conv.map_object(ontology) + + property_ = axiom.get_property() + domain = axiom.get_domain() + _add_axiom(OWLDeclarationAxiom(property_), ontology, world) + _check_expression(domain, ontology, world) + with ont_x: + property_x = conv._to_owlready2_property(property_) + domain_x = conv.map_concept(domain) + property_x.domain.append(domain_x) + + +@_add_axiom.register +def _(axiom: OWLPropertyRangeAxiom, ontology: OWLOntology, world: owlready2.namespace.World): + conv = ToOwlready2(world) + ont_x: owlready2.Ontology = conv.map_object(ontology) + + property_ = axiom.get_property() + range_ = axiom.get_range() + _add_axiom(OWLDeclarationAxiom(property_), ontology, world) + if isinstance(axiom, OWLObjectPropertyRangeAxiom): + _check_expression(range_, ontology, world) + with ont_x: + property_x = conv._to_owlready2_property(property_) + range_x = conv.map_concept(range_) if isinstance(axiom, OWLObjectPropertyRangeAxiom) \ + else conv.map_datarange(range_) + property_x.range.append(range_x) + + +@_add_axiom.register +def _(axiom: OWLNaryPropertyAxiom, ontology: OWLOntology, world: owlready2.namespace.World): + conv = ToOwlready2(world) + ont_x: owlready2.Ontology = conv.map_object(ontology) + + for property_ in axiom.properties(): + _add_axiom(OWLDeclarationAxiom(property_), ontology, world) + with ont_x: + if isinstance(axiom, (OWLEquivalentObjectPropertiesAxiom, OWLEquivalentDataPropertiesAxiom,)): + for idx, property_ in enumerate(axiom.properties()): + property_x = conv._to_owlready2_property(property_) + for property_2 in islice(axiom.properties(), idx + 1, None): + property_2_x = conv._to_owlready2_property(property_2) + property_x.equivalent_to.append(property_2_x) + elif isinstance(axiom, (OWLDisjointObjectPropertiesAxiom, OWLDisjointDataPropertiesAxiom,)): + AllDisjoint(list(map(conv._to_owlready2_property, axiom.properties()))) + elif isinstance(axiom, OWLInverseObjectPropertiesAxiom): + property_first_x = conv._to_owlready2_property(axiom.get_first_property()) + property_second_x = conv._to_owlready2_property(axiom.get_second_property()) + if property_second_x.inverse_property is not None: + property_second_x.inverse_property = None + property_first_x.inverse_property = property_second_x + else: + raise ValueError(f'OWLNaryPropertyAxiom ({axiom}) is not defined.') + + +@_add_axiom.register +def _(axiom: OWLObjectPropertyCharacteristicAxiom, ontology: OWLOntology, world: owlready2.namespace.World): + conv = ToOwlready2(world) + ont_x: owlready2.Ontology = conv.map_object(ontology) + + property_ = axiom.get_property() + _add_axiom(OWLDeclarationAxiom(property_), ontology, world) + with ont_x: + property_x = conv._to_owlready2_property(property_) + if isinstance(axiom, OWLFunctionalObjectPropertyAxiom): + property_x.is_a.append(owlready2.FunctionalProperty) + elif isinstance(axiom, OWLAsymmetricObjectPropertyAxiom): + property_x.is_a.append(owlready2.AsymmetricProperty) + elif isinstance(axiom, OWLInverseFunctionalObjectPropertyAxiom): + property_x.is_a.append(owlready2.InverseFunctionalProperty) + elif isinstance(axiom, OWLIrreflexiveObjectPropertyAxiom): + property_x.is_a.append(owlready2.IrreflexiveProperty) + elif isinstance(axiom, OWLReflexiveObjectPropertyAxiom): + property_x.is_a.append(owlready2.ReflexiveProperty) + elif isinstance(axiom, OWLSymmetricObjectPropertyAxiom): + property_x.is_a.append(owlready2.SymmetricProperty) + elif isinstance(axiom, OWLTransitiveObjectPropertyAxiom): + property_x.is_a.append(owlready2.TransitiveProperty) + else: + raise ValueError(f'ObjectPropertyCharacteristicAxiom ({axiom}) is not defined.') + + +@_add_axiom.register +def _(axiom: OWLDataPropertyCharacteristicAxiom, ontology: OWLOntology, world: owlready2.namespace.World): + conv = ToOwlready2(world) + ont_x: owlready2.Ontology = conv.map_object(ontology) + + property_ = axiom.get_property() + _add_axiom(OWLDeclarationAxiom(property_), ontology, world) + with ont_x: + property_x = conv._to_owlready2_property(property_) + if isinstance(axiom, OWLFunctionalDataPropertyAxiom): + property_x.is_a.append(owlready2.FunctionalProperty) + else: + raise ValueError(f'DataPropertyCharacteristicAxiom ({axiom}) is not defined.') + + +@singledispatch +def _remove_axiom(axiom: OWLAxiom, ontology: OWLOntology, world: owlready2.namespace.World): + raise NotImplementedError(f'Axiom type {axiom} is not implemented yet.') + + +@_remove_axiom.register +def _(axiom: OWLDeclarationAxiom, ontology: OWLOntology, world: owlready2.namespace.World): + conv = ToOwlready2(world) + ont_x: owlready2.namespace.Ontology = conv.map_object(ontology) + with ont_x: + entity_x = world[axiom.get_entity().to_string_id()] + if entity_x is not None: + # TODO: owlready2 seems to be bugged for properties here + destroy_entity(entity_x) + + +@_remove_axiom.register +def _(axiom: OWLClassAssertionAxiom, ontology: OWLOntology, world: owlready2.namespace.World): + conv = ToOwlready2(world) + ont_x: owlready2.namespace.Ontology = conv.map_object(ontology) + + with ont_x: + cls_x = conv.map_concept(axiom.get_class_expression()) + ind_x = conv._to_owlready2_individual(axiom.get_individual()) + if cls_x is None or ind_x is None: + return + if cls_x in ind_x.is_a: + ind_x.is_a.remove(cls_x) + elif isinstance(axiom.get_class_expression(), OWLClass): + ont_x._del_obj_triple_spo(ind_x.storid, owlready2.rdf_type, cls_x.storid) + + +@_remove_axiom.register +def _(axiom: OWLObjectPropertyAssertionAxiom, ontology: OWLOntology, world: owlready2.namespace.World): + conv = ToOwlready2(world) + ont_x: owlready2.namespace.Ontology = conv.map_object(ontology) + + with ont_x: + subject_x = conv._to_owlready2_individual(axiom.get_subject()) + property_x = conv._to_owlready2_property(axiom.get_property()) + object_x = conv._to_owlready2_individual(axiom.get_object()) + if all([subject_x, property_x, object_x]) and object_x in property_x[subject_x]: + property_x[subject_x].remove(object_x) + + +@_remove_axiom.register +def _(axiom: OWLDataPropertyAssertionAxiom, ontology: OWLOntology, world: owlready2.namespace.World): + conv = ToOwlready2(world) + ont_x: owlready2.namespace.Ontology = conv.map_object(ontology) + + with ont_x: + subject_x = conv._to_owlready2_individual(axiom.get_subject()) + property_x = conv._to_owlready2_property(axiom.get_property()) + object_ = axiom.get_object().to_python() + if subject_x is not None and property_x is not None and object_ in property_x[subject_x]: + property_x[subject_x].remove(object_) + + +@_remove_axiom.register +def _(axiom: OWLSubClassOfAxiom, ontology: OWLOntology, world: owlready2.namespace.World): + conv = ToOwlready2(world) + ont_x: owlready2.namespace.Ontology = conv.map_object(ontology) + sub_class = axiom.get_sub_class() + super_class = axiom.get_super_class() + + with ont_x: + sub_class_x = conv.map_concept(sub_class) + super_class_x = conv.map_concept(super_class) + if sub_class_x is None or super_class_x is None: + return + + if isinstance(sub_class, OWLClass): + if super_class_x in sub_class_x.is_a: + sub_class_x.is_a.remove(super_class_x) + elif isinstance(axiom.get_sub_class(), OWLClass) and isinstance(axiom.get_super_class(), OWLClass): + ont_x._del_obj_triple_spo(sub_class_x.storid, owlready2.rdfs_subclassof, super_class_x.storid) + else: + for ca in ont_x.general_class_axioms(): + if ca.left_side == sub_class_x and super_class_x in ca.is_a: + ca.is_a.remove(super_class_x) + + +# TODO: Update as soons as owlready2 adds support for EquivalentClasses general class axioms +@_remove_axiom.register +def _(axiom: OWLEquivalentClassesAxiom, ontology: OWLOntology, world: owlready2.namespace.World): + conv = ToOwlready2(world) + ont_x = conv.map_object(ontology) + + if not axiom.contains_named_equivalent_class(): + return + + with ont_x: + ces_x = list(map(conv.map_concept, axiom.class_expressions())) + if len(ces_x) < 2 or not all(ces_x): + return + + for ce_1_x, ce_2_x in combinations(ces_x, 2): + if isinstance(ce_2_x, owlready2.ThingClass) and ce_1_x in ce_2_x.equivalent_to: + ce_2_x.equivalent_to.remove(ce_1_x) + if isinstance(ce_1_x, owlready2.ThingClass) and ce_2_x in ce_1_x.equivalent_to: + ce_1_x.equivalent_to.remove(ce_2_x) + + +@_remove_axiom.register +def _(axiom: OWLDisjointClassesAxiom, ontology: OWLOntology, world: owlready2.namespace.World): + conv = ToOwlready2(world) + ont_x: owlready2.Ontology = conv.map_object(ontology) + + with ont_x: + class_expressions_x = set(map(conv.map_concept, axiom.class_expressions())) + if len(class_expressions_x) < 2 or not all(class_expressions_x): + return + for disjoints_x in ont_x.disjoint_classes(): + if set(disjoints_x.entities) == class_expressions_x: + del disjoints_x.entities[:-1] + break + + +@_remove_axiom.register +def _(axiom: OWLDisjointUnionAxiom, ontology: OWLOntology, world: owlready2.namespace.World): + conv = ToOwlready2(world) + ont_x: owlready2.Ontology = conv.map_object(ontology) + assert isinstance(axiom.get_owl_class(), OWLClass), f'({axiom.get_owl_class()}) is not a named class.' + + with ont_x: + cls_x = conv.map_concept(axiom.get_owl_class()) + union_expressions_x = set(map(conv.map_concept, axiom.get_class_expressions())) + if cls_x is not None and all(union_expressions_x): + for union_x in cls_x.disjoint_unions: + if union_expressions_x == set(union_x): + cls_x.disjoint_unions.remove(union_x) + break + + +@_remove_axiom.register +def _(axiom: OWLAnnotationAssertionAxiom, ontology: OWLOntology, world: owlready2.namespace.World): + conv = ToOwlready2(world) + ont_x: owlready2.Ontology = conv.map_object(ontology) + + sub_x = world[axiom.get_subject().as_iri().as_str()] + if sub_x is None: + return + name = axiom.get_property().iri.get_remainder() + with ont_x: + if axiom.get_value().is_literal(): + o_x = axiom.get_value().as_literal().to_python() + else: + o_x = world[axiom.get_value().as_iri().as_str()] + + value = getattr(sub_x, name, None) + if value is not None and o_x in value: + value.remove(o_x) + + +@_remove_axiom.register +def _(axiom: OWLNaryIndividualAxiom, ontology: OWLOntology, world: owlready2.namespace.World): + conv = ToOwlready2(world) + ont_x: owlready2.Ontology = conv.map_object(ontology) + + with ont_x: + individuals_x = list(map(conv._to_owlready2_individual, axiom.individuals())) + if len(individuals_x) < 2 or not all(individuals_x): + return + if isinstance(axiom, OWLSameIndividualAxiom): + if set(individuals_x[1:-1]) <= set(individuals_x[0].INDIRECT_equivalent_to): + for individual_1_x, individual_2_x in combinations(individuals_x, 2): + if individual_1_x in individual_2_x.equivalent_to: + individual_2_x.equivalent_to.remove(individual_1_x) + if individual_2_x in individual_1_x.equivalent_to: + individual_1_x.equivalent_to.remove(individual_2_x) + elif isinstance(axiom, OWLDifferentIndividualsAxiom): + individuals_x = set(individuals_x) + for different_x in ont_x.different_individuals(): + if set(different_x.entities) == individuals_x: + del different_x.entities[:-1] + break + else: + raise ValueError(f'OWLNaryIndividualAxiom ({axiom}) is not defined.') + + +@_remove_axiom.register +def _(axiom: OWLSubPropertyAxiom, ontology: OWLOntology, world: owlready2.namespace.World): + conv = ToOwlready2(world) + ont_x: owlready2.namespace.Ontology = conv.map_object(ontology) + + with ont_x: + sub_property_x = conv._to_owlready2_property(axiom.get_sub_property()) + super_property_x = conv._to_owlready2_property(axiom.get_super_property()) + if sub_property_x is None or super_property_x is None: + return + if super_property_x in sub_property_x.is_a: + sub_property_x.is_a.remove(super_property_x) + else: + ont_x._del_obj_triple_spo(sub_property_x.storid, owlready2.rdfs_subpropertyof, super_property_x.storid) + + +@_remove_axiom.register +def _(axiom: OWLPropertyDomainAxiom, ontology: OWLOntology, world: owlready2.namespace.World): + conv = ToOwlready2(world) + ont_x: owlready2.Ontology = conv.map_object(ontology) + + with ont_x: + property_x = conv._to_owlready2_property(axiom.get_property()) + domain_x = conv.map_concept(axiom.get_domain()) + if domain_x is not None and property_x is not None and domain_x in property_x.domain: + property_x.domain.remove(domain_x) + + +@_remove_axiom.register +def _(axiom: OWLPropertyRangeAxiom, ontology: OWLOntology, world: owlready2.namespace.World): + conv = ToOwlready2(world) + ont_x: owlready2.Ontology = conv.map_object(ontology) + + with ont_x: + property_x = conv._to_owlready2_property(axiom.get_property()) + range_x = conv.map_concept(axiom.get_range()) \ + if isinstance(axiom, OWLObjectPropertyRangeAxiom) else conv.map_datarange(axiom.get_range()) + if range_x is not None and property_x is not None and range_x in property_x.range: + property_x.range.remove(range_x) + + +@_remove_axiom.register +def _(axiom: OWLNaryPropertyAxiom, ontology: OWLOntology, world: owlready2.namespace.World): + conv = ToOwlready2(world) + ont_x: owlready2.Ontology = conv.map_object(ontology) + + with ont_x: + properties_x = list(map(conv._to_owlready2_property, axiom.properties())) + if len(properties_x) < 2 or not all(properties_x): + return + if isinstance(axiom, (OWLEquivalentObjectPropertiesAxiom, OWLEquivalentDataPropertiesAxiom,)): + # Check if all equivalent properties are defined in the ontology + if set(properties_x[1:-1]) <= set(properties_x[0].INDIRECT_equivalent_to): + for property_1_x, property_2_x in combinations(properties_x, 2): + if property_1_x in property_2_x.equivalent_to: + property_2_x.equivalent_to.remove(property_1_x) + if property_2_x in property_1_x.equivalent_to: + property_1_x.equivalent_to.remove(property_2_x) + elif isinstance(axiom, (OWLDisjointObjectPropertiesAxiom, OWLDisjointDataPropertiesAxiom,)): + properties_x = set(properties_x) + for disjoints_x in ont_x.disjoint_properties(): + if set(disjoints_x.entities) == properties_x: + del disjoints_x.entities[:-1] + break + elif isinstance(axiom, OWLInverseObjectPropertiesAxiom): + if len(properties_x) != 2: + return + first = properties_x[0] + second = properties_x[1] + if first.inverse_property == second and second.inverse_property == first: + first.inverse_property = None + else: + raise ValueError(f'OWLNaryPropertyAxiom ({axiom}) is not defined.') + + +@_remove_axiom.register +def _(axiom: OWLObjectPropertyCharacteristicAxiom, ontology: OWLOntology, world: owlready2.namespace.World): + conv = ToOwlready2(world) + ont_x: owlready2.Ontology = conv.map_object(ontology) + + with ont_x: + property_x = conv._to_owlready2_property(axiom.get_property()) + if property_x is None: + return + + if isinstance(axiom, OWLFunctionalObjectPropertyAxiom) and owlready2.FunctionalProperty in property_x.is_a: + property_x.is_a.remove(owlready2.FunctionalProperty) + elif isinstance(axiom, OWLAsymmetricObjectPropertyAxiom) and owlready2.AsymmetricProperty in property_x.is_a: + property_x.is_a.remove(owlready2.AsymmetricProperty) + elif isinstance(axiom, OWLInverseFunctionalObjectPropertyAxiom) \ + and owlready2.InverseFunctionalProperty in property_x.is_a: + property_x.is_a.remove(owlready2.InverseFunctionalProperty) + elif isinstance(axiom, OWLIrreflexiveObjectPropertyAxiom) and owlready2.IrreflexiveProperty in property_x.is_a: + property_x.is_a.remove(owlready2.IrreflexiveProperty) + elif isinstance(axiom, OWLReflexiveObjectPropertyAxiom) and owlready2.ReflexiveProperty in property_x.is_a: + property_x.is_a.remove(owlready2.ReflexiveProperty) + elif isinstance(axiom, OWLSymmetricObjectPropertyAxiom) and owlready2.SymmetricProperty in property_x.is_a: + property_x.is_a.remove(owlready2.SymmetricProperty) + elif isinstance(axiom, OWLTransitiveObjectPropertyAxiom) and owlready2.TransitiveProperty in property_x.is_a: + property_x.is_a.remove(owlready2.TransitiveProperty) + else: + raise ValueError(f'OWLObjectPropertyCharacteristicAxiom ({axiom}) is not defined.') + + +@_remove_axiom.register +def _(axiom: OWLDataPropertyCharacteristicAxiom, ontology: OWLOntology, world: owlready2.namespace.World): + conv = ToOwlready2(world) + ont_x: owlready2.Ontology = conv.map_object(ontology) + + with ont_x: + property_x = conv._to_owlready2_property(axiom.get_property()) + if property_x is not None and isinstance(axiom, OWLFunctionalDataPropertyAxiom) \ + and owlready2.FunctionalProperty in property_x.is_a: + property_x.is_a.remove(owlready2.FunctionalProperty) + class Ontology(OWLOntology): __slots__ = '_manager', '_iri', '_world', '_onto' @@ -373,6 +1069,32 @@ def object_property_range_axioms(self, pe: OWLObjectProperty) -> Iterable[OWLObj logger.warning("Construct %s not implemented at %s", rng, pe) pass # XXX TODO + def add_axiom(self, axiom: Union[OWLAxiom, Iterable[OWLAxiom]]): + if isinstance(axiom, OWLAxiom): + _add_axiom(axiom, self, self._world) + else: + for ax in axiom: + _add_axiom(ax, self, self._world) + + def remove_axiom(self, axiom: Union[OWLAxiom, Iterable[OWLAxiom]]): + if isinstance(axiom, OWLAxiom): + _remove_axiom(axiom, self, self._world) + else: + for ax in axiom: + _remove_axiom(ax, self, self._world) + + def save(self, document_iri: Optional[IRI] = None): + ont_x: owlready2.namespace.Ontology = self._world.get_ontology( + self.get_ontology_id().get_ontology_iri().as_str() + ) + if document_iri is None: + document_iri = self._iri + if document_iri.get_namespace().startswith('file:/'): + filename = document_iri.as_str()[len('file:/'):] + ont_x.save(file=filename) + else: + raise NotImplementedError("Couldn't save because the namespace of current ontology's IRI does not start with **file:/**") + def get_original_iri(self): """Get the IRI argument that was used to create this ontology.""" return self._iri diff --git a/owlapy/owl_ontology_manager.py b/owlapy/owl_ontology_manager.py index 655ad51c..7604115e 100644 --- a/owlapy/owl_ontology_manager.py +++ b/owlapy/owl_ontology_manager.py @@ -95,37 +95,6 @@ def apply_change(self, change: OWLOntologyChange): """ pass - @abstractmethod - def add_axiom(self, ontology: OWLOntology, axiom: OWLAxiom): - """A convenience method that adds a single axiom to an ontology. - - Args: - ontology: The ontology to add the axiom to. - axiom: The axiom to be added. - """ - pass - - @abstractmethod - def remove_axiom(self, ontology: OWLOntology, axiom: OWLAxiom): - """A convenience method that removes a single axiom from an ontology. - - Args: - ontology: The ontology to remove the axiom from. - axiom: The axiom to be removed. - """ - pass - - @abstractmethod - def save_ontology(self, ontology: OWLOntology, document_iri: IRI): - """Saves the specified ontology, using the specified document IRI to determine where/how the ontology should be - saved. - - Args: - ontology: The ontology to be saved. - document_iri: The document IRI where the ontology should be saved to. - """ - pass - class OWLImportsDeclaration(HasIRI): """Represents an import statement in an ontology.""" @@ -179,660 +148,6 @@ def get_import_declaration(self) -> OWLImportsDeclaration: return self._declaration -@singledispatch -def _add_axiom(axiom: OWLAxiom): - raise NotImplementedError(f'Axiom type {axiom} is not implemented yet.') - - -@_add_axiom.register -def _(axiom: OWLDeclarationAxiom, ontology: OWLOntology, world: owlready2.namespace.World): - conv = ToOwlready2(world) - ont_x: owlready2.namespace.Ontology = conv.map_object(ontology) - - entity = axiom.get_entity() - with ont_x: - entity_x = world[entity.to_string_id()] - # Entity already exists - if entity_x is not None: - return - - thing_x: owlready2.entity.ThingClass = conv.map_concept(OWLThing) - if isinstance(entity, OWLClass): - if entity.is_owl_thing() or entity.is_owl_nothing(): - return - entity_x = types.new_class(name=entity.iri.get_remainder(), bases=(thing_x,)) - elif isinstance(entity, OWLIndividual): - entity_x = thing_x(entity.iri.get_remainder()) - elif isinstance(entity, OWLObjectProperty): - entity_x = types.new_class(name=entity.iri.get_remainder(), bases=(owlready2.ObjectProperty,)) - elif isinstance(entity, OWLDataProperty): - entity_x = types.new_class(name=entity.iri.get_remainder(), bases=(owlready2.DatatypeProperty,)) - elif isinstance(entity, OWLAnnotationProperty): - entity_x = types.new_class(name=entity.iri.get_remainder(), bases=(owlready2.AnnotationProperty,)) - else: - raise ValueError(f'Cannot add ({entity}). Not an atomic class, property, or individual.') - entity_x.namespace = ont_x.get_namespace(entity.iri.get_namespace()) - entity_x.namespace.world._refactor(entity_x.storid, entity_x.iri) - - -@_add_axiom.register -def _(axiom: OWLClassAssertionAxiom, ontology: OWLOntology, world: owlready2.namespace.World): - conv = ToOwlready2(world) - ont_x: owlready2.namespace.Ontology = conv.map_object(ontology) - - individual = axiom.get_individual() - cls_ = axiom.get_class_expression() - _check_expression(cls_, ontology, world) - _add_axiom(OWLDeclarationAxiom(individual), ontology, world) - with ont_x: - cls_x = conv.map_concept(cls_) - ind_x = conv._to_owlready2_individual(individual) - thing_x = conv.map_concept(OWLThing) - if thing_x in ind_x.is_a: - ind_x.is_a.remove(thing_x) - ind_x.is_a.append(cls_x) - - -@_add_axiom.register -def _(axiom: OWLObjectPropertyAssertionAxiom, ontology: OWLOntology, world: owlready2.namespace.World): - conv = ToOwlready2(world) - ont_x: owlready2.namespace.Ontology = conv.map_object(ontology) - - subject = axiom.get_subject() - property_ = axiom.get_property() - object_ = axiom.get_object() - _add_axiom(OWLDeclarationAxiom(subject), ontology, world) - _add_axiom(OWLDeclarationAxiom(property_), ontology, world) - _add_axiom(OWLDeclarationAxiom(object_), ontology, world) - with ont_x: - subject_x = conv._to_owlready2_individual(subject) - property_x = conv._to_owlready2_property(property_) - object_x = conv._to_owlready2_individual(object_) - property_x[subject_x].append(object_x) - - -@_add_axiom.register -def _(axiom: OWLDataPropertyAssertionAxiom, ontology: OWLOntology, world: owlready2.namespace.World): - conv = ToOwlready2(world) - ont_x: owlready2.namespace.Ontology = conv.map_object(ontology) - - subject = axiom.get_subject() - property_ = axiom.get_property() - _add_axiom(OWLDeclarationAxiom(subject), ontology, world) - _add_axiom(OWLDeclarationAxiom(property_), ontology, world) - with ont_x: - subject_x = conv._to_owlready2_individual(subject) - property_x = conv._to_owlready2_property(property_) - property_x[subject_x].append(axiom.get_object().to_python()) - - -@_add_axiom.register -def _(axiom: OWLSubClassOfAxiom, ontology: OWLOntology, world: owlready2.namespace.World): - conv = ToOwlready2(world) - ont_x: owlready2.namespace.Ontology = conv.map_object(ontology) - - sub_class = axiom.get_sub_class() - super_class = axiom.get_super_class() - - _check_expression(sub_class, ontology, world) - _check_expression(super_class, ontology, world) - with ont_x: - thing_x = conv.map_concept(OWLThing) - sub_class_x = conv.map_concept(sub_class) - super_class_x = conv.map_concept(super_class) - if isinstance(sub_class, OWLClass): - if thing_x in sub_class_x.is_a: - sub_class_x.is_a.remove(thing_x) - else: - # Currently owlready2 seems to expect that we make a new GeneralClassAxiom object each time. - # Another option would be to check whether a GeneralClassAxiom with the sub_class_x already exists and just - # add the super_class_x to its is_a attribute - sub_class_x = GeneralClassAxiom(sub_class_x) - sub_class_x.is_a.append(super_class_x) - - -# TODO: Update as soon as owlready2 adds support for EquivalentClasses general class axioms -@_add_axiom.register -def _(axiom: OWLEquivalentClassesAxiom, ontology: OWLOntology, world: owlready2.namespace.World): - conv = ToOwlready2(world) - ont_x = conv.map_object(ontology) - - assert axiom.contains_named_equivalent_class(), 'Owlready2 does not support general' \ - 'class axioms for equivalent classes.' - for ce in axiom.class_expressions(): - _check_expression(ce, ontology, world) - with ont_x: - for ce_1, ce_2 in combinations(axiom.class_expressions(), 2): - assert ce_1 is not None, f"ce_1 cannot be None: {ce_1}, {type(ce_1)}" - assert ce_2 is not None, f"ce_2_x cannot be None: {ce_2}, {type(ce_2)}" - - ce_1_x = conv.map_concept(ce_1) - ce_2_x = conv.map_concept(ce_2) - try: - assert ce_1_x is not None, f"ce_1_x cannot be None: {ce_1_x}, {type(ce_1_x)}" - assert ce_2_x is not None, f"ce_2_x cannot be None: {ce_2_x}, {type(ce_2_x)}" - except AssertionError: - print("function of ToOwlready2.map_concept() returns None") - print(ce_1, ce_1_x) - print(ce_2, ce_2_x) - print("Axiom:", axiom) - print("Temporary solution is reinitializing ce_1_x=ce_2_x\n\n") - ce_1_x=ce_2_x - - if isinstance(ce_1_x, owlready2.ThingClass): - ce_1_x.equivalent_to.append(ce_2_x) - if isinstance(ce_2_x, owlready2.ThingClass): - ce_2_x.equivalent_to.append(ce_1_x) - - -@_add_axiom.register -def _(axiom: OWLDisjointClassesAxiom, ontology: OWLOntology, world: owlready2.namespace.World): - conv = ToOwlready2(world) - ont_x: owlready2.Ontology = conv.map_object(ontology) - - for cls_ in axiom.class_expressions(): - _check_expression(cls_, ontology, world) - with ont_x: - # TODO: If the first element in the list is a complex class expression owlready2 is bugged - # and creates an AllDifferent axiom - AllDisjoint(list(map(conv.map_concept, axiom.class_expressions()))) - - -@_add_axiom.register -def _(axiom: OWLDisjointUnionAxiom, ontology: OWLOntology, world: owlready2.namespace.World): - conv = ToOwlready2(world) - ont_x: owlready2.Ontology = conv.map_object(ontology) - - assert isinstance(axiom.get_owl_class(), OWLClass), f'({axiom.get_owl_class()}) is not a named class.' - _add_axiom(OWLDeclarationAxiom(axiom.get_owl_class()), ontology, world) - for cls_ in axiom.get_class_expressions(): - _check_expression(cls_, ontology, world) - with ont_x: - cls_x = conv.map_concept(axiom.get_owl_class()) - cls_x.disjoint_unions.append(list(map(conv.map_concept, axiom.get_class_expressions()))) - - -@_add_axiom.register -def _(axiom: OWLAnnotationAssertionAxiom, ontology: OWLOntology, world: owlready2.namespace.World): - conv = ToOwlready2(world) - ont_x: owlready2.Ontology = conv.map_object(ontology) - - prop_x = conv.map_object(axiom.get_property()) - if prop_x is None: - with ont_x: - prop_x: owlready2.annotation.AnnotationPropertyClass = cast( - owlready2.AnnotationProperty, - types.new_class( - name=axiom.get_property().iri.get_remainder(), - bases=(owlready2.AnnotationProperty,))) - prop_x.namespace = ont_x.get_namespace(axiom.get_property().iri.get_namespace()) - sub_x = world[axiom.get_subject().as_iri().as_str()] - assert sub_x is not None, f'{axiom.get_subject} not found in {ontology}' - with ont_x: - if axiom.get_value().is_literal(): - literal = axiom.get_value().as_literal() - setattr(sub_x, prop_x.python_name, literal.to_python()) - else: - o_x = world[axiom.get_value().as_iri().as_str()] - assert o_x is not None, f'{axiom.get_value()} not found in {ontology}' - setattr(sub_x, prop_x.python_name, o_x) - - -@_add_axiom.register -def _(axiom: OWLNaryIndividualAxiom, ontology: OWLOntology, world: owlready2.namespace.World): - conv = ToOwlready2(world) - ont_x: owlready2.Ontology = conv.map_object(ontology) - - for ind in axiom.individuals(): - _add_axiom(OWLDeclarationAxiom(ind), ontology, world) - with ont_x: - if isinstance(axiom, OWLSameIndividualAxiom): - for idx, ind in enumerate(axiom.individuals()): - ind_x = conv._to_owlready2_individual(ind) - for ind_2 in islice(axiom.individuals(), idx + 1, None): - ind_2_x = conv._to_owlready2_individual(ind_2) - ind_x.equivalent_to.append(ind_2_x) - elif isinstance(axiom, OWLDifferentIndividualsAxiom): - AllDifferent(list(map(conv._to_owlready2_individual, axiom.individuals()))) - else: - raise ValueError(f'OWLNaryIndividualAxiom ({axiom}) is not defined.') - - -@_add_axiom.register -def _(axiom: OWLSubPropertyAxiom, ontology: OWLOntology, world: owlready2.namespace.World): - conv = ToOwlready2(world) - ont_x: owlready2.Ontology = conv.map_object(ontology) - - sub_property = axiom.get_sub_property() - super_property = axiom.get_super_property() - _add_axiom(OWLDeclarationAxiom(sub_property), ontology, world) - _add_axiom(OWLDeclarationAxiom(super_property), ontology, world) - with ont_x: - sub_property_x = conv._to_owlready2_property(sub_property) - super_property_x = conv._to_owlready2_property(super_property) - sub_property_x.is_a.append(super_property_x) - - -@_add_axiom.register -def _(axiom: OWLPropertyDomainAxiom, ontology: OWLOntology, world: owlready2.namespace.World): - conv = ToOwlready2(world) - ont_x: owlready2.Ontology = conv.map_object(ontology) - - property_ = axiom.get_property() - domain = axiom.get_domain() - _add_axiom(OWLDeclarationAxiom(property_), ontology, world) - _check_expression(domain, ontology, world) - with ont_x: - property_x = conv._to_owlready2_property(property_) - domain_x = conv.map_concept(domain) - property_x.domain.append(domain_x) - - -@_add_axiom.register -def _(axiom: OWLPropertyRangeAxiom, ontology: OWLOntology, world: owlready2.namespace.World): - conv = ToOwlready2(world) - ont_x: owlready2.Ontology = conv.map_object(ontology) - - property_ = axiom.get_property() - range_ = axiom.get_range() - _add_axiom(OWLDeclarationAxiom(property_), ontology, world) - if isinstance(axiom, OWLObjectPropertyRangeAxiom): - _check_expression(range_, ontology, world) - with ont_x: - property_x = conv._to_owlready2_property(property_) - range_x = conv.map_concept(range_) if isinstance(axiom, OWLObjectPropertyRangeAxiom) \ - else conv.map_datarange(range_) - property_x.range.append(range_x) - - -@_add_axiom.register -def _(axiom: OWLNaryPropertyAxiom, ontology: OWLOntology, world: owlready2.namespace.World): - conv = ToOwlready2(world) - ont_x: owlready2.Ontology = conv.map_object(ontology) - - for property_ in axiom.properties(): - _add_axiom(OWLDeclarationAxiom(property_), ontology, world) - with ont_x: - if isinstance(axiom, (OWLEquivalentObjectPropertiesAxiom, OWLEquivalentDataPropertiesAxiom,)): - for idx, property_ in enumerate(axiom.properties()): - property_x = conv._to_owlready2_property(property_) - for property_2 in islice(axiom.properties(), idx + 1, None): - property_2_x = conv._to_owlready2_property(property_2) - property_x.equivalent_to.append(property_2_x) - elif isinstance(axiom, (OWLDisjointObjectPropertiesAxiom, OWLDisjointDataPropertiesAxiom,)): - AllDisjoint(list(map(conv._to_owlready2_property, axiom.properties()))) - elif isinstance(axiom, OWLInverseObjectPropertiesAxiom): - property_first_x = conv._to_owlready2_property(axiom.get_first_property()) - property_second_x = conv._to_owlready2_property(axiom.get_second_property()) - if property_second_x.inverse_property is not None: - property_second_x.inverse_property = None - property_first_x.inverse_property = property_second_x - else: - raise ValueError(f'OWLNaryPropertyAxiom ({axiom}) is not defined.') - - -@_add_axiom.register -def _(axiom: OWLObjectPropertyCharacteristicAxiom, ontology: OWLOntology, world: owlready2.namespace.World): - conv = ToOwlready2(world) - ont_x: owlready2.Ontology = conv.map_object(ontology) - - property_ = axiom.get_property() - _add_axiom(OWLDeclarationAxiom(property_), ontology, world) - with ont_x: - property_x = conv._to_owlready2_property(property_) - if isinstance(axiom, OWLFunctionalObjectPropertyAxiom): - property_x.is_a.append(owlready2.FunctionalProperty) - elif isinstance(axiom, OWLAsymmetricObjectPropertyAxiom): - property_x.is_a.append(owlready2.AsymmetricProperty) - elif isinstance(axiom, OWLInverseFunctionalObjectPropertyAxiom): - property_x.is_a.append(owlready2.InverseFunctionalProperty) - elif isinstance(axiom, OWLIrreflexiveObjectPropertyAxiom): - property_x.is_a.append(owlready2.IrreflexiveProperty) - elif isinstance(axiom, OWLReflexiveObjectPropertyAxiom): - property_x.is_a.append(owlready2.ReflexiveProperty) - elif isinstance(axiom, OWLSymmetricObjectPropertyAxiom): - property_x.is_a.append(owlready2.SymmetricProperty) - elif isinstance(axiom, OWLTransitiveObjectPropertyAxiom): - property_x.is_a.append(owlready2.TransitiveProperty) - else: - raise ValueError(f'ObjectPropertyCharacteristicAxiom ({axiom}) is not defined.') - - -@_add_axiom.register -def _(axiom: OWLDataPropertyCharacteristicAxiom, ontology: OWLOntology, world: owlready2.namespace.World): - conv = ToOwlready2(world) - ont_x: owlready2.Ontology = conv.map_object(ontology) - - property_ = axiom.get_property() - _add_axiom(OWLDeclarationAxiom(property_), ontology, world) - with ont_x: - property_x = conv._to_owlready2_property(property_) - if isinstance(axiom, OWLFunctionalDataPropertyAxiom): - property_x.is_a.append(owlready2.FunctionalProperty) - else: - raise ValueError(f'DataPropertyCharacteristicAxiom ({axiom}) is not defined.') - - -@singledispatch -def _remove_axiom(axiom: OWLAxiom, ontology: OWLOntology, world: owlready2.namespace.World): - raise NotImplementedError(f'Axiom type {axiom} is not implemented yet.') - - -@_remove_axiom.register -def _(axiom: OWLDeclarationAxiom, ontology: OWLOntology, world: owlready2.namespace.World): - conv = ToOwlready2(world) - ont_x: owlready2.namespace.Ontology = conv.map_object(ontology) - with ont_x: - entity_x = world[axiom.get_entity().to_string_id()] - if entity_x is not None: - # TODO: owlready2 seems to be bugged for properties here - destroy_entity(entity_x) - - -@_remove_axiom.register -def _(axiom: OWLClassAssertionAxiom, ontology: OWLOntology, world: owlready2.namespace.World): - conv = ToOwlready2(world) - ont_x: owlready2.namespace.Ontology = conv.map_object(ontology) - - with ont_x: - cls_x = conv.map_concept(axiom.get_class_expression()) - ind_x = conv._to_owlready2_individual(axiom.get_individual()) - if cls_x is None or ind_x is None: - return - if cls_x in ind_x.is_a: - ind_x.is_a.remove(cls_x) - elif isinstance(axiom.get_class_expression(), OWLClass): - ont_x._del_obj_triple_spo(ind_x.storid, owlready2.rdf_type, cls_x.storid) - - -@_remove_axiom.register -def _(axiom: OWLObjectPropertyAssertionAxiom, ontology: OWLOntology, world: owlready2.namespace.World): - conv = ToOwlready2(world) - ont_x: owlready2.namespace.Ontology = conv.map_object(ontology) - - with ont_x: - subject_x = conv._to_owlready2_individual(axiom.get_subject()) - property_x = conv._to_owlready2_property(axiom.get_property()) - object_x = conv._to_owlready2_individual(axiom.get_object()) - if all([subject_x, property_x, object_x]) and object_x in property_x[subject_x]: - property_x[subject_x].remove(object_x) - - -@_remove_axiom.register -def _(axiom: OWLDataPropertyAssertionAxiom, ontology: OWLOntology, world: owlready2.namespace.World): - conv = ToOwlready2(world) - ont_x: owlready2.namespace.Ontology = conv.map_object(ontology) - - with ont_x: - subject_x = conv._to_owlready2_individual(axiom.get_subject()) - property_x = conv._to_owlready2_property(axiom.get_property()) - object_ = axiom.get_object().to_python() - if subject_x is not None and property_x is not None and object_ in property_x[subject_x]: - property_x[subject_x].remove(object_) - - -@_remove_axiom.register -def _(axiom: OWLSubClassOfAxiom, ontology: OWLOntology, world: owlready2.namespace.World): - conv = ToOwlready2(world) - ont_x: owlready2.namespace.Ontology = conv.map_object(ontology) - sub_class = axiom.get_sub_class() - super_class = axiom.get_super_class() - - with ont_x: - sub_class_x = conv.map_concept(sub_class) - super_class_x = conv.map_concept(super_class) - if sub_class_x is None or super_class_x is None: - return - - if isinstance(sub_class, OWLClass): - if super_class_x in sub_class_x.is_a: - sub_class_x.is_a.remove(super_class_x) - elif isinstance(axiom.get_sub_class(), OWLClass) and isinstance(axiom.get_super_class(), OWLClass): - ont_x._del_obj_triple_spo(sub_class_x.storid, owlready2.rdfs_subclassof, super_class_x.storid) - else: - for ca in ont_x.general_class_axioms(): - if ca.left_side == sub_class_x and super_class_x in ca.is_a: - ca.is_a.remove(super_class_x) - - -# TODO: Update as soons as owlready2 adds support for EquivalentClasses general class axioms -@_remove_axiom.register -def _(axiom: OWLEquivalentClassesAxiom, ontology: OWLOntology, world: owlready2.namespace.World): - conv = ToOwlready2(world) - ont_x = conv.map_object(ontology) - - if not axiom.contains_named_equivalent_class(): - return - - with ont_x: - ces_x = list(map(conv.map_concept, axiom.class_expressions())) - if len(ces_x) < 2 or not all(ces_x): - return - - for ce_1_x, ce_2_x in combinations(ces_x, 2): - if isinstance(ce_2_x, owlready2.ThingClass) and ce_1_x in ce_2_x.equivalent_to: - ce_2_x.equivalent_to.remove(ce_1_x) - if isinstance(ce_1_x, owlready2.ThingClass) and ce_2_x in ce_1_x.equivalent_to: - ce_1_x.equivalent_to.remove(ce_2_x) - - -@_remove_axiom.register -def _(axiom: OWLDisjointClassesAxiom, ontology: OWLOntology, world: owlready2.namespace.World): - conv = ToOwlready2(world) - ont_x: owlready2.Ontology = conv.map_object(ontology) - - with ont_x: - class_expressions_x = set(map(conv.map_concept, axiom.class_expressions())) - if len(class_expressions_x) < 2 or not all(class_expressions_x): - return - for disjoints_x in ont_x.disjoint_classes(): - if set(disjoints_x.entities) == class_expressions_x: - del disjoints_x.entities[:-1] - break - - -@_remove_axiom.register -def _(axiom: OWLDisjointUnionAxiom, ontology: OWLOntology, world: owlready2.namespace.World): - conv = ToOwlready2(world) - ont_x: owlready2.Ontology = conv.map_object(ontology) - assert isinstance(axiom.get_owl_class(), OWLClass), f'({axiom.get_owl_class()}) is not a named class.' - - with ont_x: - cls_x = conv.map_concept(axiom.get_owl_class()) - union_expressions_x = set(map(conv.map_concept, axiom.get_class_expressions())) - if cls_x is not None and all(union_expressions_x): - for union_x in cls_x.disjoint_unions: - if union_expressions_x == set(union_x): - cls_x.disjoint_unions.remove(union_x) - break - - -@_remove_axiom.register -def _(axiom: OWLAnnotationAssertionAxiom, ontology: OWLOntology, world: owlready2.namespace.World): - conv = ToOwlready2(world) - ont_x: owlready2.Ontology = conv.map_object(ontology) - - sub_x = world[axiom.get_subject().as_iri().as_str()] - if sub_x is None: - return - name = axiom.get_property().iri.get_remainder() - with ont_x: - if axiom.get_value().is_literal(): - o_x = axiom.get_value().as_literal().to_python() - else: - o_x = world[axiom.get_value().as_iri().as_str()] - - value = getattr(sub_x, name, None) - if value is not None and o_x in value: - value.remove(o_x) - - -@_remove_axiom.register -def _(axiom: OWLNaryIndividualAxiom, ontology: OWLOntology, world: owlready2.namespace.World): - conv = ToOwlready2(world) - ont_x: owlready2.Ontology = conv.map_object(ontology) - - with ont_x: - individuals_x = list(map(conv._to_owlready2_individual, axiom.individuals())) - if len(individuals_x) < 2 or not all(individuals_x): - return - if isinstance(axiom, OWLSameIndividualAxiom): - if set(individuals_x[1:-1]) <= set(individuals_x[0].INDIRECT_equivalent_to): - for individual_1_x, individual_2_x in combinations(individuals_x, 2): - if individual_1_x in individual_2_x.equivalent_to: - individual_2_x.equivalent_to.remove(individual_1_x) - if individual_2_x in individual_1_x.equivalent_to: - individual_1_x.equivalent_to.remove(individual_2_x) - elif isinstance(axiom, OWLDifferentIndividualsAxiom): - individuals_x = set(individuals_x) - for different_x in ont_x.different_individuals(): - if set(different_x.entities) == individuals_x: - del different_x.entities[:-1] - break - else: - raise ValueError(f'OWLNaryIndividualAxiom ({axiom}) is not defined.') - - -@_remove_axiom.register -def _(axiom: OWLSubPropertyAxiom, ontology: OWLOntology, world: owlready2.namespace.World): - conv = ToOwlready2(world) - ont_x: owlready2.namespace.Ontology = conv.map_object(ontology) - - with ont_x: - sub_property_x = conv._to_owlready2_property(axiom.get_sub_property()) - super_property_x = conv._to_owlready2_property(axiom.get_super_property()) - if sub_property_x is None or super_property_x is None: - return - if super_property_x in sub_property_x.is_a: - sub_property_x.is_a.remove(super_property_x) - else: - ont_x._del_obj_triple_spo(sub_property_x.storid, owlready2.rdfs_subpropertyof, super_property_x.storid) - - -@_remove_axiom.register -def _(axiom: OWLPropertyDomainAxiom, ontology: OWLOntology, world: owlready2.namespace.World): - conv = ToOwlready2(world) - ont_x: owlready2.Ontology = conv.map_object(ontology) - - with ont_x: - property_x = conv._to_owlready2_property(axiom.get_property()) - domain_x = conv.map_concept(axiom.get_domain()) - if domain_x is not None and property_x is not None and domain_x in property_x.domain: - property_x.domain.remove(domain_x) - - -@_remove_axiom.register -def _(axiom: OWLPropertyRangeAxiom, ontology: OWLOntology, world: owlready2.namespace.World): - conv = ToOwlready2(world) - ont_x: owlready2.Ontology = conv.map_object(ontology) - - with ont_x: - property_x = conv._to_owlready2_property(axiom.get_property()) - range_x = conv.map_concept(axiom.get_range()) \ - if isinstance(axiom, OWLObjectPropertyRangeAxiom) else conv.map_datarange(axiom.get_range()) - if range_x is not None and property_x is not None and range_x in property_x.range: - property_x.range.remove(range_x) - - -@_remove_axiom.register -def _(axiom: OWLNaryPropertyAxiom, ontology: OWLOntology, world: owlready2.namespace.World): - conv = ToOwlready2(world) - ont_x: owlready2.Ontology = conv.map_object(ontology) - - with ont_x: - properties_x = list(map(conv._to_owlready2_property, axiom.properties())) - if len(properties_x) < 2 or not all(properties_x): - return - if isinstance(axiom, (OWLEquivalentObjectPropertiesAxiom, OWLEquivalentDataPropertiesAxiom,)): - # Check if all equivalent properties are defined in the ontology - if set(properties_x[1:-1]) <= set(properties_x[0].INDIRECT_equivalent_to): - for property_1_x, property_2_x in combinations(properties_x, 2): - if property_1_x in property_2_x.equivalent_to: - property_2_x.equivalent_to.remove(property_1_x) - if property_2_x in property_1_x.equivalent_to: - property_1_x.equivalent_to.remove(property_2_x) - elif isinstance(axiom, (OWLDisjointObjectPropertiesAxiom, OWLDisjointDataPropertiesAxiom,)): - properties_x = set(properties_x) - for disjoints_x in ont_x.disjoint_properties(): - if set(disjoints_x.entities) == properties_x: - del disjoints_x.entities[:-1] - break - elif isinstance(axiom, OWLInverseObjectPropertiesAxiom): - if len(properties_x) != 2: - return - first = properties_x[0] - second = properties_x[1] - if first.inverse_property == second and second.inverse_property == first: - first.inverse_property = None - else: - raise ValueError(f'OWLNaryPropertyAxiom ({axiom}) is not defined.') - - -@_remove_axiom.register -def _(axiom: OWLObjectPropertyCharacteristicAxiom, ontology: OWLOntology, world: owlready2.namespace.World): - conv = ToOwlready2(world) - ont_x: owlready2.Ontology = conv.map_object(ontology) - - with ont_x: - property_x = conv._to_owlready2_property(axiom.get_property()) - if property_x is None: - return - - if isinstance(axiom, OWLFunctionalObjectPropertyAxiom) and owlready2.FunctionalProperty in property_x.is_a: - property_x.is_a.remove(owlready2.FunctionalProperty) - elif isinstance(axiom, OWLAsymmetricObjectPropertyAxiom) and owlready2.AsymmetricProperty in property_x.is_a: - property_x.is_a.remove(owlready2.AsymmetricProperty) - elif isinstance(axiom, OWLInverseFunctionalObjectPropertyAxiom) \ - and owlready2.InverseFunctionalProperty in property_x.is_a: - property_x.is_a.remove(owlready2.InverseFunctionalProperty) - elif isinstance(axiom, OWLIrreflexiveObjectPropertyAxiom) and owlready2.IrreflexiveProperty in property_x.is_a: - property_x.is_a.remove(owlready2.IrreflexiveProperty) - elif isinstance(axiom, OWLReflexiveObjectPropertyAxiom) and owlready2.ReflexiveProperty in property_x.is_a: - property_x.is_a.remove(owlready2.ReflexiveProperty) - elif isinstance(axiom, OWLSymmetricObjectPropertyAxiom) and owlready2.SymmetricProperty in property_x.is_a: - property_x.is_a.remove(owlready2.SymmetricProperty) - elif isinstance(axiom, OWLTransitiveObjectPropertyAxiom) and owlready2.TransitiveProperty in property_x.is_a: - property_x.is_a.remove(owlready2.TransitiveProperty) - else: - raise ValueError(f'OWLObjectPropertyCharacteristicAxiom ({axiom}) is not defined.') - - -@_remove_axiom.register -def _(axiom: OWLDataPropertyCharacteristicAxiom, ontology: OWLOntology, world: owlready2.namespace.World): - conv = ToOwlready2(world) - ont_x: owlready2.Ontology = conv.map_object(ontology) - - with ont_x: - property_x = conv._to_owlready2_property(axiom.get_property()) - if property_x is not None and isinstance(axiom, OWLFunctionalDataPropertyAxiom) \ - and owlready2.FunctionalProperty in property_x.is_a: - property_x.is_a.remove(owlready2.FunctionalProperty) - - -def _check_expression(expr: OWLObject, ontology: OWLOntology, world: owlready2.namespace.World): - """ - @TODO:CD: Documentation - Creates all entities (individuals, classes, properties) that appear in the given (complex) class expression - and do not exist in the given ontology yet - - """ - if isinstance(expr, (OWLClass, OWLProperty, OWLNamedIndividual,)): - _add_axiom(OWLDeclarationAxiom(expr), ontology, world) - elif isinstance(expr, (OWLNaryBooleanClassExpression, OWLObjectComplementOf, OWLObjectOneOf,)): - for op in expr.operands(): - _check_expression(op, ontology, world) - elif isinstance(expr, (OWLQuantifiedObjectRestriction, OWLObjectHasValue,)): - _check_expression(expr.get_property(), ontology, world) - _check_expression(expr.get_filler(), ontology, world) - elif isinstance(expr, OWLObjectInverseOf): - _check_expression(expr.get_named_property(), ontology, world) - _check_expression(expr.get_inverse_property(), ontology, world) - elif isinstance(expr, (OWLQuantifiedDataRestriction, OWLDataHasValue,)): - _check_expression(expr.get_property(), ontology, world) - elif not isinstance(expr, OWLObject): - raise ValueError(f'({expr}) is not an OWLObject.') - - class OntologyManager(OWLOntologyManager): __slots__ = '_world' @@ -851,16 +166,16 @@ def __init__(self, world_store=None): else: self._world = owlready2.World(filename=world_store) - def create_ontology(self, iri:Union[str,IRI]=None) -> 'Ontology': + def create_ontology(self, iri: Union[str, IRI] = None) -> Ontology: if isinstance(iri, str): - iri=IRI.create(iri) + iri = IRI.create(iri) else: assert isinstance(iri, IRI), "iri either must be string or an instance of IRI Class" return Ontology(self, iri, load=False) - def load_ontology(self, iri: Union[str,IRI]=None) -> 'Ontology': + def load_ontology(self, iri: Union[str, IRI] = None) -> Ontology: if isinstance(iri, str): - iri=IRI.create(iri) + iri = IRI.create(iri) else: assert isinstance(iri, IRI), "iri either must be string or an instance of IRI Class" return Ontology(self, iri, load=True) @@ -875,22 +190,6 @@ def apply_change(self, change: OWLOntologyChange): # TODO XXX raise NotImplementedError - def add_axiom(self, ontology: OWLOntology, axiom: OWLAxiom): - _add_axiom(axiom, ontology, self._world) - - def remove_axiom(self, ontology: OWLOntology, axiom: OWLAxiom): - _remove_axiom(axiom, ontology, self._world) - - def save_ontology(self, ontology: OWLOntology, document_iri: IRI): - ont_x: owlready2.namespace.Ontology = self._world.get_ontology( - ontology.get_ontology_id().get_ontology_iri().as_str() - ) - if document_iri.get_namespace().startswith('file:/'): - filename = document_iri.as_str()[len('file:/'):] - ont_x.save(file=filename) - else: - raise NotImplementedError("Couldn't save because the namespace of document_iri does not start with **file:/**") - def save_world(self): """Saves the actual state of the quadstore in the SQLite3 file. """ From 9ef50ea0cb6b4282a773c746e1f63c87a702b4be Mon Sep 17 00:00:00 2001 From: Alkid Date: Wed, 28 Aug 2024 15:26:44 +0200 Subject: [PATCH 26/44] updated references of add/remove axiom and save methods --- docs/usage/ontologies.md | 31 +++-- examples/ontology_modification.py | 8 +- examples/ontology_reasoning.py | 10 +- tests/test_owlapy_fastinstancechecker.py | 21 ++-- tests/test_owlapy_ontology_management.py | 138 +++++++++++------------ tests/test_sync_reasoner.py | 10 +- 6 files changed, 107 insertions(+), 111 deletions(-) diff --git a/docs/usage/ontologies.md b/docs/usage/ontologies.md index 098eaa2f..73d2477d 100644 --- a/docs/usage/ontologies.md +++ b/docs/usage/ontologies.md @@ -78,7 +78,7 @@ iri = IRI('http://example.com/father#', 'child') child_class = OWLClass(iri) child_class_declaration_axiom = OWLDeclarationAxiom(child_class) -manager.add_axiom(onto, child_class_declaration_axiom) +onto.add_axiom(child_class_declaration_axiom) ``` In this example, we added the class 'child' to the _father.owl_ ontology. Firstly we create an instance of [OWLClass](owlapy.class_expression.owl_class.OWLClass) to represent the concept @@ -86,9 +86,8 @@ of 'child' by using an [IRI](owlapy.iri.IRI). On the other side, an instance of `IRI` is created by passing two arguments which are the namespace of the ontology and the remainder 'child'. To declare this new class we need an axiom of type `OWLDeclarationAxiom`. We simply pass the `child_class` to create an -instance of this axiom. The final step is to add this axiom to the ontology using the -[OWLOntologyManager](owlapy.owl_ontology_manager.OWLOntologyManager). We use the `add_axiom` method -of the `manager` to add into the ontology +instance of this axiom. The final step is to add this axiom to the ontology +We use the `add_axiom` method to add into the ontology `onto` the axiom `child_class_declaration_axiom`. #### Add a new Object Property / Data Property @@ -105,12 +104,12 @@ from owlapy.owl_property import OWLObjectProperty, OWLDataProperty # adding the object property 'hasParent' hasParent_op = OWLObjectProperty(IRI('http://example.com/father#', 'hasParent')) hasParent_op_declaration_axiom = OWLDeclarationAxiom(hasParent_op) -manager.add_axiom(onto, hasParent_op_declaration_axiom) +onto.add_axiom(hasParent_op_declaration_axiom) # adding the data property 'hasAge' hasAge_dp = OWLDataProperty(IRI('http://example.com/father#', 'hasAge')) hasAge_dp_declaration_axiom = OWLDeclarationAxiom(hasAge_dp) -manager.add_axiom(onto, hasAge_dp_declaration_axiom) +onto.add_axiom(hasAge_dp_declaration_axiom) ``` See the [owlapy](owlapy) for more OWL entities that you can add as a declaration axiom. @@ -129,7 +128,7 @@ heinz = individuals[1] # get the 2nd individual in the list which is 'heinz' class_assertion_axiom = OWLClassAssertionAxiom(heinz, child_class) -manager.add_axiom(onto, class_assertion_axiom) +onto.add_axiom(class_assertion_axiom) ``` We have used the previous method `individuals_in_signature()` to get all the individuals and converted them to a list, so we can access them by using indexes. In this example, we @@ -137,7 +136,7 @@ want to assert a class axiom for the individual `heinz`. We have used the class `OWLClassAssertionAxiom` where the first argument is the 'individual' `heinz` and the second argument is the 'class_expression'. As the class expression, we used the previously defined class -`child_Class`. Finally, add the axiom by using `add_axiom` method of the [OWLOntologyManager](owlapy.owl_ontology_manager.OWLOntologyManager). +`child_Class`. Finally, add the axiom by using `add_axiom` method of the [OWLOntology](owlapy.owl_ontology.OWLOntology). Let's show one more example using a `OWLDataPropertyAssertionAxiom` to assign the age of 17 to heinz. @@ -151,7 +150,7 @@ from owlapy.owl_axiom import OWLDataPropertyAssertionAxiom literal_17 = OWLLiteral(17) dp_assertion_axiom = OWLDataPropertyAssertionAxiom(heinz, hasAge_dp, literal_17) -manager.add_axiom(onto, dp_assertion_axiom) +onto.add_axiom(dp_assertion_axiom) ``` [OWLLiteral](owlapy.owl_literal.OWLLiteral) is a class that represents the literal values in @@ -167,26 +166,24 @@ assertion axioms that you can use. #### Remove an Axiom -To remove an axiom you can use the `remove_axiom` method of the ontology manager as follows: +To remove an axiom you can use the `remove_axiom` method as follows: ```python -manager.remove_axiom(onto,dp_assertion_axiom) +onto.remove_axiom(dp_assertion_axiom) ``` -The first argument is the ontology you want to remove the axiom from and the second -argument is the axiom you want to remove. +The required argument is the axiom/axioms you want to remove. ## Save an Ontology If you modified an ontology, you may want to save it as a new file. To do this -you can use the `save_ontology` method of the [OWLOntologyManager](owlapy.owl_ontology_manager.OWLOntologyManager). -It requires two arguments, the first is the ontology you want to save and The second -is the IRI of the new ontology. +you can use the `save` method of the [OWLOntology](owlapy.owl_ontology.OWLOntology). +It requires one argument, the IRI of the new ontology. ```python -manager.save_ontology(onto, IRI.create('file:/' + 'test' + '.owl')) +onto.save(IRI.create('file:/' + 'test' + '.owl')) ``` The above line of code will save the ontology `onto` in the file *test.owl* which will be created in the same directory as the file you are running this code. diff --git a/examples/ontology_modification.py b/examples/ontology_modification.py index 9b6ebbe8..577e2c1d 100644 --- a/examples/ontology_modification.py +++ b/examples/ontology_modification.py @@ -18,8 +18,8 @@ # Create a new class new_class = OWLClass(IRI.create('http://example.com/father#child')) -# Add a declaration axiom for this class using ontology manager -manager.add_axiom(ontology=onto, axiom=OWLDeclarationAxiom(new_class)) +# Add a declaration axiom for this class +onto.add_axiom(axiom=OWLDeclarationAxiom(new_class)) # Check whether the new class is added in the signature of the ontology print("------------------------") @@ -27,7 +27,7 @@ # Add an individual of type child in the ontology new_ind = OWLNamedIndividual('http://example.com/father#lulu') -manager.add_axiom(onto, OWLClassAssertionAxiom(new_ind, new_class)) +onto.add_axiom(OWLClassAssertionAxiom(new_ind, new_class)) # Check if Lulu is added @@ -35,7 +35,7 @@ [print(_) for _ in onto.individuals_in_signature()] # Save the modified ontology locally (otherwise the changes will be lost) -manager.save_ontology(ontology=onto, document_iri=IRI.create("file:/../KGs/Family/father_modified.owl")) +onto.save(document_iri=IRI.create("file:/../KGs/Family/father_modified.owl")) # NOTE: using the same name will overwrite the current file with the new one. diff --git a/examples/ontology_reasoning.py b/examples/ontology_reasoning.py index 0f3e09bc..dd12db7f 100644 --- a/examples/ontology_reasoning.py +++ b/examples/ontology_reasoning.py @@ -119,12 +119,12 @@ manager = OntologyManager() onto = manager.load_ontology(IRI.create('file://' + data_file)) -manager.add_axiom(onto, OWLEquivalentObjectPropertiesAxiom([r6, r5])) -manager.add_axiom(onto, OWLEquivalentObjectPropertiesAxiom([r5, r6])) -manager.add_axiom(onto, OWLObjectPropertyDomainAxiom(r1, ST)) +onto.add_axiom(OWLEquivalentObjectPropertiesAxiom([r6, r5])) +onto.add_axiom(OWLEquivalentObjectPropertiesAxiom([r5, r6])) +onto.add_axiom(OWLObjectPropertyDomainAxiom(r1, ST)) -manager.add_axiom(onto, OWLSubClassOfAxiom(R, r5Q)) -manager.add_axiom(onto, OWLSubClassOfAxiom(ST, U)) +onto.add_axiom(OWLSubClassOfAxiom(R, r5Q)) +onto.add_axiom(OWLSubClassOfAxiom(ST, U)) base_reasoner = OntologyReasoner(onto) diff --git a/tests/test_owlapy_fastinstancechecker.py b/tests/test_owlapy_fastinstancechecker.py index f0e98781..ea0e061b 100644 --- a/tests/test_owlapy_fastinstancechecker.py +++ b/tests/test_owlapy_fastinstancechecker.py @@ -296,7 +296,6 @@ class birthDateTime(DataProperty): target_inst = frozenset({markus, heinz}) self.assertEqual(inst, target_inst) - def test_sub_property_inclusion(self): ns = "http://dl-learner.org/mutagenesis#" mgr = OntologyManager() @@ -309,8 +308,8 @@ def test_sub_property_inclusion(self): super_has_structure = OWLObjectProperty(IRI(ns, 'superHasStucture')) charge = OWLDataProperty(IRI(ns, 'charge')) super_charge = OWLDataProperty(IRI.create(ns, 'super_charge')) - mgr.add_axiom(onto, OWLSubObjectPropertyOfAxiom(has_structure, super_has_structure)) - mgr.add_axiom(onto, OWLSubDataPropertyOfAxiom(charge, super_charge)) + onto.add_axiom(OWLSubObjectPropertyOfAxiom(has_structure, super_has_structure)) + onto.add_axiom(OWLSubDataPropertyOfAxiom(charge, super_charge)) # sub_property = True base_reasoner = OntologyReasoner(onto) @@ -340,8 +339,8 @@ def test_sub_property_inclusion(self): individuals = frozenset(reasoner.instances(ce)) self.assertEqual(len(individuals), 0) - mgr.remove_axiom(onto, OWLSubObjectPropertyOfAxiom(has_structure, super_has_structure)) - mgr.remove_axiom(onto, OWLSubDataPropertyOfAxiom(charge, super_charge)) + onto.remove_axiom(OWLSubObjectPropertyOfAxiom(has_structure, super_has_structure)) + onto.remove_axiom(OWLSubDataPropertyOfAxiom(charge, super_charge)) def test_inverse(self): ns = "http://example.com/father#" @@ -350,7 +349,7 @@ def test_inverse(self): has_child = OWLObjectProperty(IRI(ns, 'hasChild')) has_child_inverse = OWLObjectProperty(IRI.create(ns, 'hasChild_inverse')) - mgr.add_axiom(onto, OWLInverseObjectPropertiesAxiom(has_child, has_child_inverse)) + onto.add_axiom(OWLInverseObjectPropertiesAxiom(has_child, has_child_inverse)) parents = {OWLNamedIndividual(IRI.create(ns, 'anna')), OWLNamedIndividual(IRI.create(ns, 'martin')), @@ -367,13 +366,13 @@ def test_inverse(self): self.assertEqual(parents_expr, parents) self.assertEqual(parents_expr_inverse, parents) # Removal not needed, just for completeness - mgr.remove_axiom(onto, OWLInverseObjectPropertiesAxiom(has_child, has_child_inverse)) + onto.remove_axiom(OWLInverseObjectPropertiesAxiom(has_child, has_child_inverse)) # test sub properties super_has_child = OWLObjectProperty(IRI(ns, 'super_hasChild')) - mgr.add_axiom(onto, OWLSubObjectPropertyOfAxiom(has_child, super_has_child)) + onto.add_axiom(OWLSubObjectPropertyOfAxiom(has_child, super_has_child)) super_has_child_inverse = OWLObjectProperty(IRI(ns, 'super_hasChild_inverse')) - mgr.add_axiom(onto, OWLInverseObjectPropertiesAxiom(super_has_child, super_has_child_inverse)) + onto.add_axiom(OWLInverseObjectPropertiesAxiom(super_has_child, super_has_child_inverse)) # False (sub properties not taken into account) expr = OWLObjectSomeValuesFrom(super_has_child, OWLThing) @@ -392,8 +391,8 @@ def test_inverse(self): self.assertEqual(parents_expr, parents) self.assertEqual(parents_expr_inverse, parents) - mgr.remove_axiom(onto, OWLSubObjectPropertyOfAxiom(has_child, super_has_child)) - mgr.remove_axiom(onto, OWLInverseObjectPropertiesAxiom(super_has_child, super_has_child_inverse)) + onto.remove_axiom(OWLSubObjectPropertyOfAxiom(has_child, super_has_child)) + onto.remove_axiom(OWLInverseObjectPropertiesAxiom(super_has_child, super_has_child_inverse)) if __name__ == '__main__': diff --git a/tests/test_owlapy_ontology_management.py b/tests/test_owlapy_ontology_management.py index fefbf0c4..96a3ed9f 100644 --- a/tests/test_owlapy_ontology_management.py +++ b/tests/test_owlapy_ontology_management.py @@ -45,9 +45,9 @@ def test_equivalent_classes(self): compound = OWLClass(IRI(ns, 'Compound')) has_atom = OWLObjectProperty(IRI(ns, 'hasAtom')) - mgr.add_axiom(onto, OWLEquivalentClassesAxiom([OWLObjectUnionOf([atom, bond]), compound, atom, bond])) - mgr.add_axiom(onto, OWLEquivalentClassesAxiom([bond, benzene])) - mgr.add_axiom(onto, OWLEquivalentClassesAxiom([bond, OWLObjectSomeValuesFrom(has_atom, ball3)])) + onto.add_axiom(OWLEquivalentClassesAxiom([OWLObjectUnionOf([atom, bond]), compound, atom, bond])) + onto.add_axiom(OWLEquivalentClassesAxiom([bond, benzene])) + onto.add_axiom(OWLEquivalentClassesAxiom([bond, OWLObjectSomeValuesFrom(has_atom, ball3)])) classes = frozenset({atom, compound, bond}) target_classes = frozenset(reasoner.equivalent_classes(benzene, only_named=True)) @@ -87,9 +87,9 @@ def test_sub_classes(self): benzene = OWLClass(IRI(ns, 'Benzene')) has_atom = OWLObjectProperty(IRI(ns, 'hasAtom')) - mgr.add_axiom(onto, OWLSubClassOfAxiom(benzene, OWLObjectUnionOf([bond, bond]))) - mgr.add_axiom(onto, OWLSubClassOfAxiom(OWLObjectUnionOf([bond, bond]), ball3)) - mgr.add_axiom(onto, OWLSubClassOfAxiom(ball3, OWLObjectSomeValuesFrom(has_atom, ball3))) + onto.add_axiom(OWLSubClassOfAxiom(benzene, OWLObjectUnionOf([bond, bond]))) + onto.add_axiom(OWLSubClassOfAxiom(OWLObjectUnionOf([bond, bond]), ball3)) + onto.add_axiom(OWLSubClassOfAxiom(ball3, OWLObjectSomeValuesFrom(has_atom, ball3))) # Named class # Direct, only named @@ -149,9 +149,9 @@ def test_super_classes(self): ring_structure = OWLClass(IRI(ns, 'RingStructure')) has_atom = OWLObjectProperty(IRI(ns, 'hasAtom')) - mgr.add_axiom(onto, OWLSubClassOfAxiom(OWLObjectSomeValuesFrom(has_atom, ball3), benzene)) - mgr.add_axiom(onto, OWLSubClassOfAxiom(benzene, OWLObjectUnionOf([bond, bond]))) - mgr.add_axiom(onto, OWLSubClassOfAxiom(OWLObjectUnionOf([bond, bond]), ball3)) + onto.add_axiom(OWLSubClassOfAxiom(OWLObjectSomeValuesFrom(has_atom, ball3), benzene)) + onto.add_axiom(OWLSubClassOfAxiom(benzene, OWLObjectUnionOf([bond, bond]))) + onto.add_axiom(OWLSubClassOfAxiom(OWLObjectUnionOf([bond, bond]), ball3)) # Named class # Direct, only named @@ -255,7 +255,7 @@ def test_object_values(self): heinz = OWLNamedIndividual(IRI(ns, 'heinz')) has_child = OWLObjectProperty(IRI.create(ns, 'hasChild')) super_has_child = OWLObjectProperty(IRI.create(ns, 'super_hasChild')) - mgr.add_axiom(onto, OWLSubObjectPropertyOfAxiom(has_child, super_has_child)) + onto.add_axiom(OWLSubObjectPropertyOfAxiom(has_child, super_has_child)) kids = frozenset(reasoner.object_property_values(stefan, has_child)) target_kids = frozenset({markus}) @@ -275,12 +275,12 @@ def test_object_values(self): # test inverse has_child_inverse = OWLObjectProperty(IRI.create(ns, 'hasChild_inverse')) - mgr.add_axiom(onto, OWLInverseObjectPropertiesAxiom(has_child, has_child_inverse)) + onto.add_axiom(OWLInverseObjectPropertiesAxiom(has_child, has_child_inverse)) parents = frozenset(reasoner.object_property_values(markus, OWLObjectInverseOf(has_child), direct=True)) target_parents = frozenset({stefan}) self.assertEqual(target_parents, parents) # Remove again for completeness, would not be necessary - mgr.remove_axiom(onto, OWLInverseObjectPropertiesAxiom(has_child, has_child_inverse)) + onto.remove_axiom(OWLInverseObjectPropertiesAxiom(has_child, has_child_inverse)) # test inverse with sub property # Setup: @@ -288,7 +288,7 @@ def test_object_values(self): # hasChild inverseOf hasChild_inverse # super_hasChild inverseOf super_hasChild_inverse super_has_child_inverse = OWLObjectProperty(IRI.create(ns, 'super_hasChild_inverse')) - mgr.add_axiom(onto, OWLInverseObjectPropertiesAxiom(super_has_child, super_has_child_inverse)) + onto.add_axiom(OWLInverseObjectPropertiesAxiom(super_has_child, super_has_child_inverse)) parents = frozenset(reasoner.object_property_values(stefan, OWLObjectInverseOf(super_has_child_inverse), @@ -301,8 +301,8 @@ def test_object_values(self): direct=False)) target_parents = frozenset({markus}) self.assertEqual(target_parents, parents) - mgr.remove_axiom(onto, OWLInverseObjectPropertiesAxiom(super_has_child, super_has_child_inverse)) - mgr.remove_axiom(onto, OWLSubObjectPropertyOfAxiom(has_child, super_has_child)) + onto.remove_axiom(OWLInverseObjectPropertiesAxiom(super_has_child, super_has_child_inverse)) + onto.remove_axiom(OWLSubObjectPropertyOfAxiom(has_child, super_has_child)) def test_data_values(self): ns = "http://dl-learner.org/mutagenesis#" @@ -314,7 +314,7 @@ def test_data_values(self): d100_1 = OWLNamedIndividual(IRI.create(ns, 'd100_1')) charge = OWLDataProperty(IRI.create(ns, 'charge')) super_charge = OWLDataProperty(IRI.create(ns, 'super_charge')) - mgr.add_axiom(onto, OWLSubDataPropertyOfAxiom(charge, super_charge)) + onto.add_axiom(OWLSubDataPropertyOfAxiom(charge, super_charge)) values = frozenset(reasoner.data_property_values(d100_1, charge)) targets = frozenset({OWLLiteral(-0.128)}) @@ -332,7 +332,7 @@ def test_data_values(self): values = frozenset(reasoner.data_property_values(d100_1, super_charge, direct=True)) targets = frozenset() self.assertEqual(targets, values) - mgr.remove_axiom(onto, OWLSubDataPropertyOfAxiom(charge, super_charge)) + onto.remove_axiom(OWLSubDataPropertyOfAxiom(charge, super_charge)) def test_all_data_values(self): ns = "http://dl-learner.org/mutagenesis#" @@ -343,7 +343,7 @@ def test_all_data_values(self): charge = OWLDataProperty(IRI.create(ns, 'charge')) super_charge = OWLDataProperty(IRI.create(ns, 'super_charge')) - mgr.add_axiom(onto, OWLSubDataPropertyOfAxiom(charge, super_charge)) + onto.add_axiom(OWLSubDataPropertyOfAxiom(charge, super_charge)) values = frozenset(reasoner.all_data_property_values(charge, direct=True)) self.assertEqual(529, len(values)) @@ -353,7 +353,7 @@ def test_all_data_values(self): values = frozenset(reasoner.all_data_property_values(super_charge, direct=False)) self.assertEqual(529, len(values)) - mgr.remove_axiom(onto, OWLSubDataPropertyOfAxiom(charge, super_charge)) + onto.remove_axiom(OWLSubDataPropertyOfAxiom(charge, super_charge)) def test_ind_object_properties(self): ns = "http://example.com/father#" @@ -365,7 +365,7 @@ def test_ind_object_properties(self): stefan = OWLNamedIndividual(IRI.create(ns, 'stefan')) has_child = OWLObjectProperty(IRI.create(ns, 'hasChild')) super_has_child = OWLObjectProperty(IRI.create(ns, 'super_hasChild')) - mgr.add_axiom(onto, OWLSubObjectPropertyOfAxiom(has_child, super_has_child)) + onto.add_axiom(OWLSubObjectPropertyOfAxiom(has_child, super_has_child)) properties = frozenset(reasoner.ind_object_properties(stefan, direct=True)) target_properties = frozenset({has_child}) @@ -374,7 +374,7 @@ def test_ind_object_properties(self): properties = frozenset(reasoner.ind_object_properties(stefan, direct=False)) target_properties = frozenset({has_child, super_has_child}) self.assertEqual(target_properties, properties) - mgr.remove_axiom(onto, OWLSubObjectPropertyOfAxiom(has_child, super_has_child)) + onto.remove_axiom(OWLSubObjectPropertyOfAxiom(has_child, super_has_child)) def test_ind_data_properties(self): ns = "http://dl-learner.org/mutagenesis#" @@ -386,7 +386,7 @@ def test_ind_data_properties(self): d100_1 = OWLNamedIndividual(IRI.create(ns, 'd100_1')) charge = OWLDataProperty(IRI.create(ns, 'charge')) super_charge = OWLDataProperty(IRI.create(ns, 'super_charge')) - mgr.add_axiom(onto, OWLSubDataPropertyOfAxiom(charge, super_charge)) + onto.add_axiom(OWLSubDataPropertyOfAxiom(charge, super_charge)) properties = frozenset(reasoner.ind_data_properties(d100_1, direct=True)) target_properties = frozenset({charge}) @@ -395,7 +395,7 @@ def test_ind_data_properties(self): properties = frozenset(reasoner.ind_data_properties(d100_1, direct=False)) target_properties = frozenset({charge, super_charge}) self.assertEqual(target_properties, properties) - mgr.remove_axiom(onto, OWLSubDataPropertyOfAxiom(charge, super_charge)) + onto.remove_axiom(OWLSubDataPropertyOfAxiom(charge, super_charge)) def test_add_remove_axiom(self): ns = "http://example.com/father#" @@ -423,159 +423,159 @@ def test_add_remove_axiom(self): aerial_animal = OWLClass(IRI(ns, 'aerialAnimal')) self.assertNotIn(sister, list(onto.classes_in_signature())) - mgr.add_axiom(onto, OWLClassAssertionAxiom(anna, sister)) + onto.add_axiom(OWLClassAssertionAxiom(anna, sister)) self.assertIn(sister, list(onto.classes_in_signature())) self.assertIn(anna, list(reasoner.instances(sister))) self.assertIn(sister, list(reasoner.types(anna))) - mgr.remove_axiom(onto, OWLClassAssertionAxiom(anna, sister)) + onto.remove_axiom(OWLClassAssertionAxiom(anna, sister)) self.assertNotIn(anna, list(reasoner.instances(sister))) self.assertNotIn(sister, list(reasoner.types(anna))) self.assertNotIn(michelle, list(reasoner.instances(sister))) - mgr.add_axiom(onto, OWLClassAssertionAxiom(michelle, sister)) + onto.add_axiom(OWLClassAssertionAxiom(michelle, sister)) self.assertIn(michelle, list(reasoner.instances(sister))) self.assertIn(sister, list(reasoner.types(michelle))) - mgr.remove_axiom(onto, OWLClassAssertionAxiom(michelle, sister)) + onto.remove_axiom(OWLClassAssertionAxiom(michelle, sister)) self.assertNotIn(michelle, list(reasoner.instances(sister))) self.assertNotIn(sister, list(reasoner.types(michelle))) self.assertFalse(list(reasoner.object_property_values(michelle, has_child))) - mgr.add_axiom(onto, OWLObjectPropertyAssertionAxiom(michelle, has_child, anna)) + onto.add_axiom(OWLObjectPropertyAssertionAxiom(michelle, has_child, anna)) self.assertIn(anna, list(reasoner.object_property_values(michelle, has_child))) - mgr.remove_axiom(onto, OWLObjectPropertyAssertionAxiom(michelle, has_child, anna)) + onto.remove_axiom(OWLObjectPropertyAssertionAxiom(michelle, has_child, anna)) self.assertNotIn(anna, list(reasoner.object_property_values(michelle, has_child))) - mgr.remove_axiom(onto, OWLObjectPropertyAssertionAxiom(michelle, has_child, anna)) + onto.remove_axiom(OWLObjectPropertyAssertionAxiom(michelle, has_child, anna)) self.assertNotIn(has_sibling, list(onto.object_properties_in_signature())) self.assertNotIn(marius, list(onto.individuals_in_signature())) - mgr.add_axiom(onto, OWLObjectPropertyAssertionAxiom(marius, has_sibling, michelle)) + onto.add_axiom(OWLObjectPropertyAssertionAxiom(marius, has_sibling, michelle)) self.assertIn(has_sibling, list(onto.object_properties_in_signature())) self.assertIn(marius, list(onto.individuals_in_signature())) self.assertIn(michelle, list(reasoner.object_property_values(marius, has_sibling))) - mgr.remove_axiom(onto, OWLObjectPropertyAssertionAxiom(marius, has_sibling, michelle)) + onto.remove_axiom(OWLObjectPropertyAssertionAxiom(marius, has_sibling, michelle)) self.assertNotIn(michelle, list(reasoner.object_property_values(marius, has_sibling))) self.assertNotIn(age, list(onto.data_properties_in_signature())) - mgr.add_axiom(onto, OWLDataPropertyAssertionAxiom(markus, age, OWLLiteral(30))) + onto.add_axiom(OWLDataPropertyAssertionAxiom(markus, age, OWLLiteral(30))) self.assertIn(age, list(onto.data_properties_in_signature())) self.assertIn(OWLLiteral(30), list(reasoner.data_property_values(markus, age))) - mgr.remove_axiom(onto, OWLDataPropertyAssertionAxiom(markus, age, OWLLiteral(30))) + onto.remove_axiom(OWLDataPropertyAssertionAxiom(markus, age, OWLLiteral(30))) self.assertNotIn(OWLLiteral(30), list(reasoner.data_property_values(markus, age))) self.assertNotIn(OWLLiteral(31), list(reasoner.data_property_values(anna, age))) - mgr.add_axiom(onto, OWLDataPropertyAssertionAxiom(anna, age, OWLLiteral(31))) + onto.add_axiom(OWLDataPropertyAssertionAxiom(anna, age, OWLLiteral(31))) self.assertIn(OWLLiteral(31), list(reasoner.data_property_values(anna, age))) - mgr.remove_axiom(onto, OWLDataPropertyAssertionAxiom(anna, age, OWLLiteral(31))) + onto.remove_axiom(OWLDataPropertyAssertionAxiom(anna, age, OWLLiteral(31))) self.assertNotIn(OWLLiteral(31), list(reasoner.data_property_values(anna, age))) self.assertNotIn(brother, list(onto.classes_in_signature())) self.assertNotIn(animal, list(onto.classes_in_signature())) self.assertNotIn(aerial_animal, list(onto.classes_in_signature())) - mgr.add_axiom(onto, OWLSubClassOfAxiom(brother, male)) - mgr.add_axiom(onto, OWLSubClassOfAxiom(aerial_animal, animal)) + onto.add_axiom(OWLSubClassOfAxiom(brother, male)) + onto.add_axiom(OWLSubClassOfAxiom(aerial_animal, animal)) self.assertIn(brother, list(reasoner.sub_classes(male))) self.assertIn(aerial_animal, list(reasoner.sub_classes(animal))) self.assertIn(male, list(reasoner.super_classes(brother))) self.assertIn(animal, list(reasoner.super_classes(aerial_animal))) - mgr.remove_axiom(onto, OWLSubClassOfAxiom(brother, male)) + onto.remove_axiom(OWLSubClassOfAxiom(brother, male)) self.assertNotIn(brother, list(reasoner.sub_classes(male))) self.assertNotIn(male, list(reasoner.super_classes(brother))) self.assertNotIn(has_sibling, list(reasoner.sub_object_properties(has_child))) - mgr.add_axiom(onto, OWLSubObjectPropertyOfAxiom(has_sibling, has_child)) + onto.add_axiom(OWLSubObjectPropertyOfAxiom(has_sibling, has_child)) self.assertIn(has_sibling, list(reasoner.sub_object_properties(has_child))) - mgr.remove_axiom(onto, OWLSubObjectPropertyOfAxiom(has_sibling, has_child)) + onto.remove_axiom(OWLSubObjectPropertyOfAxiom(has_sibling, has_child)) self.assertNotIn(has_sibling, list(reasoner.sub_object_properties(has_child))) self.assertNotIn(OWLObjectUnionOf([person, person_sibling]), list(reasoner.object_property_domains(has_sibling))) - mgr.add_axiom(onto, OWLObjectPropertyDomainAxiom(has_sibling, OWLObjectUnionOf([person, person_sibling]))) + onto.add_axiom(OWLObjectPropertyDomainAxiom(has_sibling, OWLObjectUnionOf([person, person_sibling]))) self.assertIn(OWLObjectUnionOf([person, person_sibling]), list(reasoner.object_property_domains(has_sibling, direct=True))) - mgr.remove_axiom(onto, OWLObjectPropertyDomainAxiom(has_sibling, OWLObjectUnionOf([person, person_sibling]))) + onto.remove_axiom(OWLObjectPropertyDomainAxiom(has_sibling, OWLObjectUnionOf([person, person_sibling]))) self.assertNotIn(OWLObjectUnionOf([person, person_sibling]), list(reasoner.object_property_domains(has_sibling, direct=True))) self.assertNotIn(sister, list(reasoner.object_property_ranges(has_sibling))) - mgr.add_axiom(onto, OWLObjectPropertyRangeAxiom(has_sibling, sister)) + onto.add_axiom(OWLObjectPropertyRangeAxiom(has_sibling, sister)) self.assertIn(sister, list(reasoner.object_property_ranges(has_sibling))) - mgr.remove_axiom(onto, OWLObjectPropertyRangeAxiom(has_sibling, sister)) + onto.remove_axiom(OWLObjectPropertyRangeAxiom(has_sibling, sister)) self.assertNotIn(sister, list(reasoner.object_property_ranges(has_sibling))) self.assertNotIn(person, list(reasoner.data_property_domains(age))) - mgr.add_axiom(onto, OWLDataPropertyDomainAxiom(age, person)) + onto.add_axiom(OWLDataPropertyDomainAxiom(age, person)) self.assertIn(person, list(reasoner.data_property_domains(age))) - mgr.remove_axiom(onto, OWLDataPropertyDomainAxiom(age, person)) + onto.remove_axiom(OWLDataPropertyDomainAxiom(age, person)) self.assertNotIn(person, list(reasoner.data_property_domains(age))) self.assertFalse(list(reasoner.data_property_ranges(age))) - mgr.add_axiom(onto, OWLDataPropertyRangeAxiom(age, OWLDataUnionOf([IntegerOWLDatatype, DateOWLDatatype]))) + onto.add_axiom(OWLDataPropertyRangeAxiom(age, OWLDataUnionOf([IntegerOWLDatatype, DateOWLDatatype]))) self.assertIn(OWLDataUnionOf([IntegerOWLDatatype, DateOWLDatatype]), list(reasoner.data_property_ranges(age))) - mgr.remove_axiom(onto, OWLDataPropertyRangeAxiom(age, OWLDataUnionOf([IntegerOWLDatatype, DateOWLDatatype]))) + onto.remove_axiom(OWLDataPropertyRangeAxiom(age, OWLDataUnionOf([IntegerOWLDatatype, DateOWLDatatype]))) self.assertNotIn(OWLDataUnionOf([IntegerOWLDatatype, DateOWLDatatype]), list(reasoner.data_property_ranges(age))) self.assertFalse(list(reasoner.equivalent_classes(brother))) - mgr.add_axiom(onto, OWLEquivalentClassesAxiom([brother, male])) + onto.add_axiom(OWLEquivalentClassesAxiom([brother, male])) self.assertIn(male, list(reasoner.equivalent_classes(brother))) - mgr.remove_axiom(onto, OWLEquivalentClassesAxiom([brother, male])) + onto.remove_axiom(OWLEquivalentClassesAxiom([brother, male])) self.assertNotIn(male, list(reasoner.equivalent_classes(brother))) self.assertFalse(list(reasoner.equivalent_object_properties(has_child))) - mgr.add_axiom(onto, OWLEquivalentObjectPropertiesAxiom([has_child, has_sibling])) + onto.add_axiom(OWLEquivalentObjectPropertiesAxiom([has_child, has_sibling])) self.assertIn(has_sibling, list(reasoner.equivalent_object_properties(has_child))) - mgr.remove_axiom(onto, OWLEquivalentObjectPropertiesAxiom([has_child, has_sibling])) + onto.remove_axiom(OWLEquivalentObjectPropertiesAxiom([has_child, has_sibling])) self.assertNotIn(has_sibling, list(reasoner.equivalent_object_properties(has_child))) self.assertFalse(list(reasoner.equivalent_data_properties(age))) - mgr.add_axiom(onto, OWLEquivalentDataPropertiesAxiom([age, test1])) + onto.add_axiom(OWLEquivalentDataPropertiesAxiom([age, test1])) self.assertIn(test1, list(reasoner.equivalent_data_properties(age))) - mgr.remove_axiom(onto, OWLEquivalentDataPropertiesAxiom([age, test1])) + onto.remove_axiom(OWLEquivalentDataPropertiesAxiom([age, test1])) self.assertNotIn(test1, list(reasoner.equivalent_data_properties(age))) self.assertFalse(list(reasoner.same_individuals(markus))) - mgr.add_axiom(onto, OWLSameIndividualAxiom([markus, anna, person1])) + onto.add_axiom(OWLSameIndividualAxiom([markus, anna, person1])) self.assertEqual({anna, person1}, set(reasoner.same_individuals(markus))) - mgr.remove_axiom(onto, OWLSameIndividualAxiom([markus, anna, person1])) + onto.remove_axiom(OWLSameIndividualAxiom([markus, anna, person1])) self.assertFalse(set(reasoner.same_individuals(markus))) self.assertFalse(list(reasoner.disjoint_classes(brother))) self.assertFalse(list(reasoner.disjoint_classes(person))) - mgr.add_axiom(onto, OWLDisjointClassesAxiom([brother, sister, aerial_animal])) + onto.add_axiom(OWLDisjointClassesAxiom([brother, sister, aerial_animal])) self.assertEqual({sister, aerial_animal}, set(reasoner.disjoint_classes(brother))) - mgr.remove_axiom(onto, OWLDisjointClassesAxiom([brother, sister, aerial_animal])) + onto.remove_axiom(OWLDisjointClassesAxiom([brother, sister, aerial_animal])) self.assertFalse(set(reasoner.disjoint_classes(brother))) - mgr.add_axiom(onto, OWLDisjointClassesAxiom([person, animal])) + onto.add_axiom(OWLDisjointClassesAxiom([person, animal])) self.assertEqual({animal, aerial_animal}, set(reasoner.disjoint_classes(person))) - mgr.remove_axiom(onto, OWLDisjointClassesAxiom([person, animal])) + onto.remove_axiom(OWLDisjointClassesAxiom([person, animal])) self.assertFalse(set(reasoner.disjoint_classes(person))) self.assertFalse(list(reasoner.disjoint_object_properties(has_sibling))) self.assertFalse(list(reasoner.disjoint_object_properties(has_child))) - mgr.add_axiom(onto, OWLDisjointObjectPropertiesAxiom([has_child, has_sibling])) + onto.add_axiom(OWLDisjointObjectPropertiesAxiom([has_child, has_sibling])) self.assertIn(has_sibling, set(reasoner.disjoint_object_properties(has_child))) self.assertIn(has_child, set(reasoner.disjoint_object_properties(has_sibling))) - mgr.remove_axiom(onto, OWLDisjointObjectPropertiesAxiom([has_child, has_sibling])) + onto.remove_axiom(OWLDisjointObjectPropertiesAxiom([has_child, has_sibling])) self.assertNotIn(has_sibling, set(reasoner.disjoint_object_properties(has_child))) self.assertNotIn(has_child, set(reasoner.disjoint_object_properties(has_sibling))) self.assertFalse(list(reasoner.disjoint_data_properties(age))) self.assertFalse(list(reasoner.disjoint_data_properties(test1))) - mgr.add_axiom(onto, OWLDisjointDataPropertiesAxiom([age, test1])) + onto.add_axiom(OWLDisjointDataPropertiesAxiom([age, test1])) self.assertIn(test1, set(reasoner.disjoint_data_properties(age))) self.assertIn(age, set(reasoner.disjoint_data_properties(test1))) - mgr.remove_axiom(onto, OWLDisjointDataPropertiesAxiom([age, test1])) + onto.remove_axiom(OWLDisjointDataPropertiesAxiom([age, test1])) self.assertNotIn(test1, set(reasoner.disjoint_data_properties(age))) self.assertNotIn(age, set(reasoner.disjoint_data_properties(test1))) self.assertFalse(list(reasoner.different_individuals(markus))) self.assertFalse(list(reasoner.different_individuals(michelle))) - mgr.add_axiom(onto, OWLDifferentIndividualsAxiom([markus, michelle])) - mgr.add_axiom(onto, OWLDifferentIndividualsAxiom([markus, anna, marius])) + onto.add_axiom(OWLDifferentIndividualsAxiom([markus, michelle])) + onto.add_axiom(OWLDifferentIndividualsAxiom([markus, anna, marius])) self.assertEqual({michelle, anna, marius}, set(reasoner.different_individuals(markus))) self.assertEqual({markus}, set(reasoner.different_individuals(michelle))) - mgr.remove_axiom(onto, OWLDifferentIndividualsAxiom([markus, michelle])) - mgr.remove_axiom(onto, OWLDifferentIndividualsAxiom([markus, anna, marius])) + onto.remove_axiom(OWLDifferentIndividualsAxiom([markus, michelle])) + onto.remove_axiom(OWLDifferentIndividualsAxiom([markus, anna, marius])) self.assertFalse(set(reasoner.different_individuals(markus))) self.assertFalse(set(reasoner.different_individuals(michelle))) diff --git a/tests/test_sync_reasoner.py b/tests/test_sync_reasoner.py index 86c9d69e..316497ca 100644 --- a/tests/test_sync_reasoner.py +++ b/tests/test_sync_reasoner.py @@ -90,13 +90,13 @@ def test_inconsistency_check(self): carbon230 = OWLClass(IRI.create(self.ns, "Carbon-230")) axiom = OWLDisjointClassesAxiom([self.nitrogen38, carbon230]) - manager.add_axiom(onto, axiom) + onto.add_axiom(axiom) new_individual = OWLNamedIndividual(IRI.create(self.ns, "testIndividual")) - manager.add_axiom(onto, OWLDeclarationAxiom(new_individual)) - manager.add_axiom(onto, OWLClassAssertionAxiom(new_individual, self.nitrogen38)) - manager.add_axiom(onto, OWLClassAssertionAxiom(new_individual, carbon230)) + onto.add_axiom(OWLDeclarationAxiom(new_individual)) + onto.add_axiom(OWLClassAssertionAxiom(new_individual, self.nitrogen38)) + onto.add_axiom(OWLClassAssertionAxiom(new_individual, carbon230)) - manager.save_ontology(onto, IRI.create("file:/test.owl")) + onto.save(IRI.create("file:/test.owl")) reasoner = SyncReasoner("test.owl") self.assertEqual(reasoner.has_consistent_ontology(), False) os.remove("test.owl") From ed6ceb5e8d258a457208240bd9336f845dc2c145 Mon Sep 17 00:00:00 2001 From: Alkid Date: Wed, 28 Aug 2024 15:27:01 +0200 Subject: [PATCH 27/44] updated README --- README.md | 49 ++++++++++++++++++++++++++++++++----------------- 1 file changed, 32 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index 56c1d08d..3f4c24a5 100644 --- a/README.md +++ b/README.md @@ -38,21 +38,34 @@ pytest -p no:warnings -x # Running 102 tests takes ~ 1 min from owlapy.class_expression import OWLClass, OWLObjectIntersectionOf, OWLObjectSomeValuesFrom from owlapy.owl_property import OWLObjectProperty from owlapy import owl_expression_to_sparql, owl_expression_to_dl +from owlapy.owl_ontology_manager import OntologyManager +from owlapy.owl_axiom import OWLDeclarationAxiom, OWLClassAssertionAxiom +from owlapy.owl_individual import OWLNamedIndividual, IRI -# Create the male class +# Using owl classes to create a complex class expression male = OWLClass("http://example.com/society#male") -# Create an object property using the iri as a string for 'hasChild' property. hasChild = OWLObjectProperty("http://example.com/society#hasChild") -# Create an existential restrictions hasChild_male = OWLObjectSomeValuesFrom(hasChild, male) -# Let's make it more complex by intersecting with another class teacher = OWLClass("http://example.com/society#teacher") teacher_that_hasChild_male = OWLObjectIntersectionOf([hasChild_male, teacher]) -# You can render and print owl class expressions in description logics syntax (and vice-versa) -print(owl_expression_to_dl(teacher_that_hasChild_male)) -# (∃ hasChild.male) ⊓ teacher -print(owl_expression_to_sparql(teacher_that_hasChild_male)) -# SELECT DISTINCT ?x WHERE { ?x ?s_1 . ?s_1 a . ?x a . } } + +# You can render and print owl class expressions in Description Logics syntax or convert it to SPARQL for example. +print(owl_expression_to_dl(teacher_that_hasChild_male)) # (∃ hasChild.male) ⊓ teacher +print(owl_expression_to_sparql(teacher_that_hasChild_male)) # SELECT DISTINCT ?x WHERE { ?x ?s_1 . ?s_1 a . ?x a . } } + +# Create an Ontology, add the axioms and save the Ontology. +manager = OntologyManager() +new_iri = IRI.create("file:/example_ontology.owl") +ontology = manager.create_ontology(new_iri) + +john = OWLNamedIndividual("http://example.com/society#john") +male_declaration_axiom = OWLDeclarationAxiom(male) +hasChild_declaration_axiom = OWLDeclarationAxiom(hasChild) +john_declaration_axiom = OWLDeclarationAxiom(john) +john_a_male_assertion_axiom = OWLClassAssertionAxiom(john, male) +ontology.add_axiom([male_declaration_axiom, hasChild_declaration_axiom, john_declaration_axiom, john_a_male_assertion_axiom]) +ontology.save() + ``` Every OWL object that can be used to classify individuals, is considered a class expression and @@ -73,18 +86,19 @@ OWL objects in [owlapy api](https://dice-group.github.io/owlapy/autoapi/owlapy/i ```python from owlapy.owl_ontology_manager import OntologyManager -from owlapy.owlapi_adaptor import OWLAPIAdaptor +from owlapy.owl_reasoner import SyncReasoner +from owlapy.static_funcs import stopJVM ontology_path = "KGs/Family/family-benchmark_rich_background.owl" # Available OWL Reasoners: 'HermiT', 'Pellet', 'JFact', 'Openllet' -owlapi_adaptor = OWLAPIAdaptor(path=ontology_path, name_reasoner="Pellet") +reasoner = SyncReasoner(ontology = ontology_path, reasoner="Pellet") onto = OntologyManager().load_ontology(ontology_path) # Iterate over defined owl Classes in the signature for i in onto.classes_in_signature(): # Performing type inference with Pellet - instances=owlapi_adaptor.instances(i,direct=False) + instances=sync_reasoner.instances(i,direct=False) print(f"Class:{i}\t Num instances:{len(instances)}") -owlapi_adaptor.stopJVM() +stopJVM() ``` @@ -95,11 +109,12 @@ owlapi_adaptor.stopJVM() An Ontology can be enriched by inferring many different axioms. ```python -from owlapy.owlapi_adaptor import OWLAPIAdaptor +from owlapy.owl_reasoner import SyncReasoner +from owlapy.static_funcs import stopJVM -adaptor = OWLAPIAdaptor(path="KGs/Family/family-benchmark_rich_background.owl", name_reasoner="Pellet") +sync_reasoner = SyncReasoner(ontology="KGs/Family/family-benchmark_rich_background.owl", reasoner="Pellet") # Infer missing class assertions -adaptor.infer_axioms_and_save(output_path="KGs/Family/inferred_family-benchmark_rich_background.ttl", +sync_reasoner.infer_axioms_and_save(output_path="KGs/Family/inferred_family-benchmark_rich_background.ttl", output_format="ttl", inference_types=[ "InferredClassAssertionAxiomGenerator", @@ -108,7 +123,7 @@ adaptor.infer_axioms_and_save(output_path="KGs/Family/inferred_family-benchmark_ "InferredSubClassAxiomGenerator", "InferredInverseObjectPropertiesAxiomGenerator", "InferredEquivalentClassAxiomGenerator"]) -adaptor.stopJVM() +stopJVM() ``` From 99315fdfe02908deeb86330a74f5d7d012ea6751 Mon Sep 17 00:00:00 2001 From: Caglar Demir Date: Fri, 30 Aug 2024 11:52:42 +0200 Subject: [PATCH 28/44] A script to show that OWL Reasoners return the same retrieval results in different runtimes --- examples/owl_reasoners.py | 124 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 124 insertions(+) create mode 100644 examples/owl_reasoners.py diff --git a/examples/owl_reasoners.py b/examples/owl_reasoners.py new file mode 100644 index 00000000..2c031628 --- /dev/null +++ b/examples/owl_reasoners.py @@ -0,0 +1,124 @@ +""" A script to show that OWL Reasoners return the same retrieval results in different runtimes """ +import time +from owlapy.class_expression import * +from owlapy.owl_ontology_manager import OntologyManager +from owlapy.owlapi_adaptor import OWLAPIAdaptor +from owlapy.class_expression import OWLObjectMaxCardinality +from owlapy.utils import concept_reducer_properties + +import matplotlib.pyplot as plt +import seaborn as sns +import numpy as np + +ontology_path = "../KGs/Family/family-benchmark_rich_background.owl" + +owl_reasoners = dict() +owl_reasoners["HermiT"] = OWLAPIAdaptor(path=ontology_path, name_reasoner="HermiT") +owl_reasoners["Pellet"] = OWLAPIAdaptor(path=ontology_path, name_reasoner="Pellet") +owl_reasoners["JFact"] = OWLAPIAdaptor(path=ontology_path, name_reasoner="JFact") +owl_reasoners["Openllet"] = OWLAPIAdaptor(path=ontology_path, name_reasoner="Openllet") +onto = OntologyManager().load_ontology(ontology_path) +c: OWLClass +################################################################### +# GENERATE ALCQ CONCEPTS TO EVALUATE RETRIEVAL PERFORMANCES +# (3) R: Extract object properties. +object_properties = {i for i in onto.object_properties_in_signature()} +# (4) R⁻: Inverse of object properties. +object_properties_inverse = {i.get_inverse_property() for i in object_properties} +# (5) R*: R UNION R⁻. +object_properties_and_inverse = object_properties.union(object_properties_inverse) +# (6) NC: Named owl concepts. +nc = {i for i in onto.classes_in_signature()} +# (7) NC⁻: Complement of NC. +nnc = {i.get_object_complement_of() for i in nc} +# (8) \exist r. C s.t. C \in NC and r \in R* . +exist_nc = concept_reducer_properties( + concepts=nc, + properties=object_properties_and_inverse, + cls=OWLObjectSomeValuesFrom) +# (9) \forall r. C s.t. C \in NC and r \in R* . +forall_nc = concept_reducer_properties( + concepts=nc, + properties=object_properties_and_inverse, + cls=OWLObjectAllValuesFrom, +) + + +def eval_reasoners(iter_owl_exp, mapping): + print("Number of expressions:", len(iter_owl_exp)) + results = dict() + runtime_results = dict() + for c in iter_owl_exp: + for name_i, reasoner_i in mapping.items(): + start_time_i = time.time() + result_reasoner_i = {i.str for i in reasoner_i.instances(c)} + runtime_results.setdefault(name_i, []).append(time.time() - start_time_i) + for name_j, reasoner_j in mapping.items(): + if name_i == name_j: + continue # Skip self-comparison + start_time_j = time.time() + result_reasoner_j = {i.str for i in reasoner_j.instances(c)} + runtime_results.setdefault(name_i, []).append(time.time() - start_time_j) + # Compute intersection and union + size_intersection = len(result_reasoner_i.intersection(result_reasoner_j)) + size_of_union = len(result_reasoner_i.union(result_reasoner_j)) + + # Compute Jaccard similarity + sim = 1.0 if size_of_union == 0 else size_intersection / size_of_union + results.setdefault(name_i, {}).setdefault(name_j, []).append(sim) + # Calculate average runtime for each reasoner + average_runtime = {name: sum(times) / len(times) for name, times in runtime_results.items()} + return results, average_runtime + + +def plot_runtimes(average_runtime, title='Average Runtime of OWL Reasoners'): + # Plotting the bar plot + plt.bar(average_runtime.keys(), average_runtime.values(), color='skyblue') + plt.title(title) + plt.ylabel('Average Runtime (seconds)') + plt.xticks(rotation=45) + max_rt = max(average_runtime.values()) + plt.ylim(0, max_rt * 1.1) + plt.tight_layout() + # Display the plot + plt.show() + + +def plot_similarity_btw_reasoners(results): + # Compute average Jaccard similarity for each pair of reasoners + average_jaccard = {name_i: {name_j: sum(sim_list) / len(sim_list) for name_j, sim_list in comparisons.items()} for + name_i, comparisons in results.items()} + + # Convert the dictionary into a matrix for heatmap plotting + reasoners = list(owl_reasoners.keys()) + matrix = np.zeros((len(reasoners), len(reasoners))) + + for i, name_i in enumerate(reasoners): + for j, name_j in enumerate(reasoners): + if name_i == name_j: + matrix[i][j] = 1.0 + else: + matrix[i][j] = average_jaccard.get(name_i, {}).get(name_j, 0.0) + + # Plotting the heatmap + sns.heatmap(matrix, xticklabels=reasoners, yticklabels=reasoners, annot=True, cmap="coolwarm", cbar=True, vmin=0, + vmax=1) + plt.title('Jaccard Similarity Between OWL Reasoners') + plt.xlabel('Reasoner') + plt.ylabel('Reasoner') + plt.show() + + +# EVAL Named Concepts +similarity_results, average_runtime_owl_reasoners = eval_reasoners(nc, owl_reasoners) +plot_similarity_btw_reasoners(similarity_results) +plot_runtimes(average_runtime_owl_reasoners, title="Avg Runtime of Reasoners on Named Concepts") +# EVAL Negated Concepts +similarity_results, average_runtime_owl_reasoners = eval_reasoners(nnc, owl_reasoners) +plot_similarity_btw_reasoners(similarity_results) +plot_runtimes(average_runtime_owl_reasoners, title="Avg Runtime of Reasoners on Negated Named Concepts") + +# EVAL Exist R. NC +similarity_results, average_runtime_owl_reasoners = eval_reasoners(exist_nc, owl_reasoners) +plot_similarity_btw_reasoners(similarity_results) +plot_runtimes(average_runtime_owl_reasoners, title="Avg Runtime of Reasoners on OWLObjectSomeValuesFrom") From c29c235d19ea3bf58ffc75e2ecea5e635323158e Mon Sep 17 00:00:00 2001 From: Caglar Demir Date: Fri, 30 Aug 2024 11:53:02 +0200 Subject: [PATCH 29/44] two helper functions are edded --- owlapy/utils.py | 56 ++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 55 insertions(+), 1 deletion(-) diff --git a/owlapy/utils.py b/owlapy/utils.py index 945da589..6a81a8fc 100644 --- a/owlapy/utils.py +++ b/owlapy/utils.py @@ -14,12 +14,66 @@ OWLDataAllValuesFrom, OWLDataSomeValuesFrom, OWLObjectAllValuesFrom, \ OWLDataOneOf, OWLObjectIntersectionOf, \ OWLDataCardinalityRestriction, OWLNaryBooleanClassExpression, OWLObjectUnionOf, \ - OWLObjectHasValue, OWLDatatypeRestriction, OWLFacetRestriction, OWLObjectOneOf + OWLObjectHasValue, OWLDatatypeRestriction, OWLFacetRestriction, OWLObjectOneOf, OWLQuantifiedObjectRestriction from .owl_data_ranges import OWLDataComplementOf, OWLDataUnionOf, OWLDataIntersectionOf, OWLNaryDataRange, OWLDataRange, \ OWLPropertyRange from .owl_object import OWLObject from .owl_datatype import OWLDatatype +def concept_reducer(concepts:Iterable, opt:Callable): + """ + Reduces a set of concepts by applying a binary operation to each pair of concepts. + + Args: + concepts (set): A set of concepts to be reduced. + opt (function): A binary function that takes a pair of concepts and returns a single concept. + + Returns: + set: A set containing the results of applying the binary operation to each pair of concepts. + + Example: + >>> concepts = {1, 2, 3} + >>> opt = lambda x: x[0] + x[1] + >>> concept_reducer(concepts, opt) + {2, 3, 4, 5, 6} + + Note: + The operation `opt` should be commutative and associative to ensure meaningful reduction in the context of set operations. + """ + result = set() + for i in concepts: + for j in concepts: + result.add(opt((i, j))) + return result + +def concept_reducer_properties( + concepts: Iterable, properties, cls: Callable = None, cardinality: int = 2 +) -> Iterable[Union[OWLQuantifiedObjectRestriction, OWLObjectCardinalityRestriction]]: + """ + Map a set of owl concepts and a set of properties into OWL Restrictions + + Args: + concepts: + properties: + cls (Callable): An owl Restriction class + cardinality: A positive Integer + + Returns: List of OWL Restrictions + + """ + assert isinstance(concepts, Iterable), "Concepts must be an Iterable" + assert isinstance(properties, Iterable), "properties must be an Iterable" + assert isinstance(cls, Callable), "cls must be an Callable" + assert cardinality > 0 + result = set() + for i in concepts: + for j in properties: + if cls == OWLObjectMinCardinality or cls == OWLObjectMaxCardinality: + result.add(cls(cardinality=cardinality, property=j, filler=i)) + continue + result.add(cls(j, i)) + return result + class OWLClassExpressionLengthMetric: """Length calculation of OWLClassExpression From 55797981329a5c1e485287e90bc06fe07fe53c4b Mon Sep 17 00:00:00 2001 From: Caglar Demir Date: Fri, 30 Aug 2024 11:53:34 +0200 Subject: [PATCH 30/44] A Todo added for the owl class --- owlapy/class_expression/owl_class.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/owlapy/class_expression/owl_class.py b/owlapy/class_expression/owl_class.py index c006e481..fd821f45 100644 --- a/owlapy/class_expression/owl_class.py +++ b/owlapy/class_expression/owl_class.py @@ -52,6 +52,9 @@ def is_owl_nothing(self) -> bool: return self._is_nothing def get_object_complement_of(self) -> OWLObjectComplementOf: + # TODO: CD: get_object_complement_of is not correct term. + # TODO: CD : we might want to use get_complement_of instead + # documented in parent return OWLObjectComplementOf(self) From 31ad8dd367f52d9553b7c33b1fa24d55b3723377 Mon Sep 17 00:00:00 2001 From: Alkid Date: Mon, 2 Sep 2024 15:41:34 +0200 Subject: [PATCH 31/44] updated abstract and base classes --- owlapy/owl_ontology.py | 14 +++++++++ owlapy/owl_ontology_manager.py | 55 +++++++++++++--------------------- 2 files changed, 35 insertions(+), 34 deletions(-) diff --git a/owlapy/owl_ontology.py b/owlapy/owl_ontology.py index 62cae3ed..ebd4389a 100644 --- a/owlapy/owl_ontology.py +++ b/owlapy/owl_ontology.py @@ -260,6 +260,7 @@ def is_anonymous(self) -> bool: """Check whether this ontology does contain an IRI or not.""" return self.get_ontology_id().is_anonymous() + @abstractmethod def add_axiom(self, axiom: Union[OWLAxiom, Iterable[OWLAxiom]]): """Add the specified axiom/axioms to the ontology. @@ -271,6 +272,7 @@ def add_axiom(self, axiom: Union[OWLAxiom, Iterable[OWLAxiom]]): """ pass + @abstractmethod def remove_axiom(self, axiom: Union[OWLAxiom, Iterable[OWLAxiom]]): """Removes the specified axiom/axioms to the ontology. @@ -1174,6 +1176,18 @@ def get_owlapi_ontology(self): def get_ontology_id(self) -> OWLOntologyID: return self.mapper.map_(self.owlapi_ontology.getOntologyID()) + def add_axiom(self, axiom: Union[OWLAxiom, Iterable[OWLAxiom]]): + if isinstance(axiom, OWLAxiom): + self.owlapi_ontology.addAxiom(self.mapper.map_(axiom)) + else: + self.owlapi_ontology.addAxioms(self.mapper.map_(axiom)) + + def remove_axiom(self, axiom: Union[OWLAxiom, Iterable[OWLAxiom]]): + if isinstance(axiom, OWLAxiom): + self.owlapi_ontology.removeAxiom(self.mapper.map_(axiom)) + else: + self.owlapi_ontology.removeAxioms(self.mapper.map_(axiom)) + def __eq__(self, other): if isinstance(other, SyncOntology): return other.owlapi_ontology.getOntologyID().equals(other.owlapi_ontology.getOntologyID()) diff --git a/owlapy/owl_ontology_manager.py b/owlapy/owl_ontology_manager.py index 7604115e..2475d623 100644 --- a/owlapy/owl_ontology_manager.py +++ b/owlapy/owl_ontology_manager.py @@ -1,33 +1,12 @@ from abc import ABCMeta, abstractmethod -from functools import singledispatch -from itertools import islice, combinations -import types -from typing import cast, Union +from typing import Union import jpype import owlready2 from owlapy.iri import IRI from owlapy.meta_classes import HasIRI -from owlapy.owl_object import OWLObject -from owlready2 import destroy_entity, AllDisjoint, AllDifferent, GeneralClassAxiom -from owlapy.class_expression import OWLThing, OWLClass, \ - OWLQuantifiedDataRestriction, OWLDataHasValue, OWLNaryBooleanClassExpression, OWLObjectOneOf, OWLObjectComplementOf, \ - OWLObjectHasValue, OWLQuantifiedObjectRestriction -from owlapy.owl_axiom import OWLObjectPropertyRangeAxiom, OWLAxiom, OWLSubClassOfAxiom, OWLEquivalentClassesAxiom, \ - OWLDisjointUnionAxiom, OWLAnnotationAssertionAxiom, OWLAnnotationProperty, OWLSubPropertyAxiom, \ - OWLPropertyRangeAxiom, OWLClassAssertionAxiom, OWLDeclarationAxiom, OWLObjectPropertyAssertionAxiom, \ - OWLSymmetricObjectPropertyAxiom, OWLTransitiveObjectPropertyAxiom, OWLPropertyDomainAxiom, \ - OWLAsymmetricObjectPropertyAxiom, OWLDataPropertyCharacteristicAxiom, OWLFunctionalDataPropertyAxiom, \ - OWLReflexiveObjectPropertyAxiom, OWLDataPropertyAssertionAxiom, OWLFunctionalObjectPropertyAxiom, \ - OWLObjectPropertyCharacteristicAxiom, OWLIrreflexiveObjectPropertyAxiom, OWLInverseFunctionalObjectPropertyAxiom, \ - OWLDisjointDataPropertiesAxiom, OWLDisjointObjectPropertiesAxiom, OWLEquivalentDataPropertiesAxiom, \ - OWLEquivalentObjectPropertiesAxiom, OWLInverseObjectPropertiesAxiom, OWLNaryPropertyAxiom, OWLNaryIndividualAxiom, \ - OWLDifferentIndividualsAxiom, OWLDisjointClassesAxiom, OWLSameIndividualAxiom -from owlapy.owl_individual import OWLNamedIndividual, OWLIndividual -from owlapy.owl_ontology import OWLOntology, Ontology, ToOwlready2, SyncOntology -from owlapy.owl_property import OWLDataProperty, OWLObjectInverseOf, OWLObjectProperty, \ - OWLProperty +from owlapy.owl_ontology import OWLOntology, Ontology, SyncOntology from owlapy.static_funcs import startJVM @@ -55,25 +34,25 @@ class OWLOntologyManager(metaclass=ABCMeta): ontologies.""" @abstractmethod - def create_ontology(self, iri: IRI) -> OWLOntology: + def create_ontology(self, iri: Union[str, IRI]) -> OWLOntology: """Creates a new (empty) ontology that that has the specified ontology IRI (and no version IRI). Args: - iri: The IRI of the ontology to be created. + iri: The IRI of the ontology to be created, can also be a string. Returns: - The newly created ontology, or if an ontology with the specified IRI already exists then this existing - ontology will be returned. + The newly created ontology. """ pass @abstractmethod - def load_ontology(self, iri: IRI) -> OWLOntology: + def load_ontology(self, iri: Union[IRI, str]) -> OWLOntology: """Loads an ontology that is assumed to have the specified ontology IRI as its IRI or version IRI. The ontology IRI will be mapped to an ontology document IRI. Args: - iri: The IRI that identifies the ontology. It is expected that the ontology will also have this IRI + iri: The IRI that identifies the ontology, can also be a string. + It is expected that the ontology will also have this IRI (although the OWL API should tolerate situations where this is not the case). Returns: @@ -173,7 +152,7 @@ def create_ontology(self, iri: Union[str, IRI] = None) -> Ontology: assert isinstance(iri, IRI), "iri either must be string or an instance of IRI Class" return Ontology(self, iri, load=False) - def load_ontology(self, iri: Union[str, IRI] = None) -> Ontology: + def load_ontology(self, iri: Union[IRI, str] = None) -> Ontology: if isinstance(iri, str): iri = IRI.create(iri) else: @@ -196,7 +175,8 @@ def save_world(self): self._world.save() -class SyncOntologyManager: +class SyncOntologyManager(OWLOntologyManager): + # WARN: Do not move local imports to top of the module def __init__(self): if not jpype.isJVMStarted(): @@ -204,11 +184,18 @@ def __init__(self): from org.semanticweb.owlapi.apibinding import OWLManager self.owlapi_manager = OWLManager.createOWLOntologyManager() - def create_ontology(self, iri: IRI) -> SyncOntology: + def create_ontology(self, iri: Union[IRI, str]) -> SyncOntology: + if isinstance(iri, str): + iri = IRI.create(iri) + else: + assert isinstance(iri, IRI), "iri either must be string or an instance of IRI Class" return SyncOntology(self, iri, new=True) - def load_ontology(self, path: Union[IRI,str]) -> SyncOntology: - return SyncOntology(self, path, new=False) + def load_ontology(self, iri: Union[IRI, str]) -> SyncOntology: + return SyncOntology(self, iri, new=False) def get_owlapi_manager(self): return self.owlapi_manager + + def apply_change(self, change: OWLOntologyChange): + raise NotImplementedError() From 4ad2677bb580efeb80a3dd2cb38fe7fd4c087949 Mon Sep 17 00:00:00 2001 From: Alkid Date: Tue, 3 Sep 2024 15:15:28 +0200 Subject: [PATCH 32/44] updated documentation for owlapi synchronization --- docs/usage/owlapi_adaptor.md | 119 +++++++++++++++++++++++------------ 1 file changed, 79 insertions(+), 40 deletions(-) diff --git a/docs/usage/owlapi_adaptor.md b/docs/usage/owlapi_adaptor.md index 3cfb288a..ded4b81e 100644 --- a/docs/usage/owlapi_adaptor.md +++ b/docs/usage/owlapi_adaptor.md @@ -1,62 +1,101 @@ -# Owlapi Adaptor +# Owlapi Synchronization -As mentioned earlier, owlapy is loosely based in [owlapi](https://github.com/owlcs/owlapi), +As mentioned earlier, _owlapy_ is loosely based in [_owlapi_](https://github.com/owlcs/owlapi), a library for ontology modification in java. -We have created [OWLAPIAdaptor](owlapy.owlapi_adaptor.OWLAPIAdaptor), -an adaptor class that facilitates the conversion of -owl class expressions from owlapy to owlapi and vice-versa. -This adaptor is still considered experimental, and it's in the -initial phase of development. +We have created [OWLAPIMapper](owlapy.owlapi_mapper.OWLAPIMapper), +a mapping class that makes possible the conversion of the most +important classes from _owlapy_ to _owlapi_ and vice-versa. + We are able to use owlapi via [Jpype](https://jpype.readthedocs.io/en/latest/), -a python module that provides access to Java via python. To start executing -Java code via jpype, one needs to start the java virtual machine (JVM). -This is automatically done when initializing a `OWLAPIAdaptor` object. +a python module that provides access to Java in python. To start executing +Java code via Jpype, one needs to start the java virtual machine (JVM). +You don't have to worry about it, because if a class is going to use +`OWLAPIMapper` the JVM will start automatically. However, there is the +function `startJVM` of the `static_functions.py` module if you ever need +to start it manually. + +## "Sync" Classes + +With the addition of the `OWLAPIMapper`, we introduce three new classes: +- [SyncOntologyManager](owlapy.owl_ontology_manager.SyncOntologyManager) +- [SyncOntology](owlapy.owl_ontology.SyncOntology) +- [SyncReasoner](owlapy.owl_reasoner.SyncReasoner) + +All the logic of these three classes is handled by _owlapi_ through the +mapper. They inherit from abstract classes already present in owlapy +(`OWLOntologyManager`, `OWLOntology` and `OWLReasoner` respectively) so +the usage is the same as other implementors of these abstract classes. +However, there are also some extra methods, like `infer_axioms` of SyncReasoner +which infers the missing axioms from the given ontology and returns them as `Iterable[OWLAxiom]`. +Make sure to check the API docs to see them all. + +To make this guide self-contained, we will go through a simple example +showing how to use this above-mentioned classes: -## Initialization +```python +from owlapy.owl_ontology_manager import SyncOntologyManager +from owlapy.owl_axiom import OWLDeclarationAxiom +from owlapy.class_expression import OWLClass +from owlapy.owl_reasoner import SyncReasoner +from owlapy.static_funcs import stopJVM -To use the adaptor you have to start the JVM via jpype, which is done automatically -when you create an _OWLAPIAdaptor_ object. After you are finished you can stop -the JVM by either using `jpype.shutdownJVM()` or the static method from the -adaptor `stopJVM()`. This will free the resources used by JPype and the java -packages. +# (.) Creat a manager and load the 'father' ontology +manager = SyncOntologyManager() +ontology = manager.load_ontology("KGs/Family/father.owl") -```python -from owlapy.owlapi_adaptor import OWLAPIAdaptor +# (.) Use your ontology as you usually do +# (..) Add a new class +ontology.add_axiom(OWLDeclarationAxiom(OWLClass("http://example.com/father#some_new_class"))) +# (..) Print classes in signature +[print(cls) for cls in ontology.classes_in_signature()] + +# (.) Create a reasoner and perform some reasoning +reasoner = SyncReasoner(ontology) + +# (..) Check ontology consistency +print(f"Is the ontology consistent? Answer: {reasoner.has_consistent_ontology()}") + +# (..) Print all male individuals +[print(ind) for ind in reasoner.instances(OWLClass("http://example.com/father#male"))] + +# (.) Stop the JVM if you no longer intend to use "Sync" classes +stopJVM() -adaptor = OWLAPIAdaptor("KGs/Family/father.owl") -# Use the adaptor -print(f"Is the ontology consistent? {adaptor.has_consistent_ontology()}") -# Stop the JVM -adaptor.stopJVM() ``` +This was a simple example using the '_father_' ontology to show +just a small part of what you can do with "Sync" classes. -In the above code snipped, we created an adaptor for the father ontology -by passing the local path of that ontology. Then we print whether -the ontology is consistent or not. +Notice that after we are done using them we can stop +the JVM by either using `jpype.shutdownJVM()` or the static function from the +`static_functions.py` module `stopJVM()`. This will free the resources used by JPype and the java +packages. Once you stop the JVM it cannot be restarted so make sure you do that +when you are done with the owlapi related classes. Stopping the JVM is not +strictly necessary. The resources will be freed once the execution is over, but +in case your code is somehow longer and the "Sync" classes only make up a part of your execution +then you can stop the JVM after it not being needed anymore. -## Notes -An important note is that when initialising the adaptor you are basically -starting a JVM in the background, and therefore you are able to import and -use java classes as you would do in python. That means that you can -play around with owlapi code in python as long as your JVM is started. -Isn't that awesome! +## Notes -`OWLAPIAdaptor` uses HermiT reasoner by default. You can choose between: -"HermiT", "Pellet", "JFact" and "Openllet". +An important thing to keep in mind is that when starting the JVM +you are able to import and use java classes as you would do in python (thanks to Jpype). +That means that you can play around with owlapi code in python as long +as your JVM is started. Isn't that awesome! -You can use the reasoning method directly from the adaptor but -for classes that require an [OWLReasoner](owlapi.owl_reasoner.OWLReasoner) -you can use [SyncReasoner](https://dice-group.github.io/owlapy/autoapi/owlapy/owl_reasoner/index.html#owlapy.owl_reasoner.SyncReasoner). +`SyncReasoner` uses HermiT reasoner by default. You can choose between: +"HermiT", "Pellet", "JFact" and "Openllet". Although no significant +difference is noticed between these reasoners, they surely differentiate +in specific scenarios. You can check owlapi [Wiki](https://github.com/owlcs/owlapi/wiki) for more references. _**owlapi version**: 5.1.9_ ## Examples -You can check a usage example in the [_examples_](https://github.com/dice-group/owlapy/tree/develop/examples) folder. +You can see usage examples in the [_examples_](https://github.com/dice-group/owlapy/tree/develop/examples) folder. -[Test cases](https://github.com/dice-group/owlapy/tree/develop/tests) for the adaptor can also serve as an example, so you can -check that out as well. +[Test cases](https://github.com/dice-group/owlapy/tree/develop/tests) +can also serve as an example, so you can +check them out as well. From 6200ad46e59d36e2504cd648dec62c3000ed6606 Mon Sep 17 00:00:00 2001 From: Alkid Date: Wed, 4 Sep 2024 10:34:43 +0200 Subject: [PATCH 33/44] added test from develop --- tests/test_sync_reasoner.py | 32 +++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/tests/test_sync_reasoner.py b/tests/test_sync_reasoner.py index 316497ca..2e32d217 100644 --- a/tests/test_sync_reasoner.py +++ b/tests/test_sync_reasoner.py @@ -2,7 +2,8 @@ import unittest from jpype import JDouble -from owlapy.class_expression import OWLClass, OWLDataSomeValuesFrom, OWLObjectIntersectionOf, OWLNothing, OWLThing +from owlapy.class_expression import OWLClass, OWLDataSomeValuesFrom, OWLObjectIntersectionOf, OWLNothing, OWLThing, \ + OWLClassExpression from owlapy.iri import IRI from owlapy.owl_axiom import OWLDisjointClassesAxiom, OWLDeclarationAxiom, OWLClassAssertionAxiom, OWLSubClassOfAxiom, \ OWLEquivalentClassesAxiom, OWLSubDataPropertyOfAxiom, OWLSubObjectPropertyOfAxiom @@ -84,6 +85,35 @@ class TestSyncReasoner(unittest.TestCase): def test_consistency_check(self): self.assertEqual(self.reasoner.has_consistent_ontology(), True) + def test_named_concepts(self): + + ontology_path = "KGs/Family/family-benchmark_rich_background.owl" + + # Available OWL Reasoners: 'HermiT', 'Pellet', 'JFact', 'Openllet' + owl_reasoners = dict() + owl_reasoners["HermiT"] = SyncReasoner(ontology=ontology_path, reasoner="HermiT") + owl_reasoners["Pellet"] = SyncReasoner(ontology=ontology_path, reasoner="Pellet") + owl_reasoners["JFact"] = SyncReasoner(ontology=ontology_path, reasoner="JFact") + owl_reasoners["Openllet"] = SyncReasoner(ontology=ontology_path, reasoner="Openllet") + + onto = OntologyManager().load_ontology(ontology_path) + + def compute_agreements(i: OWLClassExpression, verbose=False): + if verbose: + print(f"Computing agreements between Reasoners on {i}...") + retrieval_result = None + flag = False + for __, reasoner in owl_reasoners.items(): + if retrieval_result: + flag = retrieval_result == {_.str for _ in reasoner.instances(i)} + else: + retrieval_result = {_.str for _ in reasoner.instances(i)} + return flag + + # Agreement between instances over + for i in onto.classes_in_signature(): + assert compute_agreements(i, True) + def test_inconsistency_check(self): manager = OntologyManager() onto = manager.load_ontology(IRI.create(self.ontology_path)) From 5bca8f8da601265d7ca4f8bade80d64d059ace06 Mon Sep 17 00:00:00 2001 From: Alkid Date: Wed, 4 Sep 2024 10:46:37 +0200 Subject: [PATCH 34/44] updated example --- examples/owl_reasoners.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/examples/owl_reasoners.py b/examples/owl_reasoners.py index 2c031628..90584e24 100644 --- a/examples/owl_reasoners.py +++ b/examples/owl_reasoners.py @@ -1,9 +1,9 @@ """ A script to show that OWL Reasoners return the same retrieval results in different runtimes """ import time -from owlapy.class_expression import * + +from owlapy.class_expression import OWLClass, OWLObjectSomeValuesFrom, OWLObjectAllValuesFrom from owlapy.owl_ontology_manager import OntologyManager -from owlapy.owlapi_adaptor import OWLAPIAdaptor -from owlapy.class_expression import OWLObjectMaxCardinality +from owlapy.owl_reasoner import SyncReasoner from owlapy.utils import concept_reducer_properties import matplotlib.pyplot as plt @@ -13,10 +13,10 @@ ontology_path = "../KGs/Family/family-benchmark_rich_background.owl" owl_reasoners = dict() -owl_reasoners["HermiT"] = OWLAPIAdaptor(path=ontology_path, name_reasoner="HermiT") -owl_reasoners["Pellet"] = OWLAPIAdaptor(path=ontology_path, name_reasoner="Pellet") -owl_reasoners["JFact"] = OWLAPIAdaptor(path=ontology_path, name_reasoner="JFact") -owl_reasoners["Openllet"] = OWLAPIAdaptor(path=ontology_path, name_reasoner="Openllet") +owl_reasoners["HermiT"] = SyncReasoner(ontology=ontology_path, reasoner="HermiT") +owl_reasoners["Pellet"] = SyncReasoner(ontology=ontology_path, reasoner="Pellet") +owl_reasoners["JFact"] = SyncReasoner(ontology=ontology_path, reasoner="JFact") +owl_reasoners["Openllet"] = SyncReasoner(ontology=ontology_path, reasoner="Openllet") onto = OntologyManager().load_ontology(ontology_path) c: OWLClass ################################################################### From c12c3a7b37000cb7c6a1199237ca9e11b65efd8c Mon Sep 17 00:00:00 2001 From: Alkid Date: Wed, 4 Sep 2024 15:05:47 +0200 Subject: [PATCH 35/44] moved reasoner abstract classes to new module --- owlapy/abstracts/abstract_owl_reasoner.py | 462 ++++++++++++++++++++++ owlapy/owl_hierarchy.py | 2 +- owlapy/owl_reasoner.py | 454 +-------------------- owlapy/render.py | 2 +- 4 files changed, 468 insertions(+), 452 deletions(-) create mode 100644 owlapy/abstracts/abstract_owl_reasoner.py diff --git a/owlapy/abstracts/abstract_owl_reasoner.py b/owlapy/abstracts/abstract_owl_reasoner.py new file mode 100644 index 00000000..8b7bcd07 --- /dev/null +++ b/owlapy/abstracts/abstract_owl_reasoner.py @@ -0,0 +1,462 @@ +"""OWL Reasoner""" +from abc import ABCMeta, abstractmethod +from typing import Iterable + + +from owlapy.class_expression import OWLClassExpression +from owlapy.class_expression import OWLClass +from owlapy.owl_data_ranges import OWLDataRange +from owlapy.owl_object import OWLEntity +from owlapy.owl_ontology import OWLOntology +from owlapy.owl_property import OWLObjectPropertyExpression, OWLDataProperty, OWLObjectProperty +from owlapy.owl_individual import OWLNamedIndividual +from owlapy.owl_literal import OWLLiteral + + +class OWLReasoner(metaclass=ABCMeta): + """An OWLReasoner reasons over a set of axioms (the set of reasoner axioms) that is based on the imports closure of + a particular ontology - the "root" ontology.""" + __slots__ = () + + @abstractmethod + def __init__(self, ontology: OWLOntology): + pass + + @abstractmethod + def data_property_domains(self, pe: OWLDataProperty, direct: bool = False) -> Iterable[OWLClassExpression]: + """Gets the class expressions that are the direct or indirect domains of this property with respect to the + imports closure of the root ontology. + + Args: + pe: The property expression whose domains are to be retrieved. + direct: Specifies if the direct domains should be retrieved (True), or if all domains should be retrieved + (False). + + Returns: + :Let N = equivalent_classes(DataSomeValuesFrom(pe rdfs:Literal)). If direct is True: then if N is not + empty then the return value is N, else the return value is the result of + super_classes(DataSomeValuesFrom(pe rdfs:Literal), true). If direct is False: then the result of + super_classes(DataSomeValuesFrom(pe rdfs:Literal), false) together with N if N is non-empty. + (Note, rdfs:Literal is the top datatype). + """ + pass + + @abstractmethod + def object_property_domains(self, pe: OWLObjectProperty, direct: bool = False) -> Iterable[OWLClassExpression]: + """Gets the class expressions that are the direct or indirect domains of this property with respect to the + imports closure of the root ontology. + + Args: + pe: The property expression whose domains are to be retrieved. + direct: Specifies if the direct domains should be retrieved (True), or if all domains should be retrieved + (False). + + Returns: + :Let N = equivalent_classes(ObjectSomeValuesFrom(pe owl:Thing)). If direct is True: then if N is not empty + then the return value is N, else the return value is the result of + super_classes(ObjectSomeValuesFrom(pe owl:Thing), true). If direct is False: then the result of + super_classes(ObjectSomeValuesFrom(pe owl:Thing), false) together with N if N is non-empty. + """ + pass + + @abstractmethod + def object_property_ranges(self, pe: OWLObjectProperty, direct: bool = False) -> Iterable[OWLClassExpression]: + """Gets the class expressions that are the direct or indirect ranges of this property with respect to the + imports closure of the root ontology. + + Args: + pe: The property expression whose ranges are to be retrieved. + direct: Specifies if the direct ranges should be retrieved (True), or if all ranges should be retrieved + (False). + + Returns: + :Let N = equivalent_classes(ObjectSomeValuesFrom(ObjectInverseOf(pe) owl:Thing)). If direct is True: then + if N is not empty then the return value is N, else the return value is the result of + super_classes(ObjectSomeValuesFrom(ObjectInverseOf(pe) owl:Thing), true). If direct is False: then + the result of super_classes(ObjectSomeValuesFrom(ObjectInverseOf(pe) owl:Thing), false) together with N + if N is non-empty. + """ + pass + + @abstractmethod + def equivalent_classes(self, ce: OWLClassExpression, only_named: bool = True) -> Iterable[OWLClassExpression]: + """Gets the class expressions that are equivalent to the specified class expression with respect to the set of + reasoner axioms. + + Args: + ce: The class expression whose equivalent classes are to be retrieved. + only_named: Whether to only retrieve named equivalent classes or also complex class expressions. + + Returns: + All class expressions C where the root ontology imports closure entails EquivalentClasses(ce C). If ce is + not a class name (i.e. it is an anonymous class expression) and there are no such classes C then there will + be no result. If ce is unsatisfiable with respect to the set of reasoner axioms then owl:Nothing, i.e. the + bottom node, will be returned. + """ + pass + + @abstractmethod + def disjoint_classes(self, ce: OWLClassExpression, only_named: bool = True) -> Iterable[OWLClassExpression]: + """Gets the class expressions that are disjoint with specified class expression with respect to the set of + reasoner axioms. + + Args: + ce: The class expression whose disjoint classes are to be retrieved. + only_named: Whether to only retrieve named disjoint classes or also complex class expressions. + + Returns: + All class expressions D where the set of reasoner axioms entails EquivalentClasses(D ObjectComplementOf(ce)) + or StrictSubClassOf(D ObjectComplementOf(ce)). + """ + pass + + @abstractmethod + def different_individuals(self, ind: OWLNamedIndividual) -> Iterable[OWLNamedIndividual]: + """Gets the individuals that are different from the specified individual with respect to the set of + reasoner axioms. + + Args: + ind: The individual whose different individuals are to be retrieved. + + Returns: + All individuals x where the set of reasoner axioms entails DifferentIndividuals(ind x). + """ + pass + + @abstractmethod + def same_individuals(self, ind: OWLNamedIndividual) -> Iterable[OWLNamedIndividual]: + """Gets the individuals that are the same as the specified individual with respect to the set of + reasoner axioms. + + Args: + ind: The individual whose same individuals are to be retrieved. + + Returns: + All individuals x where the root ontology imports closure entails SameIndividual(ind x). + """ + pass + + @abstractmethod + def equivalent_object_properties(self, op: OWLObjectPropertyExpression) -> Iterable[OWLObjectPropertyExpression]: + """Gets the simplified object properties that are equivalent to the specified object property with respect + to the set of reasoner axioms. + + Args: + op: The object property whose equivalent object properties are to be retrieved. + + Returns: + All simplified object properties e where the root ontology imports closure entails + EquivalentObjectProperties(op e). If op is unsatisfiable with respect to the set of reasoner axioms + then owl:bottomDataProperty will be returned. + """ + pass + + @abstractmethod + def equivalent_data_properties(self, dp: OWLDataProperty) -> Iterable[OWLDataProperty]: + """Gets the data properties that are equivalent to the specified data property with respect to the set of + reasoner axioms. + + Args: + dp: The data property whose equivalent data properties are to be retrieved. + + Returns: + All data properties e where the root ontology imports closure entails EquivalentDataProperties(dp e). + If dp is unsatisfiable with respect to the set of reasoner axioms then owl:bottomDataProperty will + be returned. + """ + pass + + @abstractmethod + def data_property_values(self, e: OWLEntity, pe: OWLDataProperty, direct: bool = True) \ + -> Iterable['OWLLiteral']: + """Gets the data property values for the specified entity and data property expression. + + Args: + e: The owl entity (usually an individual) that is the subject of the data property values. + pe: The data property expression whose values are to be retrieved for the specified entity. + direct: Specifies if the direct values should be retrieved (True), or if all values should be retrieved + (False), so that sub properties are taken into account. + + Note: Can be used to get values, for example, of 'label' property of owl entities such as classes and properties + too (not only individuals). + + Returns: + A set of OWLLiterals containing literals such that for each literal l in the set, the set of reasoner + axioms entails DataPropertyAssertion(pe ind l). + """ + pass + + @abstractmethod + def object_property_values(self, ind: OWLNamedIndividual, pe: OWLObjectPropertyExpression, direct: bool = True) \ + -> Iterable[OWLNamedIndividual]: + """Gets the object property values for the specified individual and object property expression. + + Args: + ind: The individual that is the subject of the object property values. + pe: The object property expression whose values are to be retrieved for the specified individual. + direct: Specifies if the direct values should be retrieved (True), or if all values should be retrieved + (False), so that sub properties are taken into account. + + Returns: + The named individuals such that for each individual j, the set of reasoner axioms entails + ObjectPropertyAssertion(pe ind j). + """ + pass + + @abstractmethod + def instances(self, ce: OWLClassExpression, direct: bool = False) -> Iterable[OWLNamedIndividual]: + """Gets the individuals which are instances of the specified class expression. + + Args: + ce: The class expression whose instances are to be retrieved. + direct: Specifies if the direct instances should be retrieved (True), or if all instances should be + retrieved (False). + + Returns: + If direct is True, each named individual j where the set of reasoner axioms entails + DirectClassAssertion(ce, j). If direct is False, each named individual j where the set of reasoner axioms + entails ClassAssertion(ce, j). If ce is unsatisfiable with respect to the set of reasoner axioms then + nothing returned. + """ + pass + + @abstractmethod + def sub_classes(self, ce: OWLClassExpression, direct: bool = False, only_named: bool = True) \ + -> Iterable[OWLClassExpression]: + """Gets the set of named classes that are the strict (potentially direct) subclasses of the specified class + expression with respect to the reasoner axioms. + + Args: + ce: The class expression whose strict (direct) subclasses are to be retrieved. + direct: Specifies if the direct subclasses should be retrieved (True) or if the all subclasses + (descendant) classes should be retrieved (False). + only_named: Whether to only retrieve named sub-classes or also complex class expressions. + + Returns: + If direct is True, each class C where reasoner axioms entails DirectSubClassOf(C, ce). If direct is False, + each class C where reasoner axioms entails StrictSubClassOf(C, ce). If ce is equivalent to owl:Nothing then + nothing will be returned. + """ + pass + + @abstractmethod + def disjoint_object_properties(self, op: OWLObjectPropertyExpression) -> Iterable[OWLObjectPropertyExpression]: + """Gets the simplified object properties that are disjoint with the specified object property with respect + to the set of reasoner axioms. + + Args: + op: The object property whose disjoint object properties are to be retrieved. + + Returns: + All simplified object properties e where the root ontology imports closure entails + EquivalentObjectProperties(e ObjectPropertyComplementOf(op)) or + StrictSubObjectPropertyOf(e ObjectPropertyComplementOf(op)). + """ + pass + + @abstractmethod + def disjoint_data_properties(self, dp: OWLDataProperty) -> Iterable[OWLDataProperty]: + """Gets the data properties that are disjoint with the specified data property with respect + to the set of reasoner axioms. + + Args: + dp: The data property whose disjoint data properties are to be retrieved. + + Returns: + All data properties e where the root ontology imports closure entails + EquivalentDataProperties(e DataPropertyComplementOf(dp)) or + StrictSubDataPropertyOf(e DataPropertyComplementOf(dp)). + """ + pass + + @abstractmethod + def sub_data_properties(self, dp: OWLDataProperty, direct: bool = False) -> Iterable[OWLDataProperty]: + """Gets the set of named data properties that are the strict (potentially direct) subproperties of the + specified data property expression with respect to the imports closure of the root ontology. + + Args: + dp: The data property whose strict (direct) subproperties are to be retrieved. + direct: Specifies if the direct subproperties should be retrieved (True) or if the all subproperties + (descendants) should be retrieved (False). + + Returns: + If direct is True, each property P where the set of reasoner axioms entails DirectSubDataPropertyOf(P, pe). + If direct is False, each property P where the set of reasoner axioms entails + StrictSubDataPropertyOf(P, pe). If pe is equivalent to owl:bottomDataProperty then nothing will be + returned. + """ + pass + + @abstractmethod + def super_data_properties(self, dp: OWLDataProperty, direct: bool = False) -> Iterable[OWLDataProperty]: + """Gets the stream of data properties that are the strict (potentially direct) super properties of the + specified data property with respect to the imports closure of the root ontology. + + Args: + dp (OWLDataProperty): The data property whose super properties are to be retrieved. + direct (bool): Specifies if the direct super properties should be retrieved (True) or if the all + super properties (ancestors) should be retrieved (False). + + Returns: + Iterable of super properties. + """ + pass + + @abstractmethod + def sub_object_properties(self, op: OWLObjectPropertyExpression, direct: bool = False) \ + -> Iterable[OWLObjectPropertyExpression]: + """Gets the stream of simplified object property expressions that are the strict (potentially direct) + subproperties of the specified object property expression with respect to the imports closure of the root + ontology. + + Args: + op: The object property expression whose strict (direct) subproperties are to be retrieved. + direct: Specifies if the direct subproperties should be retrieved (True) or if the all subproperties + (descendants) should be retrieved (False). + + Returns: + If direct is True, simplified object property expressions, such that for each simplified object property + expression, P, the set of reasoner axioms entails DirectSubObjectPropertyOf(P, pe). + If direct is False, simplified object property expressions, such that for each simplified object property + expression, P, the set of reasoner axioms entails StrictSubObjectPropertyOf(P, pe). + If pe is equivalent to owl:bottomObjectProperty then nothing will be returned. + """ + pass + + @abstractmethod + def super_object_properties(self, op: OWLObjectPropertyExpression, direct: bool = False) \ + -> Iterable[OWLObjectPropertyExpression]: + """Gets the stream of object properties that are the strict (potentially direct) super properties of the + specified object property with respect to the imports closure of the root ontology. + + Args: + op (OWLObjectPropertyExpression): The object property expression whose super properties are to be + retrieved. + direct (bool): Specifies if the direct super properties should be retrieved (True) or if the all + super properties (ancestors) should be retrieved (False). + + Returns: + Iterable of super properties. + """ + pass + + @abstractmethod + def types(self, ind: OWLNamedIndividual, direct: bool = False) -> Iterable[OWLClass]: + """Gets the named classes which are (potentially direct) types of the specified named individual. + + Args: + ind: The individual whose types are to be retrieved. + direct: Specifies if the direct types should be retrieved (True), or if all types should be retrieved + (False). + + Returns: + If direct is True, each named class C where the set of reasoner axioms entails + DirectClassAssertion(C, ind). If direct is False, each named class C where the set of reasoner axioms + entails ClassAssertion(C, ind). + """ + pass + + @abstractmethod + def get_root_ontology(self) -> OWLOntology: + """Gets the "root" ontology that is loaded into this reasoner. The reasoner takes into account the axioms in + this ontology and its import's closure.""" + pass + + @abstractmethod + def super_classes(self, ce: OWLClassExpression, direct: bool = False, only_named: bool = True) \ + -> Iterable[OWLClassExpression]: + """Gets the stream of named classes that are the strict (potentially direct) super classes of the specified + class expression with respect to the imports closure of the root ontology. + + Args: + ce: The class expression whose strict (direct) super classes are to be retrieved. + direct: Specifies if the direct super classes should be retrieved (True) or if the all super classes + (ancestors) classes should be retrieved (False). + only_named: Whether to only retrieve named super classes or also complex class expressions. + + Returns: + If direct is True, each class C where the set of reasoner axioms entails DirectSubClassOf(ce, C). + If direct is False, each class C where set of reasoner axioms entails StrictSubClassOf(ce, C). + If ce is equivalent to owl:Thing then nothing will be returned. + """ + pass +class OWLReasonerEx(OWLReasoner, metaclass=ABCMeta): + """Extra convenience methods for OWL Reasoners""" + + # default + def data_property_ranges(self, pe: OWLDataProperty, direct: bool = False) -> Iterable[OWLDataRange]: + """Gets the data ranges that are the direct or indirect ranges of this property with respect to the imports + closure of the root ontology. + + Args: + pe: The property expression whose ranges are to be retrieved. + direct: Specifies if the direct ranges should be retrieved (True), or if all ranges should be retrieved + (False). + + Returns: + """ + for ax in self.get_root_ontology().data_property_range_axioms(pe): + yield ax.get_range() + if not direct: + logger.warning("indirect not implemented") + # TODO: + + # default + def all_data_property_values(self, pe: OWLDataProperty, direct: bool = True) -> Iterable[OWLLiteral]: + """Gets all values for the given data property expression that appear in the knowledge base. + + Args: + pe: The data property expression whose values are to be retrieved + direct: Specifies if only the direct values of the data property pe should be retrieved (True), or if + the values of sub properties of pe should be taken into account (False). + + Returns: + A set of OWLLiterals containing literals such that for each literal l in the set, the set of reasoner + axioms entails DataPropertyAssertion(pe ind l) for any ind. + """ + onto = self.get_root_ontology() + for ind in onto.individuals_in_signature(): + for lit in self.data_property_values(ind, pe, direct): + yield lit + + # default + def ind_data_properties(self, ind: OWLNamedIndividual, direct: bool = True) -> Iterable[OWLDataProperty]: + """Gets all data properties for the given individual that appear in the knowledge base. + + Args: + ind: The named individual whose data properties are to be retrieved + direct: Specifies if the direct data properties should be retrieved (True), or if all + data properties should be retrieved (False), so that sub properties are taken into account. + + Returns: + All data properties pe where the set of reasoner axioms entails DataPropertyAssertion(pe ind l) + for atleast one l. + """ + onto = self.get_root_ontology() + for dp in onto.data_properties_in_signature(): + try: + next(iter(self.data_property_values(ind, dp, direct))) + yield dp + except StopIteration: + pass + + # default + def ind_object_properties(self, ind: OWLNamedIndividual, direct: bool = True) -> Iterable[OWLObjectProperty]: + """Gets all object properties for the given individual that appear in the knowledge base. + + Args: + ind: The named individual whose object properties are to be retrieved + direct: Specifies if the direct object properties should be retrieved (True), or if all + object properties should be retrieved (False), so that sub properties are taken into account. + + Returns: + All data properties pe where the set of reasoner axioms entails ObjectPropertyAssertion(pe ind ind2) + for atleast one ind2. + """ + onto = self.get_root_ontology() + for op in onto.object_properties_in_signature(): + try: + next(iter(self.object_property_values(ind, op, direct))) + yield op + except StopIteration: + pass \ No newline at end of file diff --git a/owlapy/owl_hierarchy.py b/owlapy/owl_hierarchy.py index 108e35db..3cc2b8be 100644 --- a/owlapy/owl_hierarchy.py +++ b/owlapy/owl_hierarchy.py @@ -9,7 +9,7 @@ from owlapy.meta_classes import HasIRI from owlapy.owl_literal import OWLTopObjectProperty, OWLBottomObjectProperty, OWLTopDataProperty, OWLBottomDataProperty from owlapy.owl_property import OWLObjectProperty, OWLDataProperty -from owlapy.owl_reasoner import OWLReasoner +from owlapy.abstracts.abstract_owl_reasoner import OWLReasoner _S = TypeVar('_S', bound=HasIRI) #: _U = TypeVar('_U', bound='AbstractHierarchy') #: diff --git a/owlapy/owl_reasoner.py b/owlapy/owl_reasoner.py index e9e7ff24..9c2b708f 100644 --- a/owlapy/owl_reasoner.py +++ b/owlapy/owl_reasoner.py @@ -1,14 +1,13 @@ """OWL Reasoner""" import operator -from abc import ABCMeta, abstractmethod +import logging +import owlready2 + from collections import defaultdict from functools import singledispatchmethod, reduce from itertools import chain, repeat from types import MappingProxyType, FunctionType from typing import DefaultDict, Iterable, Dict, Mapping, Set, Type, TypeVar, Optional, FrozenSet, List, Union -import logging - -import owlready2 from owlapy.class_expression import OWLClassExpression, OWLObjectSomeValuesFrom, OWLObjectUnionOf, \ OWLObjectIntersectionOf, OWLObjectComplementOf, OWLObjectAllValuesFrom, OWLObjectOneOf, OWLObjectHasValue, \ @@ -28,6 +27,7 @@ from owlapy.owl_individual import OWLNamedIndividual from owlapy.owl_literal import OWLLiteral from owlapy.utils import LRUCache +from owlapy.abstracts.abstract_owl_reasoner import OWLReasoner, OWLReasonerEx logger = logging.getLogger(__name__) @@ -37,453 +37,7 @@ # TODO:CD: An instance cannot be created from those classes. # TODO:CD: We should move those Abstract Base Classes into a respective package, e.g. # TODO:CD: owlapy/abstract_owl_reasoner/abstract_owl_reasoner.py should contain OWLReasoner and OWLReasonerEx -class OWLReasoner(metaclass=ABCMeta): - """An OWLReasoner reasons over a set of axioms (the set of reasoner axioms) that is based on the imports closure of - a particular ontology - the "root" ontology.""" - __slots__ = () - - @abstractmethod - def __init__(self, ontology: OWLOntology): - pass - - @abstractmethod - def data_property_domains(self, pe: OWLDataProperty, direct: bool = False) -> Iterable[OWLClassExpression]: - """Gets the class expressions that are the direct or indirect domains of this property with respect to the - imports closure of the root ontology. - - Args: - pe: The property expression whose domains are to be retrieved. - direct: Specifies if the direct domains should be retrieved (True), or if all domains should be retrieved - (False). - - Returns: - :Let N = equivalent_classes(DataSomeValuesFrom(pe rdfs:Literal)). If direct is True: then if N is not - empty then the return value is N, else the return value is the result of - super_classes(DataSomeValuesFrom(pe rdfs:Literal), true). If direct is False: then the result of - super_classes(DataSomeValuesFrom(pe rdfs:Literal), false) together with N if N is non-empty. - (Note, rdfs:Literal is the top datatype). - """ - pass - - @abstractmethod - def object_property_domains(self, pe: OWLObjectProperty, direct: bool = False) -> Iterable[OWLClassExpression]: - """Gets the class expressions that are the direct or indirect domains of this property with respect to the - imports closure of the root ontology. - - Args: - pe: The property expression whose domains are to be retrieved. - direct: Specifies if the direct domains should be retrieved (True), or if all domains should be retrieved - (False). - - Returns: - :Let N = equivalent_classes(ObjectSomeValuesFrom(pe owl:Thing)). If direct is True: then if N is not empty - then the return value is N, else the return value is the result of - super_classes(ObjectSomeValuesFrom(pe owl:Thing), true). If direct is False: then the result of - super_classes(ObjectSomeValuesFrom(pe owl:Thing), false) together with N if N is non-empty. - """ - pass - - @abstractmethod - def object_property_ranges(self, pe: OWLObjectProperty, direct: bool = False) -> Iterable[OWLClassExpression]: - """Gets the class expressions that are the direct or indirect ranges of this property with respect to the - imports closure of the root ontology. - - Args: - pe: The property expression whose ranges are to be retrieved. - direct: Specifies if the direct ranges should be retrieved (True), or if all ranges should be retrieved - (False). - - Returns: - :Let N = equivalent_classes(ObjectSomeValuesFrom(ObjectInverseOf(pe) owl:Thing)). If direct is True: then - if N is not empty then the return value is N, else the return value is the result of - super_classes(ObjectSomeValuesFrom(ObjectInverseOf(pe) owl:Thing), true). If direct is False: then - the result of super_classes(ObjectSomeValuesFrom(ObjectInverseOf(pe) owl:Thing), false) together with N - if N is non-empty. - """ - pass - - @abstractmethod - def equivalent_classes(self, ce: OWLClassExpression, only_named: bool = True) -> Iterable[OWLClassExpression]: - """Gets the class expressions that are equivalent to the specified class expression with respect to the set of - reasoner axioms. - - Args: - ce: The class expression whose equivalent classes are to be retrieved. - only_named: Whether to only retrieve named equivalent classes or also complex class expressions. - - Returns: - All class expressions C where the root ontology imports closure entails EquivalentClasses(ce C). If ce is - not a class name (i.e. it is an anonymous class expression) and there are no such classes C then there will - be no result. If ce is unsatisfiable with respect to the set of reasoner axioms then owl:Nothing, i.e. the - bottom node, will be returned. - """ - pass - - @abstractmethod - def disjoint_classes(self, ce: OWLClassExpression, only_named: bool = True) -> Iterable[OWLClassExpression]: - """Gets the class expressions that are disjoint with specified class expression with respect to the set of - reasoner axioms. - - Args: - ce: The class expression whose disjoint classes are to be retrieved. - only_named: Whether to only retrieve named disjoint classes or also complex class expressions. - - Returns: - All class expressions D where the set of reasoner axioms entails EquivalentClasses(D ObjectComplementOf(ce)) - or StrictSubClassOf(D ObjectComplementOf(ce)). - """ - pass - - @abstractmethod - def different_individuals(self, ind: OWLNamedIndividual) -> Iterable[OWLNamedIndividual]: - """Gets the individuals that are different from the specified individual with respect to the set of - reasoner axioms. - - Args: - ind: The individual whose different individuals are to be retrieved. - - Returns: - All individuals x where the set of reasoner axioms entails DifferentIndividuals(ind x). - """ - pass - - @abstractmethod - def same_individuals(self, ind: OWLNamedIndividual) -> Iterable[OWLNamedIndividual]: - """Gets the individuals that are the same as the specified individual with respect to the set of - reasoner axioms. - - Args: - ind: The individual whose same individuals are to be retrieved. - - Returns: - All individuals x where the root ontology imports closure entails SameIndividual(ind x). - """ - pass - - @abstractmethod - def equivalent_object_properties(self, op: OWLObjectPropertyExpression) -> Iterable[OWLObjectPropertyExpression]: - """Gets the simplified object properties that are equivalent to the specified object property with respect - to the set of reasoner axioms. - - Args: - op: The object property whose equivalent object properties are to be retrieved. - - Returns: - All simplified object properties e where the root ontology imports closure entails - EquivalentObjectProperties(op e). If op is unsatisfiable with respect to the set of reasoner axioms - then owl:bottomDataProperty will be returned. - """ - pass - - @abstractmethod - def equivalent_data_properties(self, dp: OWLDataProperty) -> Iterable[OWLDataProperty]: - """Gets the data properties that are equivalent to the specified data property with respect to the set of - reasoner axioms. - - Args: - dp: The data property whose equivalent data properties are to be retrieved. - - Returns: - All data properties e where the root ontology imports closure entails EquivalentDataProperties(dp e). - If dp is unsatisfiable with respect to the set of reasoner axioms then owl:bottomDataProperty will - be returned. - """ - pass - - @abstractmethod - def data_property_values(self, e: OWLEntity, pe: OWLDataProperty, direct: bool = True) \ - -> Iterable['OWLLiteral']: - """Gets the data property values for the specified entity and data property expression. - - Args: - e: The owl entity (usually an individual) that is the subject of the data property values. - pe: The data property expression whose values are to be retrieved for the specified entity. - direct: Specifies if the direct values should be retrieved (True), or if all values should be retrieved - (False), so that sub properties are taken into account. - - Note: Can be used to get values, for example, of 'label' property of owl entities such as classes and properties - too (not only individuals). - - Returns: - A set of OWLLiterals containing literals such that for each literal l in the set, the set of reasoner - axioms entails DataPropertyAssertion(pe ind l). - """ - pass - - @abstractmethod - def object_property_values(self, ind: OWLNamedIndividual, pe: OWLObjectPropertyExpression, direct: bool = True) \ - -> Iterable[OWLNamedIndividual]: - """Gets the object property values for the specified individual and object property expression. - - Args: - ind: The individual that is the subject of the object property values. - pe: The object property expression whose values are to be retrieved for the specified individual. - direct: Specifies if the direct values should be retrieved (True), or if all values should be retrieved - (False), so that sub properties are taken into account. - - Returns: - The named individuals such that for each individual j, the set of reasoner axioms entails - ObjectPropertyAssertion(pe ind j). - """ - pass - - @abstractmethod - def instances(self, ce: OWLClassExpression, direct: bool = False) -> Iterable[OWLNamedIndividual]: - """Gets the individuals which are instances of the specified class expression. - - Args: - ce: The class expression whose instances are to be retrieved. - direct: Specifies if the direct instances should be retrieved (True), or if all instances should be - retrieved (False). - - Returns: - If direct is True, each named individual j where the set of reasoner axioms entails - DirectClassAssertion(ce, j). If direct is False, each named individual j where the set of reasoner axioms - entails ClassAssertion(ce, j). If ce is unsatisfiable with respect to the set of reasoner axioms then - nothing returned. - """ - pass - @abstractmethod - def sub_classes(self, ce: OWLClassExpression, direct: bool = False, only_named: bool = True) \ - -> Iterable[OWLClassExpression]: - """Gets the set of named classes that are the strict (potentially direct) subclasses of the specified class - expression with respect to the reasoner axioms. - - Args: - ce: The class expression whose strict (direct) subclasses are to be retrieved. - direct: Specifies if the direct subclasses should be retrieved (True) or if the all subclasses - (descendant) classes should be retrieved (False). - only_named: Whether to only retrieve named sub-classes or also complex class expressions. - - Returns: - If direct is True, each class C where reasoner axioms entails DirectSubClassOf(C, ce). If direct is False, - each class C where reasoner axioms entails StrictSubClassOf(C, ce). If ce is equivalent to owl:Nothing then - nothing will be returned. - """ - pass - - @abstractmethod - def disjoint_object_properties(self, op: OWLObjectPropertyExpression) -> Iterable[OWLObjectPropertyExpression]: - """Gets the simplified object properties that are disjoint with the specified object property with respect - to the set of reasoner axioms. - - Args: - op: The object property whose disjoint object properties are to be retrieved. - - Returns: - All simplified object properties e where the root ontology imports closure entails - EquivalentObjectProperties(e ObjectPropertyComplementOf(op)) or - StrictSubObjectPropertyOf(e ObjectPropertyComplementOf(op)). - """ - pass - - @abstractmethod - def disjoint_data_properties(self, dp: OWLDataProperty) -> Iterable[OWLDataProperty]: - """Gets the data properties that are disjoint with the specified data property with respect - to the set of reasoner axioms. - - Args: - dp: The data property whose disjoint data properties are to be retrieved. - - Returns: - All data properties e where the root ontology imports closure entails - EquivalentDataProperties(e DataPropertyComplementOf(dp)) or - StrictSubDataPropertyOf(e DataPropertyComplementOf(dp)). - """ - pass - - @abstractmethod - def sub_data_properties(self, dp: OWLDataProperty, direct: bool = False) -> Iterable[OWLDataProperty]: - """Gets the set of named data properties that are the strict (potentially direct) subproperties of the - specified data property expression with respect to the imports closure of the root ontology. - - Args: - dp: The data property whose strict (direct) subproperties are to be retrieved. - direct: Specifies if the direct subproperties should be retrieved (True) or if the all subproperties - (descendants) should be retrieved (False). - - Returns: - If direct is True, each property P where the set of reasoner axioms entails DirectSubDataPropertyOf(P, pe). - If direct is False, each property P where the set of reasoner axioms entails - StrictSubDataPropertyOf(P, pe). If pe is equivalent to owl:bottomDataProperty then nothing will be - returned. - """ - pass - - @abstractmethod - def super_data_properties(self, dp: OWLDataProperty, direct: bool = False) -> Iterable[OWLDataProperty]: - """Gets the stream of data properties that are the strict (potentially direct) super properties of the - specified data property with respect to the imports closure of the root ontology. - - Args: - dp (OWLDataProperty): The data property whose super properties are to be retrieved. - direct (bool): Specifies if the direct super properties should be retrieved (True) or if the all - super properties (ancestors) should be retrieved (False). - - Returns: - Iterable of super properties. - """ - pass - - @abstractmethod - def sub_object_properties(self, op: OWLObjectPropertyExpression, direct: bool = False) \ - -> Iterable[OWLObjectPropertyExpression]: - """Gets the stream of simplified object property expressions that are the strict (potentially direct) - subproperties of the specified object property expression with respect to the imports closure of the root - ontology. - - Args: - op: The object property expression whose strict (direct) subproperties are to be retrieved. - direct: Specifies if the direct subproperties should be retrieved (True) or if the all subproperties - (descendants) should be retrieved (False). - - Returns: - If direct is True, simplified object property expressions, such that for each simplified object property - expression, P, the set of reasoner axioms entails DirectSubObjectPropertyOf(P, pe). - If direct is False, simplified object property expressions, such that for each simplified object property - expression, P, the set of reasoner axioms entails StrictSubObjectPropertyOf(P, pe). - If pe is equivalent to owl:bottomObjectProperty then nothing will be returned. - """ - pass - - @abstractmethod - def super_object_properties(self, op: OWLObjectPropertyExpression, direct: bool = False) \ - -> Iterable[OWLObjectPropertyExpression]: - """Gets the stream of object properties that are the strict (potentially direct) super properties of the - specified object property with respect to the imports closure of the root ontology. - - Args: - op (OWLObjectPropertyExpression): The object property expression whose super properties are to be - retrieved. - direct (bool): Specifies if the direct super properties should be retrieved (True) or if the all - super properties (ancestors) should be retrieved (False). - - Returns: - Iterable of super properties. - """ - pass - - @abstractmethod - def types(self, ind: OWLNamedIndividual, direct: bool = False) -> Iterable[OWLClass]: - """Gets the named classes which are (potentially direct) types of the specified named individual. - - Args: - ind: The individual whose types are to be retrieved. - direct: Specifies if the direct types should be retrieved (True), or if all types should be retrieved - (False). - - Returns: - If direct is True, each named class C where the set of reasoner axioms entails - DirectClassAssertion(C, ind). If direct is False, each named class C where the set of reasoner axioms - entails ClassAssertion(C, ind). - """ - pass - - @abstractmethod - def get_root_ontology(self) -> OWLOntology: - """Gets the "root" ontology that is loaded into this reasoner. The reasoner takes into account the axioms in - this ontology and its import's closure.""" - pass - - @abstractmethod - def super_classes(self, ce: OWLClassExpression, direct: bool = False, only_named: bool = True) \ - -> Iterable[OWLClassExpression]: - """Gets the stream of named classes that are the strict (potentially direct) super classes of the specified - class expression with respect to the imports closure of the root ontology. - - Args: - ce: The class expression whose strict (direct) super classes are to be retrieved. - direct: Specifies if the direct super classes should be retrieved (True) or if the all super classes - (ancestors) classes should be retrieved (False). - only_named: Whether to only retrieve named super classes or also complex class expressions. - - Returns: - If direct is True, each class C where the set of reasoner axioms entails DirectSubClassOf(ce, C). - If direct is False, each class C where set of reasoner axioms entails StrictSubClassOf(ce, C). - If ce is equivalent to owl:Thing then nothing will be returned. - """ - pass -class OWLReasonerEx(OWLReasoner, metaclass=ABCMeta): - """Extra convenience methods for OWL Reasoners""" - - # default - def data_property_ranges(self, pe: OWLDataProperty, direct: bool = False) -> Iterable[OWLDataRange]: - """Gets the data ranges that are the direct or indirect ranges of this property with respect to the imports - closure of the root ontology. - - Args: - pe: The property expression whose ranges are to be retrieved. - direct: Specifies if the direct ranges should be retrieved (True), or if all ranges should be retrieved - (False). - - Returns: - """ - for ax in self.get_root_ontology().data_property_range_axioms(pe): - yield ax.get_range() - if not direct: - logger.warning("indirect not implemented") - # TODO: - - # default - def all_data_property_values(self, pe: OWLDataProperty, direct: bool = True) -> Iterable[OWLLiteral]: - """Gets all values for the given data property expression that appear in the knowledge base. - - Args: - pe: The data property expression whose values are to be retrieved - direct: Specifies if only the direct values of the data property pe should be retrieved (True), or if - the values of sub properties of pe should be taken into account (False). - - Returns: - A set of OWLLiterals containing literals such that for each literal l in the set, the set of reasoner - axioms entails DataPropertyAssertion(pe ind l) for any ind. - """ - onto = self.get_root_ontology() - for ind in onto.individuals_in_signature(): - for lit in self.data_property_values(ind, pe, direct): - yield lit - - # default - def ind_data_properties(self, ind: OWLNamedIndividual, direct: bool = True) -> Iterable[OWLDataProperty]: - """Gets all data properties for the given individual that appear in the knowledge base. - - Args: - ind: The named individual whose data properties are to be retrieved - direct: Specifies if the direct data properties should be retrieved (True), or if all - data properties should be retrieved (False), so that sub properties are taken into account. - - Returns: - All data properties pe where the set of reasoner axioms entails DataPropertyAssertion(pe ind l) - for atleast one l. - """ - onto = self.get_root_ontology() - for dp in onto.data_properties_in_signature(): - try: - next(iter(self.data_property_values(ind, dp, direct))) - yield dp - except StopIteration: - pass - - # default - def ind_object_properties(self, ind: OWLNamedIndividual, direct: bool = True) -> Iterable[OWLObjectProperty]: - """Gets all object properties for the given individual that appear in the knowledge base. - - Args: - ind: The named individual whose object properties are to be retrieved - direct: Specifies if the direct object properties should be retrieved (True), or if all - object properties should be retrieved (False), so that sub properties are taken into account. - - Returns: - All data properties pe where the set of reasoner axioms entails ObjectPropertyAssertion(pe ind ind2) - for atleast one ind2. - """ - onto = self.get_root_ontology() - for op in onto.object_properties_in_signature(): - try: - next(iter(self.object_property_values(ind, op, direct))) - yield op - except StopIteration: - pass class OntologyReasoner(OWLReasonerEx): __slots__ = '_ontology', '_world' diff --git a/owlapy/render.py b/owlapy/render.py index 4658886c..0e30bb6d 100644 --- a/owlapy/render.py +++ b/owlapy/render.py @@ -20,7 +20,7 @@ from .owl_data_ranges import OWLNaryDataRange, OWLDataComplementOf, OWLDataUnionOf, OWLDataIntersectionOf from .class_expression import OWLObjectHasValue, OWLFacetRestriction, OWLDatatypeRestriction, OWLObjectOneOf from .owl_datatype import OWLDatatype -from .owl_reasoner import OWLReasoner +from .abstracts.abstract_owl_reasoner import OWLReasoner import requests import warnings import abc From e48c25df19bb72aea5f78137f6451cec05dfbac9 Mon Sep 17 00:00:00 2001 From: Alkid Date: Mon, 9 Sep 2024 15:06:16 +0200 Subject: [PATCH 36/44] removed optional arguments from abstract methods of OWLReasoner --- owlapy/abstracts/abstract_owl_reasoner.py | 37 +++++++++-------------- owlapy/owl_reasoner.py | 14 +++------ 2 files changed, 20 insertions(+), 31 deletions(-) diff --git a/owlapy/abstracts/abstract_owl_reasoner.py b/owlapy/abstracts/abstract_owl_reasoner.py index 8b7bcd07..c70ca218 100644 --- a/owlapy/abstracts/abstract_owl_reasoner.py +++ b/owlapy/abstracts/abstract_owl_reasoner.py @@ -1,7 +1,7 @@ """OWL Reasoner""" from abc import ABCMeta, abstractmethod from typing import Iterable - +import logging from owlapy.class_expression import OWLClassExpression from owlapy.class_expression import OWLClass @@ -12,6 +12,8 @@ from owlapy.owl_individual import OWLNamedIndividual from owlapy.owl_literal import OWLLiteral +logger = logging.getLogger(__name__) + class OWLReasoner(metaclass=ABCMeta): """An OWLReasoner reasons over a set of axioms (the set of reasoner axioms) that is based on the imports closure of @@ -79,13 +81,12 @@ def object_property_ranges(self, pe: OWLObjectProperty, direct: bool = False) -> pass @abstractmethod - def equivalent_classes(self, ce: OWLClassExpression, only_named: bool = True) -> Iterable[OWLClassExpression]: + def equivalent_classes(self, ce: OWLClassExpression) -> Iterable[OWLClassExpression]: """Gets the class expressions that are equivalent to the specified class expression with respect to the set of reasoner axioms. Args: ce: The class expression whose equivalent classes are to be retrieved. - only_named: Whether to only retrieve named equivalent classes or also complex class expressions. Returns: All class expressions C where the root ontology imports closure entails EquivalentClasses(ce C). If ce is @@ -96,13 +97,12 @@ def equivalent_classes(self, ce: OWLClassExpression, only_named: bool = True) -> pass @abstractmethod - def disjoint_classes(self, ce: OWLClassExpression, only_named: bool = True) -> Iterable[OWLClassExpression]: + def disjoint_classes(self, ce: OWLClassExpression) -> Iterable[OWLClassExpression]: """Gets the class expressions that are disjoint with specified class expression with respect to the set of reasoner axioms. Args: ce: The class expression whose disjoint classes are to be retrieved. - only_named: Whether to only retrieve named disjoint classes or also complex class expressions. Returns: All class expressions D where the set of reasoner axioms entails EquivalentClasses(D ObjectComplementOf(ce)) @@ -167,15 +167,13 @@ def equivalent_data_properties(self, dp: OWLDataProperty) -> Iterable[OWLDataPro pass @abstractmethod - def data_property_values(self, e: OWLEntity, pe: OWLDataProperty, direct: bool = True) \ + def data_property_values(self, e: OWLEntity, pe: OWLDataProperty) \ -> Iterable['OWLLiteral']: """Gets the data property values for the specified entity and data property expression. Args: e: The owl entity (usually an individual) that is the subject of the data property values. pe: The data property expression whose values are to be retrieved for the specified entity. - direct: Specifies if the direct values should be retrieved (True), or if all values should be retrieved - (False), so that sub properties are taken into account. Note: Can be used to get values, for example, of 'label' property of owl entities such as classes and properties too (not only individuals). @@ -187,15 +185,13 @@ def data_property_values(self, e: OWLEntity, pe: OWLDataProperty, direct: bool = pass @abstractmethod - def object_property_values(self, ind: OWLNamedIndividual, pe: OWLObjectPropertyExpression, direct: bool = True) \ + def object_property_values(self, ind: OWLNamedIndividual, pe: OWLObjectPropertyExpression) \ -> Iterable[OWLNamedIndividual]: """Gets the object property values for the specified individual and object property expression. Args: ind: The individual that is the subject of the object property values. pe: The object property expression whose values are to be retrieved for the specified individual. - direct: Specifies if the direct values should be retrieved (True), or if all values should be retrieved - (False), so that sub properties are taken into account. Returns: The named individuals such that for each individual j, the set of reasoner axioms entails @@ -221,7 +217,7 @@ def instances(self, ce: OWLClassExpression, direct: bool = False) -> Iterable[OW pass @abstractmethod - def sub_classes(self, ce: OWLClassExpression, direct: bool = False, only_named: bool = True) \ + def sub_classes(self, ce: OWLClassExpression, direct: bool = False) \ -> Iterable[OWLClassExpression]: """Gets the set of named classes that are the strict (potentially direct) subclasses of the specified class expression with respect to the reasoner axioms. @@ -230,7 +226,6 @@ def sub_classes(self, ce: OWLClassExpression, direct: bool = False, only_named: ce: The class expression whose strict (direct) subclasses are to be retrieved. direct: Specifies if the direct subclasses should be retrieved (True) or if the all subclasses (descendant) classes should be retrieved (False). - only_named: Whether to only retrieve named sub-classes or also complex class expressions. Returns: If direct is True, each class C where reasoner axioms entails DirectSubClassOf(C, ce). If direct is False, @@ -363,7 +358,7 @@ def get_root_ontology(self) -> OWLOntology: pass @abstractmethod - def super_classes(self, ce: OWLClassExpression, direct: bool = False, only_named: bool = True) \ + def super_classes(self, ce: OWLClassExpression, direct: bool = False) \ -> Iterable[OWLClassExpression]: """Gets the stream of named classes that are the strict (potentially direct) super classes of the specified class expression with respect to the imports closure of the root ontology. @@ -372,7 +367,6 @@ class expression with respect to the imports closure of the root ontology. ce: The class expression whose strict (direct) super classes are to be retrieved. direct: Specifies if the direct super classes should be retrieved (True) or if the all super classes (ancestors) classes should be retrieved (False). - only_named: Whether to only retrieve named super classes or also complex class expressions. Returns: If direct is True, each class C where the set of reasoner axioms entails DirectSubClassOf(ce, C). @@ -380,6 +374,8 @@ class expression with respect to the imports closure of the root ontology. If ce is equivalent to owl:Thing then nothing will be returned. """ pass + + class OWLReasonerEx(OWLReasoner, metaclass=ABCMeta): """Extra convenience methods for OWL Reasoners""" @@ -399,16 +395,13 @@ def data_property_ranges(self, pe: OWLDataProperty, direct: bool = False) -> Ite yield ax.get_range() if not direct: logger.warning("indirect not implemented") - # TODO: # default - def all_data_property_values(self, pe: OWLDataProperty, direct: bool = True) -> Iterable[OWLLiteral]: + def all_data_property_values(self, pe: OWLDataProperty) -> Iterable[OWLLiteral]: """Gets all values for the given data property expression that appear in the knowledge base. Args: pe: The data property expression whose values are to be retrieved - direct: Specifies if only the direct values of the data property pe should be retrieved (True), or if - the values of sub properties of pe should be taken into account (False). Returns: A set of OWLLiterals containing literals such that for each literal l in the set, the set of reasoner @@ -416,7 +409,7 @@ def all_data_property_values(self, pe: OWLDataProperty, direct: bool = True) -> """ onto = self.get_root_ontology() for ind in onto.individuals_in_signature(): - for lit in self.data_property_values(ind, pe, direct): + for lit in self.data_property_values(ind, pe): yield lit # default @@ -456,7 +449,7 @@ def ind_object_properties(self, ind: OWLNamedIndividual, direct: bool = True) -> onto = self.get_root_ontology() for op in onto.object_properties_in_signature(): try: - next(iter(self.object_property_values(ind, op, direct))) + next(iter(self.object_property_values(ind, op))) yield op except StopIteration: - pass \ No newline at end of file + pass diff --git a/owlapy/owl_reasoner.py b/owlapy/owl_reasoner.py index 9c2b708f..be190f7f 100644 --- a/owlapy/owl_reasoner.py +++ b/owlapy/owl_reasoner.py @@ -33,11 +33,6 @@ _P = TypeVar('_P', bound=OWLPropertyExpression) -# TODO:CD:The name of the classes defined with metaclass=ABCMeta should reflect that -# TODO:CD: An instance cannot be created from those classes. -# TODO:CD: We should move those Abstract Base Classes into a respective package, e.g. -# TODO:CD: owlapy/abstract_owl_reasoner/abstract_owl_reasoner.py should contain OWLReasoner and OWLReasonerEx - class OntologyReasoner(OWLReasonerEx): __slots__ = '_ontology', '_world' @@ -1149,7 +1144,7 @@ def _retrieve_triples(self, pe: OWLPropertyExpression) -> Iterable: yield from relations -class SyncReasoner: +class SyncReasoner(OWLReasonerEx): def __init__(self, ontology: Union[SyncOntology, str], reasoner="HermiT"): """ @@ -1633,9 +1628,10 @@ def infer_axioms_and_save(self, output_path: str = None, output_format: str = No def generate_and_save_inferred_class_assertion_axioms(self, output="temp.ttl", output_format: str = None): """ - Generates inferred class assertion axioms for the ontology managed by this instance's reasoner and saves them to a file. - This function uses the OWL API to generate inferred class assertion axioms based on the ontology and reasoner - associated with this instance. The inferred axioms are saved to the specified output file in the desired format. + Generates inferred class assertion axioms for the ontology managed by this instance's reasoner and saves them + to a file. This function uses the OWL API to generate inferred class assertion axioms based on the ontology + and reasoner associated with this instance. The inferred axioms are saved to the specified output file in + the desired format. Parameters: ----------- output : str, optional From 7016b29524d112d60bf578251a79bb013cd534eb Mon Sep 17 00:00:00 2001 From: Alkid Date: Mon, 9 Sep 2024 15:43:40 +0200 Subject: [PATCH 37/44] flexible 'direct' argument --- owlapy/abstracts/abstract_owl_reasoner.py | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/owlapy/abstracts/abstract_owl_reasoner.py b/owlapy/abstracts/abstract_owl_reasoner.py index c70ca218..eab7b9e9 100644 --- a/owlapy/abstracts/abstract_owl_reasoner.py +++ b/owlapy/abstracts/abstract_owl_reasoner.py @@ -1,5 +1,6 @@ """OWL Reasoner""" from abc import ABCMeta, abstractmethod +from inspect import signature from typing import Iterable import logging @@ -397,19 +398,26 @@ def data_property_ranges(self, pe: OWLDataProperty, direct: bool = False) -> Ite logger.warning("indirect not implemented") # default - def all_data_property_values(self, pe: OWLDataProperty) -> Iterable[OWLLiteral]: + def all_data_property_values(self, pe: OWLDataProperty, direct: bool = True) -> Iterable[OWLLiteral]: """Gets all values for the given data property expression that appear in the knowledge base. Args: pe: The data property expression whose values are to be retrieved + direct: Specifies if only the direct values of the data property pe should be retrieved (True), or if + the values of sub properties of pe should be taken into account (False). Returns: A set of OWLLiterals containing literals such that for each literal l in the set, the set of reasoner axioms entails DataPropertyAssertion(pe ind l) for any ind. """ onto = self.get_root_ontology() + has_direct = "direct" in str(signature(self.data_property_values)) for ind in onto.individuals_in_signature(): - for lit in self.data_property_values(ind, pe): + if has_direct: + dpv = self.data_property_values(ind, pe, direct) + else: + dpv = self.data_property_values(ind, pe) + for lit in dpv: yield lit # default @@ -447,9 +455,13 @@ def ind_object_properties(self, ind: OWLNamedIndividual, direct: bool = True) -> for atleast one ind2. """ onto = self.get_root_ontology() + has_direct = "direct" in str(signature(self.object_property_values)) for op in onto.object_properties_in_signature(): try: - next(iter(self.object_property_values(ind, op))) + if has_direct: + next(iter(self.object_property_values(ind, op, direct))) + else: + next(iter(self.object_property_values(ind, op))) yield op except StopIteration: pass From aada5506ce377702317c59615a2a9ee4bd185b56 Mon Sep 17 00:00:00 2001 From: Alkid Date: Mon, 9 Sep 2024 15:47:49 +0200 Subject: [PATCH 38/44] flexible 'direct' argument for ind_data_properties --- owlapy/abstracts/abstract_owl_reasoner.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/owlapy/abstracts/abstract_owl_reasoner.py b/owlapy/abstracts/abstract_owl_reasoner.py index eab7b9e9..3881d8fd 100644 --- a/owlapy/abstracts/abstract_owl_reasoner.py +++ b/owlapy/abstracts/abstract_owl_reasoner.py @@ -434,9 +434,13 @@ def ind_data_properties(self, ind: OWLNamedIndividual, direct: bool = True) -> I for atleast one l. """ onto = self.get_root_ontology() + has_direct = "direct" in str(signature(self.data_property_values)) for dp in onto.data_properties_in_signature(): try: - next(iter(self.data_property_values(ind, dp, direct))) + if has_direct: + next(iter(self.data_property_values(ind, dp, direct))) + else: + next(iter(self.data_property_values(ind, dp))) yield dp except StopIteration: pass From 1afb0fa7d2f28fe35a811c63a089f073eb8326df Mon Sep 17 00:00:00 2001 From: Alkid Date: Mon, 9 Sep 2024 16:00:06 +0200 Subject: [PATCH 39/44] Moved abstract classes to 'abstracts' directory --- owlapy/abstracts/abstract_owl_ontology.py | 183 ++++++++++++++++++ .../abstract_owl_ontology_manager.py | 70 +++++++ owlapy/abstracts/abstract_owl_reasoner.py | 2 +- owlapy/owl_ontology.py | 174 +---------------- owlapy/owl_ontology_manager.py | 70 +------ owlapy/owl_reasoner.py | 3 +- 6 files changed, 260 insertions(+), 242 deletions(-) create mode 100644 owlapy/abstracts/abstract_owl_ontology.py create mode 100644 owlapy/abstracts/abstract_owl_ontology_manager.py diff --git a/owlapy/abstracts/abstract_owl_ontology.py b/owlapy/abstracts/abstract_owl_ontology.py new file mode 100644 index 00000000..c24f9176 --- /dev/null +++ b/owlapy/abstracts/abstract_owl_ontology.py @@ -0,0 +1,183 @@ +from abc import ABCMeta, abstractmethod +from typing import Final, Iterable, Union, Optional + +from owlapy.class_expression import OWLClass +from owlapy.iri import IRI +from owlapy.owl_axiom import OWLEquivalentClassesAxiom, OWLClassAxiom, OWLDataPropertyDomainAxiom, \ + OWLDataPropertyRangeAxiom, OWLObjectPropertyDomainAxiom, OWLObjectPropertyRangeAxiom, OWLAxiom +from owlapy.owl_individual import OWLNamedIndividual +from owlapy.owl_object import OWLObject +from owlapy.owl_ontology import _M, OWLOntologyID +from owlapy.owl_property import OWLDataProperty, OWLObjectProperty + + +class OWLOntology(OWLObject, metaclass=ABCMeta): + """Represents an OWL 2 Ontology in the OWL 2 specification. + + An OWLOntology consists of a possibly empty set of OWLAxioms and a possibly empty set of OWLAnnotations. + An ontology can have an ontology IRI which can be used to identify the ontology. If it has an ontology IRI then + it may also have an ontology version IRI. Since OWL 2, an ontology need not have an ontology IRI. (See the OWL 2 + Structural Specification). + + An ontology cannot be modified directly. Changes must be applied via its OWLOntologyManager. + """ + __slots__ = () + type_index: Final = 1 + + @abstractmethod + def classes_in_signature(self) -> Iterable[OWLClass]: + """Gets the classes in the signature of this object. + + Returns: + Classes in the signature of this object. + """ + pass + + @abstractmethod + def data_properties_in_signature(self) -> Iterable[OWLDataProperty]: + """Get the data properties that are in the signature of this object. + + Returns: + Data properties that are in the signature of this object. + """ + pass + + @abstractmethod + def object_properties_in_signature(self) -> Iterable[OWLObjectProperty]: + """A convenience method that obtains the object properties that are in the signature of this object. + + Returns: + Object properties that are in the signature of this object. + """ + pass + + @abstractmethod + def individuals_in_signature(self) -> Iterable[OWLNamedIndividual]: + """A convenience method that obtains the individuals that are in the signature of this object. + + Returns: + Individuals that are in the signature of this object. + """ + pass + + @abstractmethod + def equivalent_classes_axioms(self, c: OWLClass) -> Iterable[OWLEquivalentClassesAxiom]: + """ Gets all of the equivalent axioms in this ontology that contain the specified class as an operand. + + Args: + c: The class for which the EquivalentClasses axioms should be retrieved. + + Returns: + EquivalentClasses axioms contained in this ontology. + """ + pass + + @abstractmethod + def general_class_axioms(self) -> Iterable[OWLClassAxiom]: + """Get the general class axioms of this ontology. This includes SubClass axioms with a complex class expression + as the sub class and EquivalentClass axioms and DisjointClass axioms with only complex class expressions. + + Returns: + General class axioms contained in this ontology. + """ + pass + + @abstractmethod + def data_property_domain_axioms(self, property: OWLDataProperty) -> Iterable[OWLDataPropertyDomainAxiom]: + """Gets the OWLDataPropertyDomainAxiom objects where the property is equal to the specified property. + + Args: + property: The property which is equal to the property of the retrieved axioms. + + Returns: + The axioms matching the search. + """ + pass + + @abstractmethod + def data_property_range_axioms(self, property: OWLDataProperty) -> Iterable[OWLDataPropertyRangeAxiom]: + """Gets the OWLDataPropertyRangeAxiom objects where the property is equal to the specified property. + + Args: + property: The property which is equal to the property of the retrieved axioms. + + Returns: + The axioms matching the search. + """ + pass + + @abstractmethod + def object_property_domain_axioms(self, property: OWLObjectProperty) -> Iterable[OWLObjectPropertyDomainAxiom]: + """Gets the OWLObjectPropertyDomainAxiom objects where the property is equal to the specified property. + + Args: + property: The property which is equal to the property of the retrieved axioms. + + Returns: + The axioms matching the search. + """ + pass + + @abstractmethod + def object_property_range_axioms(self, property: OWLObjectProperty) -> Iterable[OWLObjectPropertyRangeAxiom]: + """Gets the OWLObjectPropertyRangeAxiom objects where the property is equal to the specified property. + + Args: + property: The property which is equal to the property of the retrieved axioms. + + Returns: + The axioms matching the search. + """ + pass + + @abstractmethod + def get_owl_ontology_manager(self) -> _M: + """Gets the manager that manages this ontology.""" + pass + + @abstractmethod + def get_ontology_id(self) -> OWLOntologyID: + """Gets the OWLOntologyID belonging to this object. + + Returns: + The OWLOntologyID. + """ + pass + + def is_anonymous(self) -> bool: + """Check whether this ontology does contain an IRI or not.""" + return self.get_ontology_id().is_anonymous() + + @abstractmethod + def add_axiom(self, axiom: Union[OWLAxiom, Iterable[OWLAxiom]]): + """Add the specified axiom/axioms to the ontology. + + Args: + axiom: Can be a single axiom or a collection of axioms. + + Returns: + Nothing. + """ + pass + + @abstractmethod + def remove_axiom(self, axiom: Union[OWLAxiom, Iterable[OWLAxiom]]): + """Removes the specified axiom/axioms to the ontology. + + Args: + axiom: Can be a single axiom or a collection of axioms. + + Returns: + Nothing. + """ + pass + + def save(self, document_iri: Optional[IRI] = None): + """Saves this ontology, using its IRI to determine where/how the ontology should be + saved. + + Args: + document_iri: Whether you want to save in a different location. + + """ + pass diff --git a/owlapy/abstracts/abstract_owl_ontology_manager.py b/owlapy/abstracts/abstract_owl_ontology_manager.py new file mode 100644 index 00000000..891b29a8 --- /dev/null +++ b/owlapy/abstracts/abstract_owl_ontology_manager.py @@ -0,0 +1,70 @@ +from abc import ABCMeta, abstractmethod +from typing import Union + +from owlapy.abstracts.abstract_owl_ontology import OWLOntology +from owlapy.iri import IRI + + +class OWLOntologyChange(metaclass=ABCMeta): + """Represents an ontology change.""" + __slots__ = () + + _ont: OWLOntology + + @abstractmethod + def __init__(self, ontology: OWLOntology): + self._ont = ontology + + def get_ontology(self) -> OWLOntology: + """Gets the ontology that the change is/was applied to. + + Returns: + The ontology that the change is applicable to. + """ + return self._ont + + +class OWLOntologyManager(metaclass=ABCMeta): + """An OWLOntologyManager manages a set of ontologies. It is the main point for creating, loading and accessing + ontologies.""" + + @abstractmethod + def create_ontology(self, iri: Union[str, IRI]) -> OWLOntology: + """Creates a new (empty) ontology that that has the specified ontology IRI (and no version IRI). + + Args: + iri: The IRI of the ontology to be created, can also be a string. + + Returns: + The newly created ontology. + """ + pass + + @abstractmethod + def load_ontology(self, iri: Union[IRI, str]) -> OWLOntology: + """Loads an ontology that is assumed to have the specified ontology IRI as its IRI or version IRI. The ontology + IRI will be mapped to an ontology document IRI. + + Args: + iri: The IRI that identifies the ontology, can also be a string. + It is expected that the ontology will also have this IRI + (although the OWL API should tolerate situations where this is not the case). + + Returns: + The OWLOntology representation of the ontology that was loaded. + """ + pass + + @abstractmethod + def apply_change(self, change: OWLOntologyChange): + """A convenience method that applies just one change to an ontology. When this method is used through an + OWLOntologyManager implementation, the instance used should be the one that the ontology returns through the + get_owl_ontology_manager() call. + + Args: + change: The change to be applied. + + Raises: + ChangeApplied.UNSUCCESSFULLY: if the change was not applied successfully. + """ + pass diff --git a/owlapy/abstracts/abstract_owl_reasoner.py b/owlapy/abstracts/abstract_owl_reasoner.py index 3881d8fd..1ed1e01a 100644 --- a/owlapy/abstracts/abstract_owl_reasoner.py +++ b/owlapy/abstracts/abstract_owl_reasoner.py @@ -8,7 +8,7 @@ from owlapy.class_expression import OWLClass from owlapy.owl_data_ranges import OWLDataRange from owlapy.owl_object import OWLEntity -from owlapy.owl_ontology import OWLOntology +from owlapy.abstracts.abstract_owl_ontology import OWLOntology from owlapy.owl_property import OWLObjectPropertyExpression, OWLDataProperty, OWLObjectProperty from owlapy.owl_individual import OWLNamedIndividual from owlapy.owl_literal import OWLLiteral diff --git a/owlapy/owl_ontology.py b/owlapy/owl_ontology.py index ebd4389a..fdf7acbf 100644 --- a/owlapy/owl_ontology.py +++ b/owlapy/owl_ontology.py @@ -1,5 +1,4 @@ """OWL Ontology""" -from abc import ABCMeta, abstractmethod from functools import singledispatchmethod, singledispatch from itertools import chain, islice, combinations import types @@ -9,6 +8,7 @@ import owlready2 from pandas import Timedelta from owlapy import namespaces +from owlapy.abstracts.abstract_owl_ontology import OWLOntology from owlapy.owl_data_ranges import OWLDataRange, OWLDataComplementOf, OWLDataUnionOf, OWLDataIntersectionOf from owlapy.owl_datatype import OWLDatatype from owlapy.owl_individual import OWLNamedIndividual, OWLIndividual @@ -123,178 +123,6 @@ def __eq__(self, other): return NotImplemented -class OWLOntology(OWLObject, metaclass=ABCMeta): - """Represents an OWL 2 Ontology in the OWL 2 specification. - - An OWLOntology consists of a possibly empty set of OWLAxioms and a possibly empty set of OWLAnnotations. - An ontology can have an ontology IRI which can be used to identify the ontology. If it has an ontology IRI then - it may also have an ontology version IRI. Since OWL 2, an ontology need not have an ontology IRI. (See the OWL 2 - Structural Specification). - - An ontology cannot be modified directly. Changes must be applied via its OWLOntologyManager. - """ - __slots__ = () - type_index: Final = 1 - - @abstractmethod - def classes_in_signature(self) -> Iterable[OWLClass]: - """Gets the classes in the signature of this object. - - Returns: - Classes in the signature of this object. - """ - pass - - @abstractmethod - def data_properties_in_signature(self) -> Iterable[OWLDataProperty]: - """Get the data properties that are in the signature of this object. - - Returns: - Data properties that are in the signature of this object. - """ - pass - - @abstractmethod - def object_properties_in_signature(self) -> Iterable[OWLObjectProperty]: - """A convenience method that obtains the object properties that are in the signature of this object. - - Returns: - Object properties that are in the signature of this object. - """ - pass - - @abstractmethod - def individuals_in_signature(self) -> Iterable[OWLNamedIndividual]: - """A convenience method that obtains the individuals that are in the signature of this object. - - Returns: - Individuals that are in the signature of this object. - """ - pass - - @abstractmethod - def equivalent_classes_axioms(self, c: OWLClass) -> Iterable[OWLEquivalentClassesAxiom]: - """ Gets all of the equivalent axioms in this ontology that contain the specified class as an operand. - - Args: - c: The class for which the EquivalentClasses axioms should be retrieved. - - Returns: - EquivalentClasses axioms contained in this ontology. - """ - pass - - @abstractmethod - def general_class_axioms(self) -> Iterable[OWLClassAxiom]: - """Get the general class axioms of this ontology. This includes SubClass axioms with a complex class expression - as the sub class and EquivalentClass axioms and DisjointClass axioms with only complex class expressions. - - Returns: - General class axioms contained in this ontology. - """ - pass - - @abstractmethod - def data_property_domain_axioms(self, property: OWLDataProperty) -> Iterable[OWLDataPropertyDomainAxiom]: - """Gets the OWLDataPropertyDomainAxiom objects where the property is equal to the specified property. - - Args: - property: The property which is equal to the property of the retrieved axioms. - - Returns: - The axioms matching the search. - """ - pass - - @abstractmethod - def data_property_range_axioms(self, property: OWLDataProperty) -> Iterable[OWLDataPropertyRangeAxiom]: - """Gets the OWLDataPropertyRangeAxiom objects where the property is equal to the specified property. - - Args: - property: The property which is equal to the property of the retrieved axioms. - - Returns: - The axioms matching the search. - """ - pass - - @abstractmethod - def object_property_domain_axioms(self, property: OWLObjectProperty) -> Iterable[OWLObjectPropertyDomainAxiom]: - """Gets the OWLObjectPropertyDomainAxiom objects where the property is equal to the specified property. - - Args: - property: The property which is equal to the property of the retrieved axioms. - - Returns: - The axioms matching the search. - """ - pass - - @abstractmethod - def object_property_range_axioms(self, property: OWLObjectProperty) -> Iterable[OWLObjectPropertyRangeAxiom]: - """Gets the OWLObjectPropertyRangeAxiom objects where the property is equal to the specified property. - - Args: - property: The property which is equal to the property of the retrieved axioms. - - Returns: - The axioms matching the search. - """ - pass - - @abstractmethod - def get_owl_ontology_manager(self) -> _M: - """Gets the manager that manages this ontology.""" - pass - - @abstractmethod - def get_ontology_id(self) -> OWLOntologyID: - """Gets the OWLOntologyID belonging to this object. - - Returns: - The OWLOntologyID. - """ - pass - - def is_anonymous(self) -> bool: - """Check whether this ontology does contain an IRI or not.""" - return self.get_ontology_id().is_anonymous() - - @abstractmethod - def add_axiom(self, axiom: Union[OWLAxiom, Iterable[OWLAxiom]]): - """Add the specified axiom/axioms to the ontology. - - Args: - axiom: Can be a single axiom or a collection of axioms. - - Returns: - Nothing. - """ - pass - - @abstractmethod - def remove_axiom(self, axiom: Union[OWLAxiom, Iterable[OWLAxiom]]): - """Removes the specified axiom/axioms to the ontology. - - Args: - axiom: Can be a single axiom or a collection of axioms. - - Returns: - Nothing. - """ - pass - - def save(self, document_iri: Optional[IRI] = None): - """Saves this ontology, using its IRI to determine where/how the ontology should be - saved. - - Args: - document_iri: Whether you want to save in a different location. - - """ - pass - - def _check_expression(expr: OWLObject, ontology: OWLOntology, world: owlready2.namespace.World): """ @TODO:CD: Documentation diff --git a/owlapy/owl_ontology_manager.py b/owlapy/owl_ontology_manager.py index 2475d623..0f384f05 100644 --- a/owlapy/owl_ontology_manager.py +++ b/owlapy/owl_ontology_manager.py @@ -1,80 +1,16 @@ -from abc import ABCMeta, abstractmethod from typing import Union import jpype import owlready2 +from owlapy.abstracts.abstract_owl_ontology_manager import OWLOntologyChange, OWLOntologyManager from owlapy.iri import IRI from owlapy.meta_classes import HasIRI -from owlapy.owl_ontology import OWLOntology, Ontology, SyncOntology +from owlapy.owl_ontology import Ontology, SyncOntology +from owlapy.abstracts.abstract_owl_ontology import OWLOntology from owlapy.static_funcs import startJVM -class OWLOntologyChange(metaclass=ABCMeta): - """Represents an ontology change.""" - __slots__ = () - - _ont: OWLOntology - - @abstractmethod - def __init__(self, ontology: OWLOntology): - self._ont = ontology - - def get_ontology(self) -> OWLOntology: - """Gets the ontology that the change is/was applied to. - - Returns: - The ontology that the change is applicable to. - """ - return self._ont - - -class OWLOntologyManager(metaclass=ABCMeta): - """An OWLOntologyManager manages a set of ontologies. It is the main point for creating, loading and accessing - ontologies.""" - - @abstractmethod - def create_ontology(self, iri: Union[str, IRI]) -> OWLOntology: - """Creates a new (empty) ontology that that has the specified ontology IRI (and no version IRI). - - Args: - iri: The IRI of the ontology to be created, can also be a string. - - Returns: - The newly created ontology. - """ - pass - - @abstractmethod - def load_ontology(self, iri: Union[IRI, str]) -> OWLOntology: - """Loads an ontology that is assumed to have the specified ontology IRI as its IRI or version IRI. The ontology - IRI will be mapped to an ontology document IRI. - - Args: - iri: The IRI that identifies the ontology, can also be a string. - It is expected that the ontology will also have this IRI - (although the OWL API should tolerate situations where this is not the case). - - Returns: - The OWLOntology representation of the ontology that was loaded. - """ - pass - - @abstractmethod - def apply_change(self, change: OWLOntologyChange): - """A convenience method that applies just one change to an ontology. When this method is used through an - OWLOntologyManager implementation, the instance used should be the one that the ontology returns through the - get_owl_ontology_manager() call. - - Args: - change: The change to be applied. - - Raises: - ChangeApplied.UNSUCCESSFULLY: if the change was not applied successfully. - """ - pass - - class OWLImportsDeclaration(HasIRI): """Represents an import statement in an ontology.""" __slots__ = '_iri' diff --git a/owlapy/owl_reasoner.py b/owlapy/owl_reasoner.py index be190f7f..289deb47 100644 --- a/owlapy/owl_reasoner.py +++ b/owlapy/owl_reasoner.py @@ -20,7 +20,8 @@ from owlapy.owl_data_ranges import OWLDataRange, OWLDataComplementOf, OWLDataUnionOf, OWLDataIntersectionOf from owlapy.owl_datatype import OWLDatatype from owlapy.owl_object import OWLEntity -from owlapy.owl_ontology import OWLOntology, Ontology, _parse_concept_to_owlapy, SyncOntology +from owlapy.owl_ontology import Ontology, _parse_concept_to_owlapy, SyncOntology +from owlapy.abstracts.abstract_owl_ontology import OWLOntology from owlapy.owl_ontology_manager import SyncOntologyManager from owlapy.owl_property import OWLObjectPropertyExpression, OWLDataProperty, OWLObjectProperty, OWLObjectInverseOf, \ OWLPropertyExpression, OWLDataPropertyExpression From 4e30719814b6e26b4649d1c1bef595b428cef189 Mon Sep 17 00:00:00 2001 From: Alkid Date: Mon, 9 Sep 2024 16:12:46 +0200 Subject: [PATCH 40/44] Fixed circular imports --- owlapy/abstracts/abstract_owl_ontology.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/owlapy/abstracts/abstract_owl_ontology.py b/owlapy/abstracts/abstract_owl_ontology.py index c24f9176..2b8b5172 100644 --- a/owlapy/abstracts/abstract_owl_ontology.py +++ b/owlapy/abstracts/abstract_owl_ontology.py @@ -1,5 +1,5 @@ from abc import ABCMeta, abstractmethod -from typing import Final, Iterable, Union, Optional +from typing import Final, Iterable, Union, Optional, TypeVar from owlapy.class_expression import OWLClass from owlapy.iri import IRI @@ -7,9 +7,11 @@ OWLDataPropertyRangeAxiom, OWLObjectPropertyDomainAxiom, OWLObjectPropertyRangeAxiom, OWLAxiom from owlapy.owl_individual import OWLNamedIndividual from owlapy.owl_object import OWLObject -from owlapy.owl_ontology import _M, OWLOntologyID from owlapy.owl_property import OWLDataProperty, OWLObjectProperty +_M = TypeVar('_M', bound='OWLOntologyManager') # noqa: F821 +_OI = TypeVar('_OI', bound='OWLOntologyID') # noqa: F821 + class OWLOntology(OWLObject, metaclass=ABCMeta): """Represents an OWL 2 Ontology in the OWL 2 specification. @@ -136,7 +138,7 @@ def get_owl_ontology_manager(self) -> _M: pass @abstractmethod - def get_ontology_id(self) -> OWLOntologyID: + def get_ontology_id(self) -> _OI: """Gets the OWLOntologyID belonging to this object. Returns: From 8ecb9eb4c4577b6b63ee6910c39580c2e2f153ef Mon Sep 17 00:00:00 2001 From: Alkid Date: Mon, 9 Sep 2024 17:06:36 +0200 Subject: [PATCH 41/44] Added structural reasoner --- owlapy/owl_reasoner.py | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/owlapy/owl_reasoner.py b/owlapy/owl_reasoner.py index 289deb47..45d02bca 100644 --- a/owlapy/owl_reasoner.py +++ b/owlapy/owl_reasoner.py @@ -1153,11 +1153,13 @@ def __init__(self, ontology: Union[SyncOntology, str], reasoner="HermiT"): Args: ontology(SyncOntology): Ontology that will be used by this reasoner. - reasoner: Name of the reasoner. Possible values (case-sensitive): ["HermiT", "Pellet", "JFact", "Openllet"]. + reasoner: Name of the reasoner. Possible values (case-sensitive): ["HermiT", "Pellet", "JFact", "Openllet", + "Structural"]. Default: "HermiT". """ - assert reasoner in ["HermiT", "Pellet", "JFact", "Openllet"], \ - (f"'{reasoner}' is not implemented. Available reasoners: ['HermiT', 'Pellet', 'JFact', 'Openllet']. " + assert reasoner in ["HermiT", "Pellet", "JFact", "Openllet", "Structural"], \ + (f"'{reasoner}' is not implemented. Available reasoners: ['HermiT', 'Pellet', 'JFact', 'Openllet', " + f"'Structural']. " f"This field is case sensitive.") if isinstance(ontology, SyncOntology): self.manager = ontology.manager @@ -1194,7 +1196,7 @@ def __init__(self, ontology: Union[SyncOntology, str], reasoner="HermiT"): "InferredObjectPropertyCharacteristicAxiomGenerator": InferredObjectPropertyCharacteristicAxiomGenerator(), } - # () Create a reasoner for the loaded ontology + # () Create a reasoner using the ontology if reasoner == "HermiT": from org.semanticweb.HermiT import ReasonerFactory self._owlapi_reasoner = ReasonerFactory().createReasoner(self._owlapi_ontology) @@ -1208,6 +1210,9 @@ def __init__(self, ontology: Union[SyncOntology, str], reasoner="HermiT"): elif reasoner == "Openllet": from openllet.owlapi import OpenlletReasonerFactory self._owlapi_reasoner = OpenlletReasonerFactory().getInstance().createReasoner(self._owlapi_ontology) + elif reasoner == "Structural": + from org.semanticweb.owlapi.reasoner.structural import StructuralReasonerFactory + self._owlapi_reasoner = StructuralReasonerFactory().createReasoner(self._owlapi_ontology) else: raise NotImplementedError("Not implemented") From 25f08480eb16efc218741466c30fa2913e99e476 Mon Sep 17 00:00:00 2001 From: Alkid Date: Tue, 10 Sep 2024 12:33:50 +0200 Subject: [PATCH 42/44] turned 'abstracts' into a package --- owlapy/abstracts/__init__.py | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 owlapy/abstracts/__init__.py diff --git a/owlapy/abstracts/__init__.py b/owlapy/abstracts/__init__.py new file mode 100644 index 00000000..473f64d3 --- /dev/null +++ b/owlapy/abstracts/__init__.py @@ -0,0 +1,4 @@ +from .abstract_owl_ontology_manager import OWLOntologyManager, OWLOntologyChange, OWLOntology +from .abstract_owl_reasoner import OWLReasoner, OWLReasonerEx + +__all__ = ['OWLOntologyManager', 'OWLOntologyChange', 'OWLOntology', 'OWLReasoner', 'OWLReasonerEx'] From 612beb943b92b8cdf8ea21f0fe56e407367a4225 Mon Sep 17 00:00:00 2001 From: Alkid Date: Tue, 10 Sep 2024 13:41:14 +0200 Subject: [PATCH 43/44] new release --- README.md | 4 ++-- docs/conf.py | 2 +- docs/usage/main.md | 2 +- owlapy/__init__.py | 2 +- setup.py | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 3f4c24a5..53b448f1 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # OWLAPY [![Coverage](https://img.shields.io/badge/coverage-78%25-green)](https://dice-group.github.io/owlapy/usage/further_resources.html#coverage-report) -[![Pypi](https://img.shields.io/badge/pypi-1.2.0-blue)](https://pypi.org/project/owlapy/1.2.0/) -[![Docs](https://img.shields.io/badge/documentation-1.2.0-yellow)](https://dice-group.github.io/owlapy/usage/main.html) +[![Pypi](https://img.shields.io/badge/pypi-1.2.2-blue)](https://pypi.org/project/owlapy/1.2.2/) +[![Docs](https://img.shields.io/badge/documentation-1.2.2-yellow)](https://dice-group.github.io/owlapy/usage/main.html) ![OWLAPY](docs/_static/images/owlapy_logo.png) diff --git a/docs/conf.py b/docs/conf.py index 55a57422..84e52baf 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -13,7 +13,7 @@ project = 'OWLAPY' author = 'Ontolearn Team' -release = '1.2.0' +release = '1.2.2' # -- General configuration --------------------------------------------------- # https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration diff --git a/docs/usage/main.md b/docs/usage/main.md index fa94d25d..74916798 100644 --- a/docs/usage/main.md +++ b/docs/usage/main.md @@ -1,6 +1,6 @@ # About owlapy -**Version:** owlapy 1.2.0 +**Version:** owlapy 1.2.2 **GitHub repository:** [https://github.com/dice-group/owlapy](https://github.com/dice-group/owlapy) diff --git a/owlapy/__init__.py b/owlapy/__init__.py index bcbfb32b..e8bdfdff 100644 --- a/owlapy/__init__.py +++ b/owlapy/__init__.py @@ -3,4 +3,4 @@ from .parser import (dl_to_owl_expression as dl_to_owl_expression, manchester_to_owl_expression as manchester_to_owl_expression) from .converter import owl_expression_to_sparql as owl_expression_to_sparql -__version__ = '1.2.1' +__version__ = '1.2.2' diff --git a/setup.py b/setup.py index 80b77624..9aac5346 100644 --- a/setup.py +++ b/setup.py @@ -5,7 +5,7 @@ setup( name="owlapy", description="OWLAPY is a Python Framework for creating and manipulating OWL Ontologies.", - version="1.2.1", + version="1.2.2", packages=find_packages(), include_package_data=True, package_data={ From d4638254d30612f6c47f165f99c407b75c8c9c3d Mon Sep 17 00:00:00 2001 From: Alkid Date: Tue, 10 Sep 2024 14:08:20 +0200 Subject: [PATCH 44/44] version increase --- README.md | 4 ++-- docs/conf.py | 2 +- docs/usage/main.md | 2 +- owlapy/__init__.py | 2 +- setup.py | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 53b448f1..a7ca34b0 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # OWLAPY [![Coverage](https://img.shields.io/badge/coverage-78%25-green)](https://dice-group.github.io/owlapy/usage/further_resources.html#coverage-report) -[![Pypi](https://img.shields.io/badge/pypi-1.2.2-blue)](https://pypi.org/project/owlapy/1.2.2/) -[![Docs](https://img.shields.io/badge/documentation-1.2.2-yellow)](https://dice-group.github.io/owlapy/usage/main.html) +[![Pypi](https://img.shields.io/badge/pypi-1.3.0-blue)](https://pypi.org/project/owlapy/1.3.0/) +[![Docs](https://img.shields.io/badge/documentation-1.3.0-yellow)](https://dice-group.github.io/owlapy/usage/main.html) ![OWLAPY](docs/_static/images/owlapy_logo.png) diff --git a/docs/conf.py b/docs/conf.py index 84e52baf..dedc20f6 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -13,7 +13,7 @@ project = 'OWLAPY' author = 'Ontolearn Team' -release = '1.2.2' +release = '1.3.0' # -- General configuration --------------------------------------------------- # https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration diff --git a/docs/usage/main.md b/docs/usage/main.md index 74916798..7692a88f 100644 --- a/docs/usage/main.md +++ b/docs/usage/main.md @@ -1,6 +1,6 @@ # About owlapy -**Version:** owlapy 1.2.2 +**Version:** owlapy 1.3.0 **GitHub repository:** [https://github.com/dice-group/owlapy](https://github.com/dice-group/owlapy) diff --git a/owlapy/__init__.py b/owlapy/__init__.py index e8bdfdff..4f6b6692 100644 --- a/owlapy/__init__.py +++ b/owlapy/__init__.py @@ -3,4 +3,4 @@ from .parser import (dl_to_owl_expression as dl_to_owl_expression, manchester_to_owl_expression as manchester_to_owl_expression) from .converter import owl_expression_to_sparql as owl_expression_to_sparql -__version__ = '1.2.2' +__version__ = '1.3.0' diff --git a/setup.py b/setup.py index 9aac5346..b04bd1b3 100644 --- a/setup.py +++ b/setup.py @@ -5,7 +5,7 @@ setup( name="owlapy", description="OWLAPY is a Python Framework for creating and manipulating OWL Ontologies.", - version="1.2.2", + version="1.3.0", packages=find_packages(), include_package_data=True, package_data={