假设有两种类型的类,一种(A)由另一种(B)“isManagedBy”。下面的猫头鹰截图说明了这种情况。有多个 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 的类都返回可满足的结果。
问题:如何解决这个问题?