2012-05-22 56 views
12

如何在SPARQL 1.1中使用替換函數,尤其是在更新命令中?SPARQL 1.1:如何使用替換函數?

例如,如果我有多個三元組?s?p?o其中?o是一個字符串,並且對於所有三元組,其中?o包含字符串「gotit」我想插入一個額外的三元組,其中「gotit」被「haveit」取代,我怎麼能這樣做?我試圖達到這個是芝麻2.6.0。

我嘗試這樣幼稚的做法:

INSERT { ?s ?p replace(?o,"gotit","haveit","i") . } 
WHERE { ?s ?p ?o . FILTER(regex(?o,"gotit","i")) } 

但是這引起了語法錯誤。

我也沒有使用替換的查詢結果列表,像這樣:

SELECT ?s ?p (replace(?o,"gotit","haveit","i") as ?r) WHERE { .... } 

的SPARQL文檔沒有包含如何使用此功能的例子。

是否有可能使用函數來創建新的值,而不僅僅是測試現有的值,如果是的話,怎麼樣?

回答

14

您不能像您試圖那樣直接在INSERT子句中使用表達式。你也是綁定?name與第一個三重模式,但然後篩選?oFILTER這是不會給你任何結果(過濾未綁定的變量會給你沒有結果的大多數過濾器表達式)。

相反,你需要使用一個BINDWHERE條款,使價值的新版本中提供的INSERT子句中像這樣:

INSERT 
{ 
    ?s ?p ?o2 . 
} 
WHERE 
{ 
    ?s ?p ?o . 
    FILTER(REGEX(?o, "gotit", "i")) 
    BIND(REPLACE(?o, "gotit", "haveit", "i") AS ?o2) 
} 

BIND表達式的結果分配到一個新的變量,因此您可以在查詢/更新的其他地方使用該值。

的SPARQL規範你有興趣的相關部分是Assignment

+0

感謝您指出使用?名稱而不是?o的錯誤。我試圖簡化這裏的實際查詢並忘記將名稱更改爲?o。 我試着用我的SESAME安裝BIND查詢,但它也給我一個語法錯誤...我將不得不弄清楚,如果這是在最新的版本支持! – Johsm

+0

我剛剛測試過這個,它在SOEIM-Lite存儲庫的芝麻版本2.6.5中很好用。 – Johsm

5

根據specreplace的使用看起來是正確的。我相信REPLACE剛剛添加到最近規格相對最近 - 也許芝麻只是不支持它呢?

如果你只是做你的查詢是否返回行?

+0

節謝謝你的安慰,它應該像我想象的!正則表達式查詢確實工作得很好。一旦我設法升級到更新版本的芝麻醬,我會在這裏報告。 – Johsm

+0

我現在用Sesame 2.6.5版進行了測試,結果發現查詢工作時插入命令不起作用併產生語法錯誤。 RobV下面使用BIND建議的方法可以與Sesame 2.6.5一起使用。 – Johsm