alex
alex

Reputation: 7895

OWL API: Traverse imported ontology

I'm trying to import an ontology to the primary ontology, and traverse over all classes:

     manager = OWLManager.createOWLOntologyManager();
            ontology = manager.loadOntologyFromOntologyDocument(new File("data/prim.owl"));
            factory = manager.getOWLDataFactory();
            OWLImportsDeclaration im = factory.getOWLImportsDeclaration(IRI.create("https://protege.stanford.edu/ontologies/pizza/pizza.owl"));
            manager.applyChange(new AddImport(ontology,im));
            reasoner = OpenlletReasonerFactory.getInstance().createReasoner(ontology);

I’m running this code to get all classes:

      //*********************
            Set<OWLClass> allCls = ontology.getClassesInSignature();
            allCls.forEach(System.out::println);

Classes belonging to prim.owl are returned, but classes in the imported ontology (pizza.owl) are not returned.

Upvotes: 2

Views: 387

Answers (1)

ssz
ssz

Reputation: 835

The code in the question contains a mistake: it does not load the desired imported ontology (pizza) into the manager.

OWLImportsDeclaration im = factory.getOWLImportsDeclaration(IRI.create("https://protege.stanford.edu/ontologies/pizza/pizza.owl"));
manager.applyChange(new AddImport(ontology,im));

These lines just add the owl:imports declaration into the ontology header (_:x a owl:Ontology) for the pizza-iri.

To make the code work, you need to load the pizza-ontology separately:

OWLOntology pizza = manager.loadOntology(IRI.create("https://protege.stanford.edu/ontologies/pizza/pizza.owl"));
OWLImportsDeclaration im = factory.getOWLImportsDeclaration(pizza.getOntologyID().getOntologyIRI().orElseThrow(AssertionError::new));
manager.applyChange(new AddImport(ontology, im));

Now you can check that all imports and references are really present and correct, and, therefore, your ontology has a reference to the pizza ontology:

Assert.assertEquals(1, ontology.importsDeclarations().count());
Assert.assertEquals(1, ontology.imports().count());
Assert.assertEquals(2, manager.ontologies().count());

Then you can get all OWL-classes from both ontologies as a single collection or java-Stream:

ontology.classesInSignature(Imports.INCLUDED).forEach(System.err::println);

Also please note: the method Set<OWLClass> getClassesInSignature(boolean includeImportsClosure) is deprecated (in OWL-API v5).

Upvotes: 1

Related Questions