我正在尝试将本体导入主要本体,并遍历所有类:
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
)中的类。
答案 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 中)。