オントロジーが一貫しているかどうかを確認しようとしています。オントロジーは一貫している可能性がありますが、それでも満足できないクラスがいくつかある可能性があります。ケース Aとしましょう。
しかし、私の問題は、オントロジーが一貫性テストに合格できない場合、つまり一貫性がない場合です (ケース B )。私の問題は、ケース Bでオントロジーの満たされないクラスを取得できないことです。
私の最終的な目的は、満たされないクラスを処理してそれらにいくつかの変更を加え、一貫性のないオントロジーを矛盾するオントロジーにすることです。したがって、ケース A (満足できないクラスにアクセスできる) の目的を達成できます。それらを処理し、それらの一部を修正します。しかし、今、私はケース Bのために何ができるでしょうか?
次のコードは、これら 2 つのケースを示しています。
OWLReasonerFactory reasonerFactory = new PelletReasonerFactory();
OWLReasoner reasoner = reasonerFactory.createNonBufferingReasoner(myOntology);
if (reasoner.isConsistent()) {
if (reasoner.getUnsatisfiableClasses().getEntitiesMinusBottom().size() > 0) {
System.out.println("ontology is consistent but has unsatisfiable classes! FAILED");
// CASE A
} else {
System.out.println("ontology is consistent and safe without any unsatisfiable classes! PASSED");
}
} else {
System.out.println("ontology is inconsistent!FAILED");
// CASE B
}
ケース Bの場合、どうすればよいですか? hereには、次のように書かれています。
満足できないクラスを見つけたい場合は、すべてのクラスで isSatisfiable メソッドを呼び出すだけです。
reasoner.isSatisfiable(className);
Case Bに次のコードを入れます。
Iterator<OWLClass> cAll = myOntology.getClassesInSignature().iterator();
while (cAll.hasNext()) {
OWLClass c = cAll.next();
if (!reasoner.isSatisfiable(c)) {
System.out.println("class " + c + "is not satisfibale");
}
}
しかし、次のようにエラーが発生します。
Exception in thread "main" org.semanticweb.owlapi.reasoner.InconsistentOntologyException: Inconsistent ontology
at com.clarkparsia.pellet.owlapiv3.PelletReasoner.convert(PelletReasoner.java:360)
at com.clarkparsia.pellet.owlapiv3.PelletReasoner.isSatisfiable(PelletReasoner.java:890)
では、ケース Bのオントロジーをどのように処理できますか?
アップデート
@Ignazio のコメントに基づいて、私の質問のコードの //CASE B の代わりに、この新しい関数を呼び出します。
public static void run(OWLOntology myOnt) {
// save the Tbox and Abox of the original ontology
Set<OWLAxiom> originalTboxAxioms = myOnt.getTBoxAxioms(true);
Set<OWLAxiom> originalAboxAxioms = myOnt.getABoxAxioms(true);
// create new empty ontology
String name = "local_path//name.owl";
OWLOntologyManager manager = OWLManager.createOWLOntologyManager();
File fileM = new File(name);
OWLOntology newOntology = null;
try {
newOntology = manager.createOntology(IRI.create(fileM));
} catch (OWLOntologyCreationException e) {
e.printStackTrace();
}
// add only Tboxes from the orginal ontology to the new one
manager.addAxioms(newOntology, originalTboxAxioms);
// checking the consistency of the new ontology which contain only tbox
OWLReasonerFactory reasonerFactory = new PelletReasonerFactory();
Configuration configuration = new Configuration();
configuration.throwInconsistentOntologyException = false;
OWLReasoner reasoner = reasonerFactory.createNonBufferingReasoner(newOntology, configuration);
if (reasoner.isConsistent()) {
Set<OWLClass> unSat = reasoner.getUnsatisfiableClasses().getEntitiesMinusBottom();
if (unSat.size() > 0) {
Iterator<OWLClass> unClassList = unSat.iterator();
Set<OWLClass> listOfUnsatisfiableClasses = new HashSet<OWLClass>();
while (unClassList.hasNext()) {
/*
* if the unsatisfiable class appear in the original Abox,
* we mark it as an unsatisfiable class
*/
OWLClass myClass = unClassList.next();
Iterator<OWLAxiom> iter = originalAboxAxioms.iterator();
while (iter.hasNext()){
OWLAxiom ax = iter.next();
if (ax.getClassesInSignature().contains(myClass)){
listOfUnsatisfiableClasses.add(myClass);
}
}
}
System.out.println("number of unsatisfiable classes: " + listOfUnsatisfiableClasses.size());
}
}
System.out.println("The ontology is inconsistent but does not have any unsatisfiable classes!!!!!");
}
この新機能でも、満足のいくカラスは見つかりません!
@Ignazioが投稿したコードも試しました。そこにある特定の例では、そのコードは数秒で実行されますが、私の小さな一貫性のないオントロジーでは、1 日経っても結果は出力されません。
正当化セットと一緒に満足できないクラスを取得する方法について、これ以上のアイデアはありますか?