如何从Java猫头鹰类的“等效于”部分中定义的类表达式中检索对象属性?

时间:2019-03-24 17:34:21

标签: java protege owl-api

我已经(在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) ),这就是我想要的。

1 个答案:

答案 0 :(得分:0)

  • 首先。在上述本体中,IRI atHomeatWorkonleave不是对象属性,而是数据属性,因为atHome value 30Literal 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.OWLObjectComponentCollectororg.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隐式表示仅收集数据属性。