2012-10-10 57 views
0

我試圖合併2個現有的RDF/XML模型。我嘗試了不同的解決方案:將模型添加到現有模型中RDF

  • model1.union(model2)
  • model1.add(model2) //adding a complete model
  • model1.add(model2.listStatements())

我在Java中使用耶拿。

我從第二個模型中刪除了包絡標籤(如Equipment),但我總是有同樣的問題:結果模型沒有真正合並:它包含每個添加模型的包絡。例如,我有2個文件,但有不同的端點。他們應該合併有一個文件,它包含了所有的數據:

bookid123在endpointA

<rdf:RDF 
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 
xmlns:si="http://www.w3schools.com/rdf/"> 
<rdf:Description rdf:about="http://endpointA/bookid123"> 
    <si:title>W3Schools.com</si:title> 
</rdf:Description> 
</rdf:RDF> 

bookid123在endpointB

<rdf:RDF 
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 
xmlns:si="http://www.w3schools.com/rdf/"> 
<rdf:Description rdf:about="http://endpointB/bookid123"> 
    <si:author>Jan Egil Refsnes</si:author> 
</rdf:Description> 
</rdf:RDF> 

至於結果,我是這樣的:

<rdf:RDF 
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 
xmlns:si="http://www.w3schools.com/rdf/"> 
<rdf:Description rdf:about="http://endpointA/bookid123"> 
    <si:title>W3Schools.com</si:title> 
</rdf:Description> 
<rdf:Description rdf:about="http://endpointB/bookid123"> 
    <si:author>Jan Egil Refsnes</si:author> 
</rdf:Description> 
</rdf:RDF> 

但我需要像th是:

<rdf:RDF 
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 
xmlns:si="http://www.w3schools.com/rdf/"> 
<rdf:Description rdf:about="http://couldbeanything/bookid123"> 
    <si:title>W3Schools.com</si:title> 
    <si:author>Jan Egil Refsnes</si:author> 
</rdf:Description> 
</rdf:RDF> 

難道還有比得到的model1每個語句,將其添加到model2一個更聰明的辦法,除了因爲源-URI的它們是不同的語句?

+0

兩者都不這些片段是有效的RDF/XML,所以我懷疑第一個是你得到的,我懷疑第二個是你想要的!您可能已經知道RDF是用主謂謂詞對象三元組來定義的,所以如果您說出每個模型中的三倍,以及最終模型中您想要的三倍,這將有所幫助。談論XML標籤只是混淆了事情。另外,你在使用什麼庫?我猜這是Apache Jena,但是那裏有很多RDF庫。 – cygri

+0

我編輯了我的示例並添加了更多信息。你說得對,我正在Java項目中使用jena庫。 – wassermine

回答

2

在RDF中,標識齊全的URI,他們不認爲你碰巧發現他們在任何文檔的一部分。因此,在你的榜樣,

http://endpointA/bookid123 
http://endpointB/bookid123 

是事物獨特而獨立的名稱。因此,從RDF的角度來看,合併不會將三元組與這些主題組合在一起,這是非常正確的。

在你的情況,你是想斷言,由RDF模型之外的一些手段,你知道http://endpointA/bookid123http://endpointB/bookid123實際上是相同的資源,並且因此,發言大約一個可以被認爲是還語句關於其他。

有兩種處理方法。首先,你可以用OWL來表達,這兩個資源表示同一個人(我會用龜語法簡潔,它不會改變的意思):

<http://endpointA/bookid123> owl:sameAs <http://endpointB/bookid123> . 

爲了這個工作,你需要使用附帶OWL推理器的模型(例如OWL_MEM_MICRO_RULE_INF)。

第二種方式是更強力:每對資源resource1resource2要合併,運行一個循環來複制一個的聲明,也成爲其他的語句:

for (StmtIterator i = resource1.listStatements(); i.hasNext();) { 
    Statement s = i.next(); 
    resource2.addProperty(s.getPredicate(), s.getObject()); 
} 
+0

謝謝,我測試了第二個,它工作。但是這似乎是有限的。我會看看owl:sameAs。它在rdfs - > rdfs:seeAlso中似乎是一樣的。你上面的例子是一個sparql查詢?因爲我必須像這樣爲我的RDF/XML文檔添加sameAs-Resource:? – wassermine

+0

不,'owl:sameAs'和'rdfs:seeAlso'根本不是同一個概念。 'sameAs'在OWL中解釋了兩個資源*字面上*表示同一個人。意思很精確。 'seeAlso' *非正式*表示對象URI是一個文檔,它可能*添加更多關於主題資源的信息。正如我在答案中所寫的那樣,RDF的片段在Turtle中編碼。如果你想使用RDF,不要考慮語法(RDF/XML,Turtle,不管),而是考慮圖中的三元組。試圖用RDF/XML來編寫Jena代碼只會讓你感到困惑。 –

+0

順便提一下,要了解Turtle,請參閱Jena文檔或此頁:https://en.wikipedia.org/wiki/Turtle_%28syntax%29 –

相關問題