OWL API: прохождение импортированной онтологии - PullRequest
1 голос
/ 04 мая 2019

Я пытаюсь импортировать онтологию в основную онтологию и перебрать все классы:

     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);

Я запускаю этот код, чтобы получить все классы:

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

Классы, принадлежащие prim.owl, возвращаются, но классы в импортированной онтологии (pizza.owl) не возвращаются.

1 Ответ

1 голос
/ 06 мая 2019

Код в вопросе содержит ошибку: он не загружает желаемую импортированную онтологию (пиццу) в менеджер.

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

Эти строки просто добавляют объявление owl:imports в заголовок онтологии (_:x a owl:Ontology) для pizza-iri.

Чтобы код работал, вам нужно отдельно загрузить онтологию пиццы:

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));

Теперь вы можете проверить, что все импорта и ссылки действительно присутствуют и корректны, и, следовательно,ваша онтология имеет ссылку на онтологию пиццы:

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

Тогда вы можете получить все OWL-классы из обеих онтологий в виде одной коллекции или java-Stream:

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

Также, пожалуйста,примечание: метод Set<OWLClass> getClassesInSignature(boolean includeImportsClosure) устарел (в OWL-API v5 ).

...