删除OWLAPI

时间:2017-10-21 04:44:42

标签: owl owl-api

我试图删除该班级的班级和公理。我尝试了不同的选择,无法按照我想要的方式工作。这是我的代码(它没有删除任何内容......):



if(clazz.toString().contains("2381")) {
        Stream<OWLClassAssertionAxiom> axiomstodelete = ontology.classAssertionAxioms(clazz);
        OWLEntityRemover remover = new OWLEntityRemover(Collections.singleton(ontology));
        axiomstodelete.forEach(i -> i.individualsInSignature().forEach(j -> j.accept(remover)));
        manager.applyChanges(remover.getChanges());
    }
&#13;
&#13;
&#13;

更新: 这段代码似乎适用于类和相关的公理删除:

OWLEntityRemover remover = new OWLEntityRemover(Collections.singleton(ontology));
currentClass.accept(remover);
manager.applyChanges(remover.getChanges());

现在,有一个条件,基于此条件我想删除特定类的所有子类(分支)。问题是我必须自下而上,因为我需要找到最低的&#34;条件为true的层次结构中的类。我使用这段代码:

&#13;
&#13;
currentClass = class_stack.pop();
removeClass(manager, clazz);
prevClass = class_stack.peek();
while(isBottom(reasoner, prevClass) && !class_stack.isEmpty() && !checkCondition(prevClass)) {
  currentClass = class_stack.pop();
  removeClass(manager, currentClass);
  prevClass = class_stack.peek();
}
&#13;
&#13;
&#13;

它适用于一个叶子,但它不适用于叶子的父级,因为父级的isBottom条件不是真的,即使在删除了所有子级之后也是如此。我现在有一个解决方法 - 在删除leaf后,保存本体,然后重新加载并删除下一个叶子等。很高兴能在一次运行中完成。

对于Ignazio - 这是一个分支示例,说明我为什么要检查底部(C代表具有真实条件的类,L代表其他类)。如果我上左分支:L(底部? - &gt;是 - &gt;删除) - &gt; L(底部? - &gt;是 - &gt;删除) - &gt; L(底部? - &gt; NO->暂时离开)。然后检查右侧分支:C(底部? - &gt;是&amp;&amp;条件? - &gt;是 - &gt;离开!)

    C
    |
    L
   / \
  L   L
 /     \
L       C

我需要的结果应该是:

C
|
L
|
L
|
C

1 个答案:

答案 0 :(得分:1)

您已选择要删除的公理。跳过已删除的实体,并在本体上使用remove方法。