2017-07-05 60 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