2015-09-08 75 views
1

我想替換存儲在我的基於Jena的三重存儲中的所有主題的服務器。替換JENA Triplestore中的域名

我嘗試過這種方式,但服務器不會被替換......

DELETE { ?s ?p ?o } 
INSERT { ?s1 ?p ?o } 
WHERE { 
    { SELECT (uri(concat('http://localhost:8080/', SUBSTR(str(?s),22))) AS ?s1) 
     { 
      ?s ?p ?o . 
      FILTER regex(str(?s), '^https://somedomain.org/') 
     } 
    } 
} 

當我只運行下面的查詢

SELECT (uri(concat('http://localhost:8080/', SUBSTR(str(?s),22))) AS ?s1) ?s 
{ 
    ?s ?p ?o . 
    FILTER regex(str(?s), '^https://somedomain.org/') 
} 

'?s' 和 '?S1' 做有正確的值。

看起來''s'和'?s1'在DELETE/INSERT塊內不可用。 我的更新查詢有什麼問題?

+0

很難說沒有完整的,最小的例子。 (1)您正在運行的版本(2)您正在使用的存儲系統以及(3)數據是什麼。 – AndyS

+0

我不認爲它應該有任何作用,但它可能是更清潔的使用'BIND(uri(con​​cat(...))作爲...)'在'where {...}'內而不使用一個嵌套的子查詢。 –

回答

1

您的問題是,您在更新中使用的是子查詢,而您只能從子查詢項目中投射?s1

這意味着?s?p?o在子查詢之外是不可見的。因此,當DELETEINSERT模板嘗試構建三元組以刪除並插入它們構建的所有三元組都無效(因爲並非所有變量都可見),因此沒有任何更改。

要解決這個問題就應該把項目的所有相關變量:

DELETE { ?s ?p ?o } 
INSERT { ?s1 ?p ?o } 
WHERE 
{ 
    { 
    SELECT ?s ?p ?o (uri(concat('http://localhost:8080/', SUBSTR(str(?s),22))) AS ?s1) 
    { 
     ?s ?p ?o . 
     FILTER regex(str(?s), '^https://somedomain.org/') 
    } 
    } 
} 

,或者按照意見Joshua Taylor's建議。這實際上更好,因爲它簡化了總體查詢:

DELETE { ?s ?p ?o } 
INSERT { ?s1 ?p ?o } 
WHERE 
{ 
    ?s ?p ?o . 
    FILTER regex(str(?s), '^https://somedomain.org/') 
    BIND(uri(concat('http://localhost:8080/', SUBSTR(str(?s),22))) AS ?s1) 
}