假设我们有这个本体:
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);
}
};
equivalentAxiom.accept(v);