OWL API:遍历导入的本体

时间:2019-05-04 05:15:31

标签: owl ontology owl-api pellet

我正在尝试将本体导入主要本体,并遍历所有类:

     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 个答案:

答案 0 :(得分:1)

问题中的代码包含一个错误:它没有将所需的导入本体(比萨饼)加载到管理器中。

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

这些行仅将owl:imports声明添加到Pizza-iri的本体标头(_:x a owl:Ontology)中。

要使代码正常工作,您需要分别加载披萨本体:

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

现在您可以检查所有导入和引用是否确实存在并且正确,因此,您的本体具有对Pizza本体的引用:

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 中)。