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

Rdf 如何检查类之间是否存在OWLObjectPropertyExpression?,rdf,semantic-web,owl,owl-api,reasoning,Rdf,Semantic Web,Owl,Owl Api,Reasoning,假设有两种类型的类,一种(A)由另一种(B)管理。下面的猫头鹰片段说明了这个场景。有多个类型为A的类(由其他类“管理”)和多个类型为B的类。事实上,类型为A和B的类之间也存在层次结构 <owl:ObjectProperty rdf:about="#isManagedBy"/> <owl:Class rdf:about="#FunctionManagement"> <rdfs:subClassOf rdf:resource="..."/> <rdf

假设有两种类型的类,一种(A)由另一种(B)管理。下面的猫头鹰片段说明了这个场景。有多个类型为A的类(由其他类“管理”)和多个类型为B的类。事实上,类型为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"/>
...
不幸的是,推理器返回的结果对于类型B的所有类都是可满足的


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

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

reasoner.getInstances(expression, false)
这将为您提供直接和间接的实例

编辑:从注释中,看起来您正在查找isManagedBy域中的A的子类,或者isManagedBy的限制将B的子类作为范围


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

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

  • 检查所有Bs,但要检查产品的可满足性
    A和(仅由(非B)管理)
    。如果此表达式对于某些B不可满足,则此类B必须通过
    isManagedBy
    与给定a连接

  • 如果您使用FaCT++进行推理,则可以使用
    OWLKnowledgeExplorerReasoner
    接口来探索a类可满足性检查期间生成的模型。其思想是,如果模型中存在此类B,则必须将其连接到a。存在一些限制(它可能不适用于通过等价类(B,…)定义的Bs,但不适用于非确定性标签(请参见getObjectLabel()调用中的flag true),但这里有一个想法。代码可能如下所示:

    OWLReasoner factplusplus=new FactPlusPluReasonerFactore().createReasoner(o);
    OWLKnowledgeExplorerReasoner ke=(OWLKnowledgeExplorerReasoner)factplusplus;
    RootNode nodeForA=ke.getRoot(A);
    for(RootNode填充程序:ke.getObjectNeights(nodeForA,isManagedBy))
    for(OWLClassExpression cls:ke.getObjectLabel(filler,true)
    if(SetAllBs.contains(cls))
    /*cls是您正在寻找的*/
    

  • 据我所知,getInstances()方法适用于返回类型为OWLNamedIndividual的对象。本体上只有类,没有个体。我实际上尝试了您建议的更改,但返回为空,正如预期的那样。抱歉,我假设由其他类管理的类意味着这些类的实例,因为您的示例使用对象属性。这是什么意思意思是:“有多个类型为A的类(由“其他类”管理)和多个类型为B的类。”?你是指类型为A和B的子类?还是类型为A和B的个体?这很重要,因为稍后你会写:Idea:迭代类型为B的所有类。对于每个类B,检查给定的A是否具有ObjectProperty“isManagedBy”(直接或继承)到类B,使用推理器的IsSatifiable()方法。但你的意思是什么?类没有属性。属性与个体相关。你的意思可能是……“遍历B的子类,检查每个子类Bi是否是限制类的子类(由某个Ai管理)其中Ai是“a”的一个子类,这就是你的目标吗?@Joshua:多个类(OWlClass)我的意思是,不只是一个“type”a类,如示例所示(#FunctionManagement).还有其他的,比如说#功能管理1、#功能管理2、#功能管理2。还有多个类型B的类,而不仅仅是一个,例如#SymposiumPlanner2013、#SymposiumPlanner2013b、#SymposiumPlanner2013c、#SymposiumPlanner2013d……此外,类型A和B的类也有层次结构。如考试中所示例如,#FunctionManagement是其他类型a类的子类,比如说#FunctionManagementParent…@Joshua:在本体中,只有类(OWLClass)和对象属性(OWLObjectProperty),没有其他(没有个人).@Joshua:术语“类型”可能有点误导,这并不意味着存在某种类型的类的实例。它只是意味着有两个“类型”,“集合”,不管是什么类。而类型类a是由类型类B管理的。在你的第(1)部分中,只有当a必须由某个对象管理时才存在不一致性。例如,类
    a和(仅由(B和(非B))管理)
    本身并不是不可满足的。它只是A的子类,其实例没有isManagedBy值;即,
    A和(isManagedBy正好是0)
    >在您的部分(1)中,只有当A必须由某个对象管理时才存在不一致性。>是的,这正是作者想要检查的(据我所知>)在您的部分(1)中,只有当A必须由某个东西管理时才存在不一致性。--是的,这正是作者想要检查的(据我所知,“给定A是否有一个ObjectProperty
    isManagedBy
    (直接或继承)到B类”)。如果
    没有管理
    A的内容,那么我们应该找不到Bs。是的,这似乎是作者想要检查的。我的观点是,我们对本体的了解不够,无法知道本体的其余部分是否暗示了它。也就是说,不清楚OP是否没有得到OP想要的结果,因为Java代码是wrong,或者因为本体的其余部分缺少了其他内容。
    
    reasoner.getInstances(expression, false)