我正在尝试将本体论导入主要本体论,并在所有类中遍历:
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
(中的类。
问题中的代码包含一个错误:它不会将所需的导入本体(比萨饼(加载到管理员中。
OWLImportsDeclaration im = factory.getOWLImportsDeclaration(IRI.create("https://protege.stanford.edu/ontologies/pizza/pizza.owl"));
manager.applyChange(new AddImport(ontology,im));
这些行只需将owl:imports
声明添加到披萨-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));
现在,您可以检查所有导入和参考是否确实存在和正确,因此,您的本体论提到了披萨本体:
Assert.assertEquals(1, ontology.importsDeclarations().count());
Assert.assertEquals(1, ontology.imports().count());
Assert.assertEquals(2, manager.ontologies().count());
然后,您可以从两个本体学或Java-stream中获得所有猫头鹰类:
ontology.classesInSignature(Imports.INCLUDED).forEach(System.err::println);
另外,请注意:将方法Set<OWLClass> getClassesInSignature(boolean includeImportsClosure)
弃用(在OWL-API v5 中(。