2015-07-05 37 views
1

我試圖用dbpedia中的數據更新Sesame存儲庫。我有以下查詢:儘管沒有錯誤,芝麻存儲庫並未使用INSERT進行更新

PREFIX owl: <http://www.w3.org/2002/07/owl#> 
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#> 
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
PREFIX foaf: <http://xmlns.com/foaf/0.1/> 
PREFIX dc: <http://purl.org/dc/elements/1.1/> 
PREFIX : <http://dbpedia.org/resource/> 
PREFIX dbpedia2: <http://dbpedia.org/property/> 
PREFIX dbpedia: <http://dbpedia.org/> 
PREFIX skos: <http://www.w3.org/2004/02/skos/core#> 

INSERT{?s ?p ?o} 

WHERE { 
SERVICE <http://dbpedia.org/sparql>{ 

{:Rotavirus_vaccine ?p ?o. 
} 
UNION 
{ 
?s ?p :Rotavirus_vaccine. 
} 
} 
} 

此查詢不顯示任何錯誤不更新存儲庫。另一方面,將UNION拆分爲兩個單獨的查詢,然後逐一更新存儲庫。爲什麼這些查詢是孤立的而不是聯合的?單個查詢的代碼是:

INSERT{:Rotavirus_vaccine ?p ?o}   
WHERE { 
SERVICE <http://dbpedia.org/sparql>{ 
{:Rotavirus_vaccine ?p ?o. 
} 
} 
} 

回答

1

我已經能夠通過使用BIND爲UNION的兩個子句執行功能查詢。代碼是:

INSERT{?s ?p ?o} 
WHERE 
{ 
SERVICE <dbpedia.org/sparql> 
{ 
{:Rotavirus_vaccine ?p ?o. BIND(:Rotavirus_vaccine AS ?s)} 
UNION {?s ?p :Rotavirus_vaccine. BIND(:Rotavirus_vaccine AS ?o) } 
} 
} 
2

?s?p?o必須全部定義在一行中才能使模板變得有意義。任何時候變量未被綁定,都不會進行更新。

在UNION的一個分支中,定義了?s?p,而在另一個分支中定義了?p?o。所以3個都沒有在同一行中定義。

要麼添加BIND或用於所述第一部分的過濾器e.g:

{:Rotavirus_vaccine ?p ?o. BIND(:Rotavirus_vaccine AS ?s) } 

{?s ?p ?o. FILTER(?s = :Rotavirus_vaccine } 

或該

INSERT{:Rotavirus_vaccine ?p ?o. 
     ?s ?p :Rotavirus_vaccine. 
} 

,因爲這些中的恰好一個是爲每一種情況下定義的使用。

+0

謝謝安迪。 – kurious

+0

你可以請發佈完整的查詢,安迪?如果使用INSERT中提到的三元組,那麼WHERE部分下包含了什麼? – kurious