假设我们有这个本体:
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 equalAxiom = owlOnt.equivalentClassesAxioms(B);
OWLObjectVisitor v = new 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);
关于java - OWLApi 访客模式 : get superClass axiom,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59971857/