Решить несоответствия в онтологии OWL
(Спасибо за комментарии, я обновляю свой код и вопрос. Может быть, это будет полезно для других.)
Обновить
Я делаю несколько процессов редактирования в одной онтологии, в конце я понял, что моя онтология противоречива. Теперь я должен избавиться от всех неудовлетворенных классов. Я много искал, но нет кода для устранения несоответствий.
Следуйте подходу этой статьи и библиотеки Мэтью Хорриджа, и я до сих пор борюсь с этой проблемой. Я обновляю свой код и вопрос, это мое решение. Есть ли еще предложения для этого?
Что я делаю, чтобы устранить несоответствия:
- Запустить рассуждение, чтобы найти неудовлетворительные классы
- Из всех неудовлетворительных классов найдите только корневые-неудовлетворительные классы.
- Найти объяснение аксиом для них
- Оцените их и выберите аксиомы, которые пользователь должен удалить (или переписать)
В приведенном ниже коде (с использованием других существующих решений) мне нужно только реализовать функцию ранга (оставленный открытый вопрос в средстве разрешения несоответствий).
Например, для моей онтологии в нем 25 неудовлетворительных классов, из которых только 2 являются корнем несоответствий. Эти 2 корневых класса, имеет 11 аксиом (которые я получаю по getExplanations
)
import java.io.File;
import java.util.Iterator;
import java.util.Set;
import org.semanticweb.owl.explanation.impl.rootderived.CompleteRootDerivedReasoner;
import org.semanticweb.owl.explanation.impl.rootderived.StructuralRootDerivedReasoner;
import org.semanticweb.owlapi.apibinding.OWLManager;
import org.semanticweb.owlapi.model.*;
import org.semanticweb.owlapi.reasoner.OWLReasoner;
import org.semanticweb.owlapi.reasoner.OWLReasonerFactory;
import com.clarkparsia.owlapi.explanation.BlackBoxExplanation;
import com.clarkparsia.owlapi.explanation.HSTExplanationGenerator;
import com.clarkparsia.pellet.owlapiv3.PelletReasonerFactory;
public class InconsistencyTest {
public static void main(String areg[]) throws Exception {
File fileM = new File("address\\to\\my\\ontology\\myOnt.owl");
OWLOntologyManager tempManager = OWLManager.createOWLOntologyManager();
OWLOntology ont = tempManager.loadOntologyFromOntologyDocument(fileM);
// run an reasoner
OWLReasonerFactory reasonerFactory = new PelletReasonerFactory();
OWLReasoner reasoner = reasonerFactory.createNonBufferingReasoner(ont);
if (reasoner.isConsistent()) {
// an ontology can be consistent, but have unsatisfiable classes.
if (reasoner.getUnsatisfiableClasses().getEntitiesMinusBottom().size() > 0) {
// means: an ontology is consistent but unsatisfiable!
System.out.println("The ontology FAILED satisfiability test with Pellet reasoner. \n Unsatisfiable classes detected: "
+ reasoner.getUnsatisfiableClasses().getEntitiesMinusBottom().size());
// This line return all unsatisfibaleClasses, but I do not need it
// Iterator<OWLClass> aList=reasoner.getUnsatisfiableClasses().getEntitiesMinusBottom().iterator();
// get root of unstaisfiableClasses, and get their explanations
BlackBoxExplanation bb = new BlackBoxExplanation(ont, reasonerFactory, reasoner);
HSTExplanationGenerator multExplanator = new HSTExplanationGenerator(bb);
CompleteRootDerivedReasoner rdr = new CompleteRootDerivedReasoner(tempManager, reasoner, reasonerFactory);
for (OWLClass cls : rdr.getRootUnsatisfiableClasses()) {
System.out.println("**** ROOT! " + cls);
int maxEntailment = 5;
Set<Set<OWLAxiom>> exSet = multExplanator.getExplanations(cls, maxEntailment);
OWLAxiom deletedAxiom = rankAxiom(exSet);
//return these axioms to user to delete or rewrite them
}
} else {
System.out.println("The ontology PASSED the consistency test.");
}
} else {
System.out.println("The ontology FAILED the consistency test, please review the Axioms or debug using Protege");
}
reasoner.dispose();
}
Я все правильно понимаю? Есть ли какие-либо предложения по ранжированию аксиом?
Большое спасибо