测试OWL类是否是属性的域/范围

时间:2017-03-06 17:00:53

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

来自owl-api存储库的the example hasProperty

  

为了测试一个类的实例是否必须具有属性,我们从限制中创建一些值,然后要求该类的可满足性与来自限制的这些值的补充相互作用。如果交集是可满足的,那么类的实例不必具有属性,否则它们就具有属性。

因此,要检查某个类是否是对象属性的域,我可以使用下面的代码段:

OWLDataFactory dataFactory = manager.getOWLDataFactory();
OWLClassExpression restriction = dataFactory.getOWLObjectSomeValuesFrom(objectProperty, dataFactory.getOWLThing());
OWLClassExpression complement = dataFactory.getOWLObjectComplementOf(restriction);
OWLClassExpression intersection = dataFactory.getOWLObjectIntersectionOf(cls, complement);
boolean hasObjectProperty = !reasoner.isSatisfiable(intersection);

我想知道如何检查类是否是对象属性的范围,以及它是否是数据属性的域。我可以使用以下代码段(基于上面的示例)来检查数据属性域吗?

OWLClassExpression restriction = dataFactory.getOWLDataSomeValuesFrom(dataProperty, dataFactory.getOWLThing());
OWLClassExpression complement = dataFactory.getOWLDataComplementOf(restriction);
OWLClassExpression intersection = dataFactory.getOWLDataIntersectionOf(cls, complement);
boolean hasDataProperty = !reasoner.isSatisfiable(intersection);

1 个答案:

答案 0 :(得分:1)

该示例不会执行您要查找的内容 - 它会检查类的实例是否必需以具有具有特定属性的属性断言。您尝试验证的条件是较弱的 - 无论给定属性断言,C类都被推断为断言的主语(或对象,范围情况)的类型。

这可以通过更简单的方式(包括代码和复杂性)来完成,检查属性的域是否是您感兴趣的类的超类 - 或者,如果您想检查是否为C类是完全域名,您可以检查这两个类是否相同。

示例:

OWLOntology o = ... //root ontology for the reasoner
OWLReasoner r = ...
OWLObjectProperty p = ...
for (OWLObjectPropertyDomainAxiom ax: o.getObjectPropertyDomainAxioms(p)) {
    OWLClassExpression c = ax.getDomain();
    NodeSet<OWLClass> allSubClasses = r.getSubClasses(c, false);
    Node<OWLClass> allEquivalentClasses = r.getEquivalentClasses(c);
}

对于数据属性域,您只需要在示例中从对象切换到数据属性,对于对象属性范围,您将搜索对象属性范围公理。