解析的内容顺序相反

时间:2017-04-24 13:31:59

标签: xml semantic-web owl

我正在尝试使用OWL API解析OWL2文件。但是当我尝试解析标签<SubClassOf></SubClassOf>时,我遇到了问题。请参阅下面的示例。

<?xml version="1.0"?>

<Ontology xmlns="http://www.w3.org/2006/12/owl2-xml#"
     ......>
    <SubClassOf>
        <Class URI="&ontology_people1;Address"/>
        <Class URI="&ontology_people1;Location"/>
    </SubClassOf>
   ......
</Ontology>

<SubClassOf> and </SubClassOf>之间的内容按顺序编写。 子类写在第一行,父类写在第二行。但我解析它并在控制台中打印。他们的顺序是相反的。与此同时,其他人并不反过来。我的代码如下所示。

OWLOntologyManager manager = OWLManager.createOWLOntologyManager();

        File file = new File("src/main/resources/dataSet/PR/person1/ontology_people1.owl");

        OWLOntology o = manager.loadOntologyFromOntologyDocument(file);
List<OWLAxiom> subClassOf = o.axioms()
                .filter(axiom -> axiom.getAxiomType().toString().equals("SubClassOf"))
                .collect(Collectors.toList());

        for (OWLAxiom owlAxiom : subClassOf) {

            Stream<OWLEntity> owlEntityStream = owlAxiom.signature();
            owlEntityStream.forEach(entity->System.out.println(entity.getIRI()));
            System.out.println("**************");
        }

为什么?

1 个答案:

答案 0 :(得分:1)

那是因为signature()方法不是您需要使用的方法。公理的签名是出现在该公理中的一组实体,并且独立于公理类型来定义。在这种情况下,主要特征是签名中实体的顺序与公理的语义无关。

要可靠地访问子类和超类,请使用以下代码:

    List<OWLSubClassOfAxiom> subClassOf = OWLAPIStreamUtils.asList(o.axioms(AxiomType.SUBCLASS_OF));
    subClassOf.forEach(x->{
        System.out.println( x.getSubClass());
        System.out.println( x.getSuperClass());
        });