package org.semanticweb.HermiT.examples; import java.io.File; import org.semanticweb.HermiT.Reasoner; import org.semanticweb.owlapi.apibinding.OWLManager; import org.semanticweb.owlapi.io.ToStringRenderer; import org.semanticweb.owlapi.model.IRI; import org.semanticweb.owlapi.model.OWLAxiom; import org.semanticweb.owlapi.model.OWLClass; import org.semanticweb.owlapi.model.OWLClassExpression; import org.semanticweb.owlapi.model.OWLDataFactory; import org.semanticweb.owlapi.model.OWLObjectProperty; import org.semanticweb.owlapi.model.OWLOntology; import org.semanticweb.owlapi.model.OWLOntologyManager; import org.semanticweb.owlapi.reasoner.Node; import org.semanticweb.owlapi.reasoner.NodeSet; import org.semanticweb.owlapi.util.SimpleRenderer; public class EntailmentChecking { public static void main(String[] args) throws Exception { // First, we create an OWLOntologyManager object. The manager will load and // save ontologies. OWLOntologyManager manager=OWLManager.createOWLOntologyManager(); // We will create several things, so we save an instance of the data factory OWLDataFactory dataFactory=manager.getOWLDataFactory(); // Now, we create the file from which the ontology will be loaded. // Here the ontology is stored in a file locally in the ontologies subfolder // of the examples folder. File inputOntologyFile = new File("examples/ontologies/pizza.owl"); // We use the OWL API to load the ontology. OWLOntology ontology=manager.loadOntologyFromOntologyDocument(inputOntologyFile); // First, create several OWL API objects that we will use in our queries OWLClass margherita=dataFactory.getOWLClass(IRI.create("http://www.co-ode.org/ontologies/pizza/pizza.owl#Margherita")); OWLObjectProperty hasTopping=dataFactory.getOWLObjectProperty(IRI.create("http://www.co-ode.org/ontologies/pizza/pizza.owl#hasTopping")); OWLClass mozzarellaTopping=dataFactory.getOWLClass(IRI.create("http://www.co-ode.org/ontologies/pizza/pizza.owl#MozzarellaTopping")); OWLClass goatsCheeseTopping=dataFactory.getOWLClass(IRI.create("http://www.co-ode.org/ontologies/pizza/pizza.owl#GoatsCheeseTopping")); OWLClassExpression mozarellaOrGoatsCheese=dataFactory.getOWLObjectUnionOf(mozzarellaTopping, goatsCheeseTopping); OWLClassExpression hasToppingMozarellaOrGoatsCheese=dataFactory.getOWLObjectSomeValuesFrom(hasTopping, mozarellaOrGoatsCheese); OWLAxiom axiom=dataFactory.getOWLSubClassOfAxiom(margherita, hasToppingMozarellaOrGoatsCheese); // Now we can start and create the reasoner. Lets this time use HermiT's native interface. // For this we don't need a factory. // The OWLReasoner interface is very similar though, it just has fewer methods Reasoner reasoner=new Reasoner(ontology); // Let us check whether the axiom is entailed: System.out.println("Do margherita pizzas have a topping that is morzarella or goats cheese? "+reasoner.isEntailed(axiom)); // Let us now also see what other (named) subclasses the complex superclass has // Setting the boolean flag to false means we are not only interested in direct subclasses // but also indirect ones // For printing the classes we want to make use of the abbreviations defined in the // ontology. We can set a suitable renderer in the OWL API that will then abbreviate // long IRIs for which there as a prefix declared in the ontology. SimpleRenderer renderer=new SimpleRenderer(); renderer.setPrefixesFromOntologyFormat(ontology, manager, true); ToStringRenderer.getInstance().setRenderer(renderer); NodeSet<OWLClass> subs=reasoner.getSubClasses(hasToppingMozarellaOrGoatsCheese, false); System.out.println("Subclasses of the complex class: "); for (Node<OWLClass> equivalents : subs.getNodes()) { // The node set contains several sets of classes // Each set contains classes that are equivalent to each other // (if there are any otherwise it is a singleton set) // here only owl:Nothing, which is a subclass of every class // has some eqivalents (other unsatisfiable classes) for (OWLClass equivalent : equivalents) { System.out.print(equivalent+" "); } System.out.println(); } } }