如何从中定义的类表达式检索对象属性;相当于;Java中owl类的一部分?

如何从中定义的类表达式检索对象属性;相当于;Java中owl类的一部分?,java,protege,owl-api,Java,Protege,Owl Api,我(在Protege中)定义了一个类缺失,它相当于((not(atHome值30))和(not(atWork值30))和(not(onleave值30))。 通过使用OWL-API,我希望从类表达式中获取单个对象属性(在本例中为否定对象属性),以便进一步获取它们的域和范围,并执行进一步的推理。但是,我不知道如何在Java中解析整个等价类表达式 现在,我能够用下面的代码以函数形式检索类的等价类表达式(在本例中是缺失的) localOntology.getEquivalentClassesAxiom

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

现在,我能够用下面的代码以函数形式检索类的等价类表达式(在本例中是缺失的)

localOntology.getEquivalentClassesAxioms(missingClass);
提供的代码返回我在Protege中提供的等价类表达式的函数表示形式,但是我无法解析它并检索not(atWork值30)、not(atHome值30)、not(onleave值30),这正是我想要的。

  • 首先。在上述本体中,IRIs
    atHome
    atWork
    onleave
    不是对象属性,而是数据属性,因为
    atHome值30
    是具有数据类型属性而非对象属性的属性。当然,如果不是这样的话

  • 在OWL-APIV5中,不推荐使用方法
    OWLOntology#getEquivalentClassesAxioms(OWLClass)
    。相反,建议使用它的Java流API伴侣:
    OWLOntology#equivalentClassesAxioms(OWLClass)

  • 使用此方法,解决方案(获取指定OWL类的所有数据属性)可能如下所示:

    o.equivalentClassesAxioms(c)
    .flatMap(OWLNaryClassAxiom::操作数)
    .filter(x->x实例OwlObjectOf)
    .map(x->((owlobObjectOf)x).getOperator()
    .filter(OWLDataHasValue的x->x实例)
    .flatMap(x->((OWLDataHasValue)x).components())
    .filter(OWLDataProperty的x->x实例)
    .forEach(System.out::println)

  • 可以使用标准的Java Collections API重写相同的代码,但更麻烦

  • 此外,还可以使用
    org.semanticweb.owlapi.util.owlobObjectComponentCollector
    org.semanticweb.owlapi.util.owletityCollector
    实用工具,但这些特定的impl在单个
    集中收集所有组件,因此仍然需要过滤结果:

    o.equivalentClassesAxioms(c)
    .flatMap(a->新建OWLObjectComponentCollector().getComponents(a)
    .stream().filter(OWLDataProperty的x->x实例))
    .forEach(System.out::println)

  • 创建自己的
    org.semanticweb.owlapi.util.AbstractCollectorEx
    impl以仅收集数据属性