2017-07-05 26 views
0

我是OWL 2的新手,我想用OWL API解析“.ttl”文件,但我发现OWL API与API I不同之前使用过。如果我想要在OWLAxiom或OWLEntity中获取内容,似乎应该写一个“访问者”,等等。我已经阅读了一些教程,但我没有得到正确的方法来做到这一点。另外,我发现搜索到的教程是使用老版本的owl api。所以我想要一个详细的例子来解析一个实例,并将内容存储到一个Java类中。解析.ttl文件并将其映射到Java类


我做了一些尝试,我的代码如下,但我不知道继续下去。是


OWLOntologyManager manager = OWLManager.createOWLOntologyManager(); 

File file = new File("./source.ttl"); 

OWLOntology localAcademic = manager.loadOntologyFromOntologyDocument(file); 

Stream<OWLNamedIndividual> namedIndividualStream = localAcademic.individualsInSignature(); 

Iterator<OWLNamedIndividual> iterator = namedIndividualStream.iterator(); 

while (iterator.hasNext()) { 

    OWLNamedIndividual namedIndividual = iterator.next(); 

} 

实例举例如下。特别是,我想将“@en”存储在“ecrm:P3_has_note”的对象中。是


<http://data.doremus.org/performance/4db95574-8497-3f30-ad1e-f6f65ed6c896> 
    a      mus:M42_Performed_Expression_Creation ; 
    ecrm:P3_has_note  "Créée par Teodoro Anzellotti, son commanditaire, en novembre 1995 à Rotterdam"@en ; 
    ecrm:P4_has_time-span <http://data.doremus.org/performance/4db95574-8497-3f30-ad1e-f6f65ed6c896/time> ; 
    ecrm:P9_consists_of [ a      mus:M28_Individual_Performance ; 
          ecrm:P14_carried_out_by "Teodoro Anzellotti" 
          ] ; 
    ecrm:P9_consists_of [ a      mus:M28_Individual_Performance ; 
          ecrm:P14_carried_out_by "à Rotterdam" 
          ] ; 
    efrbroo:R17_created <http://data.doremus.org/expression/2fdd40f3-f67c-30a0-bb03-f27e69b9f07f> ; 
    efrbroo:R19_created_a_realisation_of 
      <http://data.doremus.org/work/907de583-5247-346a-9c19-e184823c9fd6> ; 
    efrbroo:R25_performed <http://data.doremus.org/expression/b4bb1588-dd83-3915-ab55-b8b70b0131b5> . 

我想要的内容如下:


class Instance{ 
    String subject; 
    Map<String, Set<Object>> predicateToObject = new HashMap<String,Set<Object>>(); 
} 

class Object{ 
    String value; 
    String type; 
    String language = null; 
} 

我使用owlapi的版本是5.1.0。我从there下载了jar和doc。我只是想知道如何获得我在java类中需要的内容。


如果有一些教程描述了实现方法,请告诉我。

非常感谢。


更新:我已经知道如何做到这一点,当我完成它,我会写一个答案,我希望它能够帮助OWLAPI的后来者。


再次感谢。

回答

1

一旦你有了个人,你需要的是检索数据属性声明公理并收集每个属性声明的文字。

所以,在代码中的循环:

// Let's rename your Object class to Literal so we don't get confused with java.lang.Object 
Instance instance = new Instance(); 
localAcademic.dataPropertyAssertionAxioms() 
    .forEach(ax -> instance.predicateToObject.put(
     ax.getProperty().getIRI().toString(), 
     Collections.singleton(new Literal(ax.getObject)))); 

此代码假定性质只能出现一次 - 如果你的属性多次出现,你必须检查一组是否已经存在的财产并添加到它而不是替换地图中的值。为了简化这个例子,我放弃了这一点。

这种情况下访问者不是必需的,因为您已经知道您感兴趣的公理类型以及调用它的方法。它可能被写为OWLAxiomVisitor只实现visit(OWLDataPropertyAssertionAxiom),但在这种情况下,这样做几乎没有优势。

+0

非常感谢。但我可以使用访问者获取数据,它的OWLAnnonatiomAssersionAxiom,我认为OWLDataPropertyAssersionAxiom是存储公理来描述数据属性。我不确定,你的意见是什么? – ciferlv

+0

取决于您之后的属性是注记属性还是数据属性。不同之处在于注释属性被reasoners忽略。 – Ignazio

+0

我也有一个问题。如果我现在有一个人,我想知道每一个属性和价值,有没有一种快速的方法来获得这些?你有没有写好现成的方法来做到这一点?非常感谢。 – ciferlv