【问题标题】:How to check if OWLObjectPropertyExpression between classes exists?如何检查类之间是否存在OWL ObjectProperty Expression?
【发布时间】:2015-04-24 01:37:40
【问题描述】:

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

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

【问题讨论】:

  • 这是什么意思:“有多个类型 A 的类(由其他类“管理”)和多个 B 类。”?你的意思是A和B类型的子类?还是A类和B类的个人?这很重要,因为稍后您会编写:Idea:遍历所有 B 类型的类。对于每个 B 类,使用 Reasoner 的方法检查给定的 A 是否具有类 B 的 ObjectProperty“isManagedBy”(直接或继承) isSatisfiable() 方法。 但是你的意思是什么? 没有属性。属性与个人有关。你可能的意思是...
  • ..."遍历 B 的子类并检查每个子类 Bi 是否是限制类 (isManagedBy some Ai) 的子类,其中 Ai 是 A 的子类目标是什么?
  • @Joshua:通过多个类(OWlClass),我的意思是不只有一个类“类型”A,如示例(#FunctionManagement)所示。还有其他的,比如说#FunctionManagement1、#FunctionManagement2、#FunctionManagement2。 B 类型也有多个类,而不仅仅是一个,如示例中的#SymposiumPlanner2013、#SymposiumPlanner2013b、#SymposiumPlanner2013c、#SymposiumPlanner2013d....此外,A 和 B 类型的类也具有层次结构。如示例所示,#FunctionManagement 是 A 类型的某个其他类的子类,例如 #FunctionManagementParent...
  • @Joshua:本体中只有类(OWLClass)和对象属性(OWLObjectProperty),没有别的(没有个体)……
  • @Joshua:术语“类型”可能有点误导,这并不意味着存在某种类型的类的实例。它只是意味着有两种“类型”,“集合”,无论是什么类。而类型类 A isManagedBy 类型类 B。

标签: rdf semantic-web owl owl-api reasoning


【解决方案1】:

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

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

  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 */
    

【讨论】:

  • 在您的部分 (1) 中,如果 A 必须由 something 管理,则只有不一致之处。例如,A and (isManagedBy only (B and (not B))) 类本身并不是不可满足的。它只是 A 的子类,其实例没有 isManagedBy 值;即A and (isManagedBy exactly 0).
  • > 在您的部分 (1) 中,如果 A 必须由某物管理,则只有不一致。>是的,这正是作者想要检查的(据我了解
  • > 在您的部分 (1) 中,如果 A 必须由某物管理,则只有不一致之处。 - 是的,这正是作者想要检查的(据我了解“给定的 A 是否具有 ObjectProperty isManagedBy(直接或继承)到 B 类”)。如果没有manages A,那么我们应该找不到B。
  • 是的,这似乎是作者想要检查的内容。我的观点是,我们还没有看到足够多的本体来知道本体的其余部分是否暗示了它。也就是说,不清楚 OP 没有得到 OP 想要的结果是因为 Java 代码 错误,还是因为本体的其余部分缺少其他内容。
【解决方案2】:

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

reasoner.getInstances(expression, false)

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

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

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

【讨论】:

  • 据我所知,getInstances()方法适用于返回OWLNamedIndividual类型的对象。本体上只有类,没有个体。我实际上尝试了您建议的更改,但返回为空,正如预期的那样。
  • 抱歉,我认为由其他类管理的类是指这些类的实例,因为您的示例使用对象属性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-19
  • 1970-01-01
  • 1970-01-01
  • 2017-11-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多