如何检查 类 之间的 OWLObjectPropertyExpression 是否存在?

How to check if OWLObjectPropertyExpression between classes exists?

假设有两种类型的 classes,一种 (A) "isManagedBy" 另一种 (B)。以下 owl 片段说明了这种情况。类型A有多个classes(分别是"managed by" other classes)和B类型有多个classes。其实classes之间也有层次class是 A 和 B 类型的机器人。

<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"/>
...

问题:在给定任意 class A 的情况下获取所有 class 类型 B。

想法:遍历所有类型B的classes。对于每个class B,检查给定的A是否具有ObjectProperty "isManagedBy"(直接或继承)到class B 通过使用 Reasoner 的 isSatisfiable() 方法。

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
 }
}

不幸的是,推理器 returns 对所有类型 B 的 class 都是可满足的。

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

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

reasoner.getInstances(expression, false)

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

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

类似 reasoner.getSubClasses(expression, false) 的内容可能更接近您的期望。

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

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

  2. 与给定的 A 连接
  3. 如果您使用 FaCT++ 进行推理,您可以使用 OWLKnowledgeExplorerReasoner 界面来探索 class 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 */