0

假设有两种类型的类,一种(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 的类都返回可满足的结果。

问题:如何解决这个问题?

4

2 回答 2

1

我可以为您的问题提出两种解决方案:

  1. 遍历所有 B,而是检查 的可满足性 A and (isManagedBy only (not B))。如果这个表达式对于某些 B 是不可满足的,那么这样的 B 必须与给定的 A via 连接isManagedBy

  2. 如果您使用 FaCT++ 进行推理,您可以使用该OWLKnowledgeExplorerReasoner接口来探索在类 A 的可满足性检查期间生成的模型。想法是,如果模型中存在这样的 B,那么它必须连接到 A。有一些限制(它可能不适用于通过 EquivalentClasses(B,...) 定义的 B,对于非确定性标签并不总是如此(请参阅 getObjectLabel() 调用中的标志 true),但这是一个想法。代码可能看起来像:

    OWLReasoner factplusplus = new FactPlusPluReasonerFactore().createReasoner(o);
    OWLKnowledgeExplorerReasoner ke = (OWLKnowledgeExplorerReasoner) factplusplus;
    RootNode nodeForA = ke.getRoot(A);
    for (RootNode filler: ke.getObjectNeighbours(nodeForA, isManagedBy))
        for (OWLClassExpression cls: ke.getObjectLabel(filler,true)
            if ( SetAllBs.contains(cls) )
                /* cls is what you are looking for */
    
于 2015-02-24T00:07:12.373 回答
1

您不想在这里检查可满足性,因为它只会告诉您是否能够拥有该类的实例。你所追求的是它的实际实例。由于可能存在类层次结构,因此您希望使用:

reasoner.getInstances(expression, false)

这将为您提供直接和间接的实例。

编辑:从评论来看,您似乎是在 isManagedBy 的域中的 A 的子类之后,或者对 isManagedBy 的限制将 B 的子类作为范围。

类似的东西reasoner.getSubClasses(expression, false)可能更接近您期望看到的东西。

于 2015-02-23T07:22:45.007 回答