2015-10-14 117 views
3

我試圖刪除與一系列類似事情相關的特定三元組。所以,我們在那裏有...SPARQL子查詢和DELETE

someURI a our:thing; 
our:name "literal". 
someOtherURI a our:thing; 
our:name "literal". 
...n 

我想特別刪除所有someURI our:name "literal"三倍和離開所定義的東西。

我知道我可以通過DELETE DATA來做到這一點,但這需要我知道所有的URI,這本身就是很多步驟。

我掙扎了一下與DELETE WHERE,但我相信答案是一樣的東西......

DELETE{ ?uri our:name ?literal } 
WHERE{ ?uri a our:thing. } 

首先,是我DELETE WHERE聲音?

其次,我想知道是否可以在DELETE DATA之內嵌套SELECT查詢?所以......

DELETE DATA{ 
?uri our:name ?literal 
{ 
    SELECT ?uri 
    WHERE {?uri a our:thing.} 
} 
} 

具體來說,將子查詢提供地面三重(的URI來代替?uri變量,或將在爲DELETE DATA沒有變化規律首先拋出的錯誤呢?這似乎是顯而易見的,但我被首先想知道,不能測試它在我的triplestore。我使用OWLIM-SE。

+0

你爲什麼說你不能在你的三重商店測試它?很確定OWLIM-SE支持SPARQL 1.1更新,除非您使用_very_舊版本... –

+0

存儲庫是內容生命週期的一部分。我不喜歡玩弄東西,第二個問題真的只是我一直想知道的東西。雖然我們有一個冗餘的開發實例,但我試圖保持數據與生產一致。作爲偏差堆棧,我的測試變得越來越沒有意義。 –

回答

3

,是我DELETE WHERE聲音?

差不多,但並不完全。一個DELETE根據條款C不包含任何未在WHERE子句中綁定的變量(變量?literal,在您的情況下)。所以,你需要稍微修改它,就像這樣:

DELETE { 
    ?uri our:name ?literal . 
} 
WHERE { 
    ?uri a our:thing; 
     our:name ?literal . 
} 

其次,我想知道是否有可能巢內 一個DELETE DATA一個SELECT查詢?

這是不可能的。 A DELETE DATA操作只能包含固定的RDF三元組 - 沒有變量,也沒有子查詢。

但是,您可以一個DELETE WHERE操作,如果你想使用嵌套SELECT。所以,以下是合法的:

DELETE { 
    ?uri our:name ?literal . 
} 
WHERE { 
    { SELECT ?uri ?literal 
    WHERE { ?uri a our:thing; 
       our:name ?literal . 
    } 
    } 
} 

它並沒有真正給你任何好處要做到這一點,雖然,你的具體情況:本次更新表示完全一樣的東西作爲第一位的,只是在一個更迂迴的方式。

+0

謝謝,Jeen,確認。 –