我试图检查本体的一致性。本体仅包括对个体的描述,类和语义规则由导入的本体描述。
我使用isConsistenct方法将是正确的选择。
OWLReasonerFactory reasonerFactory = new StructuralReasonerFactory();
OWLReasoner reasoner = reasonerFactory.createNonBufferingReasoner(mergedOntology);
if(reasoner.isConsistent()){
return "Merged ontology PASSED the consistency test";
}else{
return "Ontology FAILED the consistency test";
}
检查本体的一致性的正确方法是什么,例如Protege 5在启动推理器时适用?
使用Pellet进行代码更新
OWLReasonerFactory reasonerFactory = new PelletReasonerFactory();
OWLReasoner reasoner = reasonerFactory.createNonBufferingReasoner(mergedOntology);
String answer = "";
if(reasoner.isConsistent()){
if(reasoner.getUnsatisfiableClasses().getEntitiesMinusBottom().size()>0){
answer = "Merged ontology FAILED satisfiability test. Unsatisfiable classes detected: " + reasoner.getUnsatisfiableClasses().getEntitiesMinusBottom().size();
}
answer = "Merged ontology PASSED the consistency test";
}else{
answer = "Merged ontology FAILED the consistency test, please review the Axioms or debug using Protege";
//FYI an example how to implement a working debugger can be found on sourceforge's OWL API page under Debugger
}
reasoner.dispose();
return answer;
答案 0 :(得分:2)
方法是正确的,但使用StructuralReasonerFactory是一个问题。那个推理者没有真正的推理,它只是使用断言的公理来回答一些基本的问题。它无法检查一致性。
您需要使用真正的推理器来执行一致性检查。有一些已经支持OWLAPI 4的推荐者,请参阅https://github.com/owlcs/owlapi/wiki
答案 1 :(得分:0)
Protege也在使用某种isConsistent
方法。根据您所引用的版本,此方法或者由开发人员构建,或者使用在OWL API中开发的方法。例如,请查看this。但是,当您在Protege中运行推理器时,inConsistent
和isSatisfiable
方法都会被触发。所以你看到的是两个动作的结果。如果需要,请阅读以下blog post以了解差异。要点是:
因此,虽然我们可以在一致的本体中具有不可满足的类,但是不一致的本体中的所有类都是不可满足的,因为不一致的本体只是没有模型,因此它不能具有任何给定类的实例。
如果你想找到不可满足的类,你只需要在所有类上调用isSatisfiable
方法:
reasoner.isSatisfiable(className);