如何检查 类 之间的 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)
的内容可能更接近您的期望。
我可以针对您的问题提出两种解决方案:
遍历所有 B,而是检查 B 的可满足性
A and (isManagedBy only (not B))
。如果这个表达式对于某些 B 是不可满足的,那么这样的 B 必须通过 isManagedBy
.
与给定的 A 连接
如果您使用 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 */
假设有两种类型的 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)
的内容可能更接近您的期望。
我可以针对您的问题提出两种解决方案:
遍历所有 B,而是检查 B 的可满足性
A and (isManagedBy only (not B))
。如果这个表达式对于某些 B 是不可满足的,那么这样的 B 必须通过isManagedBy
. 与给定的 A 连接
如果您使用 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 */