benhid
benhid

Reputation: 134

Is object property functional?

I am using the OWL-API 5 to load all the object property axioms in my ontology as follows:

File ontology = new File("examples/ontology.owl");
File individual = new File("examples/individuals.owl");
OWLOntologyManager manager = OWLManager.createOWLOntologyManager();

IRI documentIRI = IRI.create(ontology);
IRI ontologyIRI = IRI.create("http://www.semanticweb.org/2020/0/test");

SimpleIRIMapper mapper = new SimpleIRIMapper(ontologyIRI, documentIRI);
manager.getIRIMappers().add(mapper);

OWLOntology kb = manager.loadOntologyFromOntologyDocument(individual);

Stream<OWLObjectPropertyAssertionAxiom> objectPropertyAxioms = kb.axioms(AxiomType.OBJECT_PROPERTY_ASSERTION);
objectPropertyAxioms.forEach(axiom -> {
    System.out.println("Found object property axiom " + axiom);

    OWLIndividual object = axiom.getObject();
    OWLIndividual subject = axiom.getSubject();
    OWLObjectPropertyExpression property = axiom.getProperty();
});

Returns:

Found object property axiom ObjectPropertyAssertion(<http://www.semanticweb.org/2020/0/test#Q> <http://www.semanticweb.org/2020/0/test#x> <http://www.semanticweb.org/2020/0/test#y>)

Now, I'd like to determine if the property is functional. This is what I tried so far:

if (EntitySearcher.isFunctional(property, kb)) {
    LOGGER.debug("Property " + property + " is declared as functional");
} else {
    LOGGER.debug("Property " + property + " is NOT declared as functional");
}

Returns:

Property <http://www.semanticweb.org/2020/0/test#Q> is NOT declared as functional

I think that EntitySearcher.isFunctional(p,o) is looking for functional object property axioms that make the specified object property functional, which doesn't seems to exist in my ontology (i.e., ontology.axioms(AxiomType.FUNCTIONAL_OBJECT_PROPERTY) returns nothing).


This is what I have in my ontology:

<?xml version="1.0"?>
<rdf:RDF xmlns="http://www.semanticweb.org/2020/0/test#" xml:base="http://www.semanticweb.org/2020/0/test" xmlns:owl="http://www.w3.org/2002/07/owl#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:xml="http://www.w3.org/XML/1998/namespace" xmlns:xsd="http://www.w3.org/2001/XMLSchema#" xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#">
    <owl:Ontology rdf:about="http://www.semanticweb.org/2020/0/test"/>

    <owl:ObjectProperty rdf:about="http://www.semanticweb.org/2020/0/test#Q">
        <rdf:type rdf:resource="http://www.w3.org/2002/07/owl#FunctionalProperty"/>
    </owl:ObjectProperty>
</rdf:RDF>

And individuals:

<?xml version="1.0"?>
<rdf:RDF xmlns="http://www.semanticweb.org/2020/0/test#" xmlns:owl="http://www.w3.org/2002/07/owl#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:xml="http://www.w3.org/XML/1998/namespace" xmlns:xsd="http://www.w3.org/2001/XMLSchema#" xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#">
    <owl:Ontology rdf:about="">
        <owl:imports rdf:resource="http://www.semanticweb.org/2020/0/test"/>
    </owl:Ontology>

    <owl:NamedIndividual rdf:about="http://www.semanticweb.org/2020/0/test#x">
        <Q rdf:resource="http://www.semanticweb.org/2020/0/test#y"/>
    </owl:NamedIndividual>

    <owl:NamedIndividual rdf:about="http://www.semanticweb.org/2020/0/test#y"/>
</rdf:RDF>

(Both files were created using Prótegé 5.5.0). Any suggestions? Thank you.

Upvotes: 0

Views: 199

Answers (1)

Ignazio
Ignazio

Reputation: 10684

To answer the implicit question about EntitySearcher::isFunctional, yes, it checks if there are functional property axioms for the property received in input.

I believe your ontology has enough information for that.

To provide a complete example:

<?xml version="1.0"?>
<rdf:RDF xmlns="http://www.semanticweb.org/2020/0/test#" xml:base="http://www.semanticweb.org/2020/0/test" xmlns:owl="http://www.w3.org/2002/07/owl#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:xml="http://www.w3.org/XML/1998/namespace" xmlns:xsd="http://www.w3.org/2001/XMLSchema#" xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#" xmlns:test="http://www.semanticweb.org/owlapi/test#">
    <owl:Ontology rdf:about="http://www.semanticweb.org/2020/0/test"/>
    <owl:ObjectProperty rdf:about="http://www.semanticweb.org/owlapi/test#Q">
        <rdf:type rdf:resource="http://www.w3.org/2002/07/owl#FunctionalProperty"/>
    </owl:ObjectProperty>
    <owl:NamedIndividual rdf:about="http://www.semanticweb.org/owlapi/test#x">
        <test:Q rdf:resource="http://www.semanticweb.org/owlapi/test#y"/>
    </owl:NamedIndividual>
    <owl:NamedIndividual rdf:about="http://www.semanticweb.org/owlapi/test#y"/>
</rdf:RDF>

With this ontology, EntitySearcher returns true when checking for functional properties.

Edit: in your updated question, you're using kb.axioms(AxiomType), you need to tell it to include imports.

Upvotes: 1

Related Questions