【问题标题】:How to retrieve object properties from a class expression defined in the "Equivalent To" section of an owl class in Java?如何从 Java 中 owl 类的“等效于”部分中定义的类表达式中检索对象属性?
【发布时间】:2019-03-24 17:34:20
【问题描述】:

我已经(在 Protege 中)定义了一个 Missing 类,它等效于((not(atHome 值 30))和(not(atWork 值 30)))和(not(onleave 值 30))。 通过使用 OWL-API,我想从类表达式中获取单个对象属性(在本例中为否定对象属性),以便进一步获取它们域和范围并执行进一步的推理。但是,我不确定如何在 Java 中解析整个等效类表达式。

现在,我可以使用以下代码以函数形式检索一个类(在本例中为 Missing)的等效类表达式。

localOntology.getEquivalentClassesAxioms(missingClass);

提供的代码返回我在 Protege 中提供的等价类表达式的函数表示,但是我无法解析它并检索不是(atWork 值 30),不是(atHome 值 30),不是(onleave 值 30 ),这就是我想要的。

【问题讨论】:

    标签: java protege owl-api


    【解决方案1】:
    • 首先。在上述本体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 impl 以仅收集数据属性。

    【讨论】:

      猜你喜欢
      • 2016-08-05
      • 2012-07-26
      • 2023-03-12
      • 1970-01-01
      • 1970-01-01
      • 2019-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多