如何循环遍历所有OWL实体并获得其所有嵌套元素?



我有一个需要用Java解析的owl文件。我正在使用Java OWL API。我读了这个文件,我能够返回所有的类和属性。

OWLOntologyManager manager=OWLManager.createOWLOntologyManager();
OWLOntology owl=manager.loadOntologyFromOntologyDocument(new File(myOWLFile));
System.out.println(owl.getAxiomCount());
java.util.Set<OWLEntity> entOnt = owl.getSignature();
for (OWLEntity a : entOnt) {
System.out.println("Entity "+a);//this print only the entities
}

但是,我需要跟踪每个实体中的所有嵌套元素。例如,如果这是owl文件:

<owl:Class rdf:about="#A">
<owl:equivalentClass rdf:resource="#B"/>
<rdfs:subClassOf rdf:resource="#C"/>
</owl:Class>
<owl:ObjectProperty rdf:about="#D">
<rdfs:range rdf:resource="#E"/>
<rdfs:domain rdf:resource="#F"/>
</owl:ObjectProperty>

我需要得到A类中的所有元素。我现在需要知道A包含B作为等价类和C作为子类。我需要打印如下内容:

Class: A has
B = Equivalent Class
C = Sub Class
Property: D has
E = Range
F = Domain

如何循环遍历所有owl实体并获得其所有嵌套元素?

嵌套元素只是OWL公理的XML结构化表示(OWL公理和RDF三元组之间的映射,其中XML片段是RDF/XML表示,可在W3C网站上获得)。

要访问公理并将它们分组在a中以获得类似于预期输出的结果,您将做一些类似于OWLAPI在保存本体时所做的事情:对于每个实体,检索该实体位于左侧的公理(例如,A subclassOf B是一个公理,其中a位于左侧)并相应地访问公理。

OWLAPI定义了一个OWLAxiomVisitor接口,您可以为感兴趣的公理类型实现它,例如:

owl.getClassesInSignature().forEach(c->{
Printer p=new Printer(c);
owl.getReferencingAxioms(c).forEach(axiom->axiom.accept(p));
});

打印机类:

import org.semanticweb.owlapi.model.*;
public class Printer implements OWLAxiomVisitor {
private OWLClassExpression e;
public Printer(OWLClassExpression e) {
this.e = e;
}
@Override
public void visit(OWLSubClassOfAxiom axiom) {
if (e.equals(axiom.getSubClass())) {
System.out.println(axiom.getSubClass() + " subClassOf" + axiom.getSuperClass());
} else {
System.out.println(axiom.getSubClass() + " superClassOf" + axiom.getSuperClass());
}
}
@Override
public void visit(OWLEquivalentClassesAxiom axiom) {
System.out.println(e + " equivalent to " + axiom.getClassExpressionsMinus(e));
}
...
}

最新更新