Rdf 如何检查类之间是否存在OWLObjectPropertyExpression?
假设有两种类型的类,一种(A)由另一种(B)管理。下面的猫头鹰片段说明了这个场景。有多个类型为A的类(由其他类“管理”)和多个类型为B的类。事实上,类型为A和B的类之间也存在层次结构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
<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)
的内容可能更接近您期望看到的内容。我可以为您的问题提出两种解决方案:
A和(仅由(非B)管理)
。如果此表达式对于某些B不可满足,则此类B必须通过isManagedBy
与给定a连接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是否有一个ObjectPropertyisManagedBy
(直接或继承)到B类”)。如果没有管理A的内容,那么我们应该找不到Bs。是的,这似乎是作者想要检查的。我的观点是,我们对本体的了解不够,无法知道本体的其余部分是否暗示了它。也就是说,不清楚OP是否没有得到OP想要的结果,因为Java代码是wrong,或者因为本体的其余部分缺少了其他内容。
reasoner.getInstances(expression, false)