2 つのタイプのクラス、1 つ (A) が「isManagedBy」、もう 1 つ (B) であると仮定します。次のフクロウの抜粋は、このシナリオを示しています。タイプ A の複数のクラス (他のクラスによって「管理される」) と B の複数のクラスがあります。実際、タイプ A と B のクラス bot の間にも階層があります。
<owl:ObjectProperty rdf:about="#isManagedBy"/>
<owl:Class rdf:about="#FunctionManagement">
<rdfs:subClassOf rdf:resource="..."/>
<rdfs:subClassOf>
<owl:Restriction>
<owl:onProperty rdf:resource="#isManagedBy"/>
<owl:someValuesFrom rdf:resource="#SymposiumPlanner2013"/>
</owl:Restriction>
</rdfs:subClassOf>
</owl:Class>
<owl:Class rdf:about="#SymposiumPlanner2013"/>
...
問題: 任意のクラス A を指定して、タイプ B のすべてのクラスを取得します。
アイデア: タイプ B のすべてのクラスを反復処理します。クラス B ごとに、Reasoner の isSatisfiable() メソッドを使用して、指定された A にクラス B への ObjectProperty "isManagedBy" (直接または継承) があるかどうかを確認します。
OWLObjectProperty objProp = df.getOWLObjectProperty(IRI.create("#isManagedBy"));
OWLClassExpression expression;
for (OWLClass B : SetOfAllBs) {
expression = df.getOWLObjectIntersectionOf(A, df.getOWLObjectSomeValuesFrom(objProp, B));
if (reasoner.isSatisfiable(expression)) {
// do something
}
}
残念ながら、推論はタイプ B のすべてのクラスに対して満足できるものを返します。
質問: この問題を解決するにはどうすればよいですか?