【问题标题】:How to loop through all OWL entities and get all its nested elements?如何遍历所有 OWL 实体并获取其所有嵌套元素?
【发布时间】:2021-10-25 18:34:38
【问题描述】:

我有需要使用 Java 解析的 owl 文件。我正在使用 Java OWL API。我阅读了该文件,并且能够返回所有类和属性。

 OWLOntologyManager manager=OWLManager.createOWLOntologyManager();
 OWLOntology owl=manager.loadOntologyFromOntologyDocument(new File(myOWLFile));
 System.out.println(owl.getAxiomCount());
 java.util.Set<OWLEntity> entOnt = owl.getSignature();
 for (OWLEntity a : entOnt) {
    System.out.println("Entity "+a);//this print only the entities
}

但是,我需要跟踪每个实体内的所有嵌套元素。例如,如果这是 owl 文件:

<owl:Class rdf:about="#A">
        <owl:equivalentClass rdf:resource="#B"/>
        <rdfs:subClassOf rdf:resource="#C"/>
    </owl:Class>

  <owl:ObjectProperty rdf:about="#D">
        <rdfs:range rdf:resource="#E"/>
        <rdfs:domain rdf:resource="#F"/>
    </owl:ObjectProperty>
    

我需要获取 A 类中的所有元素。我现在需要 A 包含 B 作为等效类和 C 作为子类。我需要打印这样的东西:

Class: A has
      B = Equivalent Class
      C = Sub Class
Property: D has
      E = Range
      F = Domain

如何遍历所有 owl 实体并获取其所有嵌套元素?

【问题讨论】:

  • “A 类内部”没有意义。 OWL 中的实体是类、属性和个体。您正在谈论的是 owl axioms - 您只想获取给定类的所有 OWL 公理 - 这是您的目标。您可以使用owlcs.github.io/owlapi/apidocs_5/org/semanticweb/owlapi/search/… - 另一个选项是迭代所有公理,分别处理每个公理类型

标签: java owl owl-api


【解决方案1】:

嵌套元素只是 OWL 公理的 XML 结构化表示(OWL 公理和 RDF 三元组之间的映射,其中 XML sn-p 是 RDF/XML 表示,可在 W3C web site 上获得)。

要访问公理并将它们分组为类似于您的预期输出,您将执行类似于 OWLAPI 在保存本体时所做的事情:对于每个实体,检索该实体在左侧的公理边(例如,A subclassOf B 是公理,其中 A 在左侧)并相应地访问公理。

OWLAPI 定义了一个OWLAxiomVisitor 接口,您可以为您感兴趣的公理类型实现该接口,例如:

    owl.getClassesInSignature().forEach(c->{
        Printer p=new Printer(c);
        owl.getReferencingAxioms(c).forEach(axiom->axiom.accept(p));
    });

打印机类:

import org.semanticweb.owlapi.model.*;

public class Printer implements OWLAxiomVisitor {
    private OWLClassExpression e;
    public Printer(OWLClassExpression e) {
        this.e = e;
    }
    @Override
    public void visit(OWLSubClassOfAxiom axiom) {
      if (e.equals(axiom.getSubClass())) {
        System.out.println(axiom.getSubClass() + " subClassOf" + axiom.getSuperClass());
      } else {
        System.out.println(axiom.getSubClass() + " superClassOf" + axiom.getSuperClass());
      }
    }
    @Override
    public void visit(OWLEquivalentClassesAxiom axiom) {
      System.out.println(e + " equivalent to " + axiom.getClassExpressionsMinus(e));
    }
...
}

【讨论】:

    猜你喜欢
    • 2019-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-14
    • 1970-01-01
    • 2017-09-07
    • 1970-01-01
    相关资源
    最近更新 更多