给定一个类表达式C,我想递归迭代它的嵌套类表达式,比如
A和R some P some B
A
R some P some B
P some B
可以使用OWLObject.getNestedClassExpressions()自下而上构建索引,但这似乎有点过分。有没有更好的方法(OWLAPI 4)?
答案 0 :(得分:0)
ExistentialCollector
是一个可以适合的例子。它只能通过交叉点进行递归,你需要通过所有表达式类型进行更改,但这是基本原则 - 在OWLAPI 5中,您可以使用components()
编写一个方法来遍历它们,但在OWLAPI 4中将不得不为每种表达式类型编写遍历方法。
public class ExistentialCollector extends OWLClassExpressionVisitorAdapter {
/* Collected axioms */
private final Map<OWLObjectPropertyExpression, Set<OWLClassExpression>> restrictions;
public ExistentialCollector(
Map<OWLObjectPropertyExpression, Set<OWLClassExpression>> restrictions) {
this.restrictions = restrictions;
}
@Override
public void visit(@Nonnull OWLObjectIntersectionOf ce) {
for (OWLClassExpression operand : ce.getOperands()) {
operand.accept(this);
}
}
@Override
public void visit(@Nonnull OWLObjectSomeValuesFrom ce) {
Set<OWLClassExpression> fillers = restrictions.get(ce.getProperty());
if (fillers == null) {
fillers = new HashSet<>();
restrictions.put(ce.getProperty(), fillers);
}
fillers.add(ce.getFiller());
}
}