如何从Java中owl类的“Equivalent To”部分中定义的类表达式中检索对象属性?

问题描述 投票:0回答:1

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

java protege owl-api
1个回答
0
投票
  • 第一。在上述本体论中,IRIs 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实用工具,但这些特定的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以仅收集数据属性。
© www.soinside.com 2019 - 2024. All rights reserved.