我已经(在Protege中)定义了一个Missing类,它等效于((not(atHome value 30))和(not(atWork value 30)))和(not(onleave value 30))。 通过使用OWL-API,我想从类表达式中获得单个对象属性(在这种情况下,是取反的对象属性),以便进一步获得它们的域和范围,并执行进一步的推理。但是,我不确定如何解析Java中的整个等效类表达式。
现在,我可以使用以下代码以函数形式检索类的等效类表达式(在本例中为Missing)。
localOntology.getEquivalentClassesAxioms(missingClass);
提供的代码返回我在Protege中提供的等价类表达式的函数表示,但是我无法解析它并且不检索(atWork值30),不是(atHome值30),不是(onleave值30) ),这就是我想要的。
答案 0 :(得分:0)
首先。在上述本体中,IRI atHome
,atWork
和onleave
不是对象属性,而是数据属性,因为atHome value 30
是Literal Value Restriction,具有数据类型属性,而不是对象属性。如果不是Punning。
在OWL-API v5中,不赞成使用方法OWLOntology#getEquivalentClassesAxioms(OWLClass)
。相反,建议使用其Java-Stream-API伴随程序:OWLOntology#equivalentClassesAxioms(OWLClass)
使用此方法,解决方案(获取指定的OWL类的所有数据属性)可能如下所示:
o.equivalentClassesAxioms(c)
.flatMap(OWLNaryClassAxiom::operands)
.filter(x -> x instanceof OWLObjectComplementOf)
.map(x -> ((OWLObjectComplementOf) x).getOperand())
.filter(x -> x instanceof OWLDataHasValue)
.flatMap(x -> ((OWLDataHasValue) x).components())
.filter(x -> x instanceof OWLDataProperty)
.forEach(System.out::println);
可以使用标准的Java Collections API重写相同的内容,但是比较麻烦。
也可以使用org.semanticweb.owlapi.util.OWLObjectComponentCollector
或org.semanticweb.owlapi.util.OWLEntityCollector
实用工具,但是这些特别的含义是将所有组件收集在一个Set
中,因此仍然需要过滤结果:
o.equivalentClassesAxioms(c)
.flatMap(a -> new OWLObjectComponentCollector().getComponents(a)
.stream().filter(x -> x instanceof OWLDataProperty))
.forEach(System.out::println)
;
创建自己的org.semanticweb.owlapi.util.AbstractCollectorEx
隐式表示仅收集数据属性。