我已经定义了(在Protege中)一个类Missing,它等同于((not(atHome值30))和(not(atWork value 30)))和(not(onleave value 30))。通过使用OWL-API,我想从类表达式中获取单个对象属性(在本例中为否定的对象属性),以便进一步获取其域和范围并执行进一步的推理。但是,我不确定如何解析Java中的整个等效类表达式。
现在,我能够使用以下代码以函数形式检索类的等效类表达式(在本例中为Missing)。
localOntology.getEquivalentClassesAxioms(missingClass);
提供的代码返回我在Protege中提供的等价类表达式的函数表示,但是我无法解析它并且不能(不是atWork值30),而不是(atHome值30),而不是(onleave值30),是我想要的。
atHome
,atWork
和onleave
不是对象属性,而是数据属性,因为atHome value 30
是Literal Value Restriction,具有数据类型属性,而不是对象属性。当然,如果它不是Punning。OWLOntology#getEquivalentClassesAxioms(OWLClass)
。相反,建议使用其Java-Stream-API伴侣:OWLOntology#equivalentClassesAxioms(OWLClass)
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);
org.semanticweb.owlapi.util.OWLObjectComponentCollector
或org.semanticweb.owlapi.util.OWLEntityCollector
实用工具,但这些特定的impls收集单个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
impl以仅收集数据属性。