Удалить аннотацию онтологии с помощью OWLAPI

Я пытаюсь удалить некоторые буквальные аннотации из онтологии, используя OWLAPI версии 4.0.2 (от Maven)

Для этого я использую класс RemoveOntologyAnnotation и метод менеджера applyChange(). Вот (упрощенный) код, который я использую:

    OWLOntologyManager m = OWLManager.createOWLOntologyManager();
    OWLOntology ontology = null;
    File ontologyFile = new File(ontologyFileName);
    try {
        ontology = m.loadOntologyFromOntologyDocument(ontologyFile);
    } catch (OWLOntologyCreationException e) {
        e.printStackTrace();
    }
    for (OWLClass cls : ontology.getClassesInSignature()) {
        for (OWLAnnotation annotation : EntitySearcher.getAnnotations(cls.getIRI(), ontology)) {
            if (annotation.getValue() instanceof OWLLiteral) {
                RemoveOntologyAnnotation rm = new RemoveOntologyAnnotation(ontology, annotation);
                System.out.println(m.applyChange(rm));
            }
        }
    }

Метод applyChange() всегда возвращает «НЕУСПЕШНО». И я не смог найти никакой документации о том, почему удаление аннотации не работает.

NB: нашел некоторые указания здесь http://sourceforge.net/p/owlapi/mailman/message/28203984/ Где это работает


person vemonet    schedule 21.04.2015    source источник
comment
Аннотации онтологии — это аннотации, прикрепленные к самой онтологии IRI; то, что вам нужно, - это утверждения аннотаций. @dhke уже дал хороший ответ о том, как это сделать   -  person Ignazio    schedule 22.04.2015


Ответы (1)


Как также отмечено в ветке списка рассылки, связанной с вашим вопросом, аннотации к онтологиям и аннотации к элементам онтологии - это две разные вещи.

RemoveOntologyAnnotation удаляет только аннотации самой онтологии.

Аннотации элементов представлены с помощью аксиом, в частности OWLAnnotationAssertionAxioms: Следовательно, их необходимо удалить с помощью OWLOntologyManager.removeAxiom() или аналогичные средства:

for (OWLClass cls : ontology.getClassesInSignature()) {
    for (OWLAnnotationAssertionAxiom annAx : EntitySearcher.getAnnotationAssertionAxioms(cls.getIRI(), ontology)) {
        if (annAx.getValue().getValue() instanceof OWLLiteral) {
            m.removeAxiom(annAx);
        }
    }
}
person dhke    schedule 21.04.2015
comment
Вы также можете использовать new RemoveAxiom(annAx) для каждого изменения, затем собирать изменения и применять их все сразу, точно так же, как @Djast сделал в исходном вопросе. - person Ignazio; 22.04.2015
comment
Спасибо за ответ! Раньше я пытался удалить аксиому аннотации, но мне удалось удалить только аксиому класса... - person vemonet; 22.04.2015