2012-07-26 37 views
0

我有Jena(2.6.4)和ARQ(2.8.8),無法從三重存儲中刪除數據。 SPARQL要求:Jena DELETE和URI

DELETE {?doc ?p ?o} 
    WHERE { ?doc ?p ?o; 
     <http://example#fullName> <file:/c:/1.txt> } 

這個請求芝麻工作臺工作正常。

但是,當我試圖從Java與DB2第10節RDF三元店沒有發出它發生:

 Dataset ds = RdfStoreFactory.connectDataset(store, conn); 
     GraphStore graphStore = GraphStoreFactory.create(ds) ; 
     UpdateAction.parseExecute(deleteDocumentString, graphStore); 

我發現的唯一途徑 - 比較字符串:

 {?doc base:fullName ?fname. FILTER(str(?fname) = "file:/c:/1.txt") 
+0

我重新對Jena 2.7.2,ARQ 2.9.2進行了沒有DB2的測試。相同的結果:DELETE {?doc?p?o} WHERE {?doc 。 ?doc?p?o} - 沒有錯誤,沒有被刪除。要刪除我應該使用這個查詢:DELETE {?doc?p?o} WHERE {?doc ?fname。 FILTER(str(?fname)=「file:/ c:/1.txt」)?doc?p?o} – gmlvsv 2012-07-27 07:24:56

+0

我認爲問題在於你期待一個URI,但是這個值實際上是一個文字。我已經更新了我的答案,請參閱下文。不知道爲什麼Jena和芝麻之間會有所不同,除非你使用芝麻的不同版本的數據進行測試。 – 2012-07-30 22:07:31

回答

2

<file:/c:/1.txt>不是一個合適的URI(它不是絕對的,儘管file:URL沒有很好的定義)。

文件的正式定義:URls要求:file://host/pathhost可能被省略,給出file:///

的SPARQL解析器將其轉換爲

您可以測試此與

arq.qparse --file QueryInFile.rq 

看來數據加載不會做同樣的步驟。從命令行運行時,Jena RIOT解析會發出警告:

WARN [line: 1, col: 46] Bad IRI: <file:/c:/1.txt> Code: 57/REQUIRED_COMPONENT_MISSING in AUTHORITY: A component that is required by the scheme is missing. 

最好修復數據。

+0

謝謝,你說的對,問題是數據格式 - 「file:/ localhost/c:/data/1.txt」。當我將其更改爲「file:// localhost/c:/data/1.txt」時,它開始工作。 – gmlvsv 2012-08-02 07:24:36

1

你不不要說你得到了什麼錯誤,但鑑於你使用的是舊版本的Jena和ARQ,我懷疑問題只是它們不支持SPARQL更新請求。我建議你升級到更新版本的耶拿(或堅持芝麻:))

更新它看起來好像在你的數據有問題。你的更新操作和使用都試圖爲fullName對待值作爲URI(因爲你使用URI語法,通過將其放置在尖括號中,像這樣的查詢:

<file:/c:/1.txt> 

然而,顯然該值不存在作爲你的數據中的URI(因爲你做的SELECT查詢不會返回它,並且你使用的DELETE操作不會刪除任何東西)由於你做基於字符串檢查的版本確實有的工作,我懷疑在您的數據中,該值是一個文字,而不是一個URI。

以下可能工作:

DELETE {?doc ?p ?o} 
WHERE { ?doc ?p ?o; 
       <http://example#fullName> "file:/c:/1.txt" . 
} 

雖然上述內容僅適用於文字值爲無語言標籤的無類型文字。否則,您發現自己的替代方案(對字符串值使用FILTER條件)是處理此問題的好方法。或者,當然,如果您希望這些值是URI而不是文字,請修改您的實際數據。

+0

+1雖然我懷疑問題可能出在IBM DB2後端,但不是Jena給出了關於此OP的類似主題的最近問題,但升級的好處關於刪除不起作用 – RobV 2012-07-26 20:46:00

+0

請參閱我上面的註釋 – gmlvsv 2012-07-27 07:27:19

+0

SELECT也適用於查詢字符串:「select?s where {?s }」; (Jena 2.7.2) – gmlvsv 2012-07-27 13:55:16