Question

In OWLAPI I have a problem with ontology imported through owl:imports statement. The problem is that instances of class and class annotations included in imported ontology are not retrieved and returned.

Lets say I have ontology Rooms and ontology Buildings.

In ontology Rooms I have then following statement which is supposed to load Buildings ontology into Rooms ontology.

<owl:Ontology rdf:about="http://example.com/rooms.xml">
    <owl:imports rdf:resource="http://example.com/buildings.xml"/>
</owl:Ontology>

Then in OWLAPI I load ontology Rooms (which should automatically contain Buildings)

manager = OWLManager.createOWLOntologyManager()
roomsOntology = manager.loadOntologyFromOntologyDocument(IRI.create("http://example.com/rooms.xml"))
reasoner = Reasoner.new(roomsOntology)
factory = manager.getOWLDataFactory()

After that retrieving a class from Buildings ontology still works as expected:

buildingClass = factory.getOWLClass(IRI.create("http://example.com/buildings.xml#Building"))

When I want to get instances of class Building (definitions of these instances are included in imported Buildings ontology), then it returns nothing:

instances = buildingClass.getIndividuals(roomsOntology)

Variable 'instances' is empty now.

Same problem is with class annotations if a definition of such a class is included in Buildings ontology.

I'm able to make it work when:

  1. I move instances definitions directly to Rooms ontology (this is not possible in production since I will have 2 separated ontologies anyway)
  2. I use function of Reasoner class (reasoner.getInstances(buildingClass, true) returns instances from both ontologies)
  3. I pass imported ontology to getIndividuals function instead of main (Rooms) ontology (buildingClass.getIndividuals(manager.getImports(roomsOntology)))

Workaround no. 1 is not possible to make for me (it was only for testing purposes). No. 2 and 3 do not work when I need to retrieve annotations, because there is not possible to pass multiple ontologies to OWLClass.getAnnotations function and also Reasoner has no function to get annotations.

Anyway I thought that everything should work without these workarounds since all ontologies, including imported ones, are loaded at the beginning with manager.loadOntologyFromOntologyDocument function.

Was it helpful?

Solution

The issue is that owlClass.getIndividuals(OWLOntology) does not include the imports closure. If you wish to include the imports closure, you need to use another method:

Set<OWLIndividual> getIndividuals(Set<OWLOntology> ontologies);

The set of ontologies can be any set; to use the imports closure, use

ontology.getImportsClosure()

Note that this will return, in all cases, only the individuals asserted to be long to the class. If inference is needed, you will need to use a reasoner, as you mentioned.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top