删除 OWLAPI 中的特定 class 和公理

Deleting specific class and axioms in OWLAPI

我正在尝试删除 class 和那个 class 的公理。我尝试了不同的选择,但无法让它们按照我想要的方式工作。这是我的代码(它什么都不删除...):

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

更新: 此代码似乎适用于 class 和相关公理删除:

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

现在,有一个条件,基于此我想删除特定 class 的所有子classes(分支)。问题是我必须自下而上,因为我需要在层次结构中找到条件为真的 "lowest" class。我使用此代码:

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

它适用于一个叶子,但它不适用于叶子的父级,因为父级的 isBottom 条件不为真,即使它的所有子级都被删除。我现在有一个解决方法 - 删除叶子后,保存 ontology,然后再次重新加载并删除下一个叶子等。最好将其合并为一个 运行.

For Ignazio - 这是一个分支示例,显示了为什么我要检查底部(C 代表 class,条件为真,L - 对于其他 classes)。如果我上左分支: L (bottom?->yes->delete) -> L(bottom?->yes->delete) -> L (bottom?->NO->leave for now)。然后查看右分支:C(bottom?->yes && condition?->yes -> leave!)

    C
    |
    L
   / \
  L   L
 /     \
L       C

我需要的结果应该是:

C
|
L
|
L
|
C

您已经选择了要删除的公理。跳过删除的实体并在 ontology.

上使用 remove 方法