假设我们有这个本体:
Class A:
equivalentTo: hasRel D
Class B:
equivalentTo: A and hasRel C
Class C
Class D
ObjectProperty: hasRel
使用访问者模式获取
hasRel C
公理(作为OWLObjectSomeValuesFrom
): OWLEquivalentClassesAxiom equivalentAxiom = owlOnt.equivalentClassesAxioms(B);
OWLObjectVisitor v = new OWLObjectVisitor() {
public void visit(OWLEquivalentClassesAxiom ax) {
ax.classExpressions().forEach(c -> c.accept(this));
}
public void visit(OWLObjectSomeValuesFrom ce) {
String property = ce.getProperty().toString();
String filler = ce.getFiller().toString();
System.out.println(property);
System.out.println(filler);
}
};
equivalentAxiom.accept(v);
但是此代码没有适当的
visit
方法来遍历类A
。我需要有这样的输出:
hasRel D
hasRel C
最佳答案
查看您的代码,访问者看起来正确,应该输出您需要的内容。但是,您仅将其应用于包含B
的公理。将其应用于所有等效的类公理,并查看其是否产生预期的结果。
编辑:在没有本体可用的情况下,访问者无法访问本体中的其他公理-这是因为A
不会链接到使用它的公理。该关系保存在本体索引中。
因此,访问者需要访问本体并查找等效的公理,这些公理包含根公理中涉及的命名类。
OWLEquivalentClassesAxiom equivalentAxiom = owlOnt.equivalentClassesAxioms(B);
OWLObjectVisitor v =新的OWLObjectVisitor(){
public void visit(OWLEquivalentClassesAxiom ax) {
ax.classExpressions().forEach(c -> c.accept(this));
ax.getNamedClasses().forEach(c -> owlOnt.equivalentClassesAxioms(c).forEach(q->q.accept(this)));
}
public void visit(OWLObjectSomeValuesFrom ce) {
String property = ce.getProperty().toString();
String filler = ce.getFiller().toString();
System.out.println(property);
System.out.println(filler);
}
};
等效的Axiom.accept(v);