HermiT Resoner with Protege OWL API

1.3k views Asked by At

I'm using the Protege OWL API 4.3 (OWL API 3.4.2). It has the HermiT Reasoner Plugin installed wth it.

My problem is that whatever query I have for the reasoner, there is no output, it does not provide any instances.

This is how my ontology looks like:

    <Ontology xmlns="http://www.w3.org/2002/07/owl#"
 xml:base="http://www.semanticweb.org/sabse/ontologies/2013/11/untitled-ontology-17"
 xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
 xmlns:xsd="http://www.w3.org/2001/XMLSchema#"
 xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
 xmlns:xml="http://www.w3.org/XML/1998/namespace"
 ontologyIRI="http://www.semanticweb.org/sabse/ontologies/2013/11/untitled-ontology-17">
<Prefix name="" IRI="http://www.w3.org/2002/07/owl#"/>
<Prefix name="owl" IRI="http://www.w3.org/2002/07/owl#"/>
<Prefix name="rdf" IRI="http://www.w3.org/1999/02/22-rdf-syntax-ns#"/>
<Prefix name="xsd" IRI="http://www.w3.org/2001/XMLSchema#"/>
<Prefix name="rdfs" IRI="http://www.w3.org/2000/01/rdf-schema#"/>
<Declaration>
    <Class IRI="#Person"/>
</Declaration>
<Declaration>
    <Class IRI="#PersonWithPosition1"/>
</Declaration>
<Declaration>
    <DataProperty IRI="#position"/>
</Declaration>
<Declaration>
    <NamedIndividual IRI="#mary"/>
</Declaration>
<Declaration>
    <NamedIndividual IRI="#peter"/>
</Declaration>
<EquivalentClasses>
    <Class IRI="#PersonWithPosition1"/>
    <ObjectIntersectionOf>
        <Class IRI="#Person"/>
        <DataHasValue>
            <DataProperty IRI="#position"/>
            <Literal datatypeIRI="http://www.w3.org/2001/XMLSchema#integer">1</Literal>
        </DataHasValue>
    </ObjectIntersectionOf>
</EquivalentClasses>
<SubClassOf>
    <Class IRI="#PersonWithPosition1"/>
    <Class IRI="#Person"/>
</SubClassOf>
<ClassAssertion>
    <Class IRI="#Person"/>
    <NamedIndividual IRI="#mary"/>
</ClassAssertion>
<ClassAssertion>
    <Class IRI="#Person"/>
    <NamedIndividual IRI="#peter"/>
</ClassAssertion>
<DataPropertyAssertion>
    <DataProperty IRI="#position"/>
    <NamedIndividual IRI="#mary"/>
    <Literal datatypeIRI="http://www.w3.org/2001/XMLSchema#int">1</Literal>
</DataPropertyAssertion>
<DataPropertyAssertion>
    <DataProperty IRI="#position"/>
    <NamedIndividual IRI="#peter"/>
    <Literal datatypeIRI="http://www.w3.org/2001/XMLSchema#int">2</Literal>
</DataPropertyAssertion>
<DataPropertyDomain>
    <DataProperty IRI="#position"/>
    <Class IRI="#Person"/>
</DataPropertyDomain>
<DataPropertyRange>
    <DataProperty IRI="#position"/>
    <Datatype abbreviatedIRI="xsd:int"/>
</DataPropertyRange>

and this is my code:

    public class OWLAPIDemoApplication {

public static void main(String[] args) {

    OWLOntologyManager manager = OWLManager.createOWLOntologyManager();

    try {
        OWLOntology ontology;
        File file = new File("ontology.owl");
        ontology = manager.loadOntologyFromOntologyDocument(file);
        System.out.println("Loaded ontology: " + ontology);

        // Create an HermiT reasoner.

        Reasoner reasoner = new Reasoner(ontology);

        OWLDataFactory factory = manager.getOWLDataFactory();

        PrefixManager pm = new DefaultPrefixManager("#");

        // Get reference to the class PersonWithinPosition1
        OWLClass person = factory.getOWLClass(":Person", pm);

        OWLDataProperty position = factory.getOWLDataProperty(":position",
                pm);

        OWLClassExpression query = factory.getOWLObjectIntersectionOf(
                person,
                factory.getOWLDataHasValue(position,
                        factory.getOWLLiteral(1)));

        // Create a fresh name for the query.
        OWLClass newName = factory.getOWLClass(IRI.create("temp001"));

        // Make the query equivalent to the fresh class
        OWLAxiom definition = factory.getOWLEquivalentClassesAxiom(newName,
                query);
        manager.addAxiom(ontology, definition);

        manager.saveOntology(ontology, new SystemOutDocumentTarget());

        reasoner.flush();

        NodeSet<OWLNamedIndividual> w = reasoner
                .getInstances(newName, true);

        Set<OWLNamedIndividual> e;

        for (Node<OWLNamedIndividual> n : w) {

            for (OWLNamedIndividual i : n.getEntities()) {
                System.out.println(i.getIRI().toString());
            }

        }

        // After you are done with the query, you should remove the
        // definition
        manager.removeAxiom(ontology, definition);

        reasoner.dispose();

    } catch (OWLOntologyCreationException | OWLOntologyStorageException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}

} 2 The query looks for persons that have the position "1". The System.out.println should show the individual "Mary", but there are no results. Can someone please tell what I am missing? I think I did everything accoring to http://code.google.com/p/elk-reasoner/wiki/QueryingComplexClasses . The code is almost 1:1.

Cheers, S.

1

There are 1 answers

0
Ignazio On BEST ANSWER

You are creating the reasoner manually rather than through its factory. This might leave it not listening for updates on the ontology, so the call to reasoner.flush() might not work. Try using Reasoner.ReasonerFactory to create instances and see if this fixes your issue.

Another possibility is that the IRIs in your code do not match those in the ontology. Make sure they do by printing out your IRIs and those in ontology.getSignature().

Edit: the second possibility is confirmed. I copied your ontology fragment and your code in a test. The class IRIs in your ontology are:

<http://www.semanticweb.org/sabse/ontologies/2013/11/untitled-ontology-17#Person>
<http://www.semanticweb.org/sabse/ontologies/2013/11/untitled-ontology-17#PersonWithPosition1>

The Person class in your code has IRI:

<#Person>

The mismatch is caused by the prefix manager having "#" as default namespace. That is not the default namespace of your ontology.