如何使用OWLAPI递归嵌套类表达式?

时间:2018-03-06 10:28:37

标签: owl-api

给定一个类表达式C,我想递归迭代它的嵌套类表达式,比如

  • A和R some P some B

    • A

    • R some P some B

      • P some B

可以使用OWLObject.getNestedClassExpressions()自下而上构建索引,但这似乎有点过分。有没有更好的方法(OWLAPI 4)?

1 个答案:

答案 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());
}
}