SPARQL DELETE/INSERT с оператором SERVICE
Я создаю локальный кеш для некоторых данных из Викиданных, чтобы обеспечить быстрое автозаполнение тегов. Я хотел бы обновлять данные раз в неделю, но только если работает предложение SERVICE.
В основном я делаю:
INSERT { GRAPH <http://my.data/graph/wikidata> {
?concept wdt:P902 ?hls ;
rdfs:label ?label ;
schema:description ?description .
}} WHERE {
SERVICE <https://query.wikidata.org/sparql> {
?concept wdt:P902 ?hls .
?concept rdfs:label ?label .
?concept schema:description ?description .
FILTER (lang(?description) = "en")
FILTER (lang(?label) = "en" || lang(?label) = "de" || lang(?label) = "fr" || lang(?label) = "it")
}}
Теперь я подумал, что могу сделать DELETE/INSERT, и я сначала удаляю все данные:
PREFIX wdt: <http://www.wikidata.org/prop/direct/>
PREFIX schema: <http://schema.org/>
WITH <http://my.data/graph/wikidata>
DELETE { ?s ?p ?o }
INSERT {
?concept wdt:P902 ?hls ;
rdfs:label ?label ;
schema:description ?description .
} WHERE {
SERVICE <https://query.wikidata.org/sparql> {
?concept wdt:P902 ?hls .
?concept rdfs:label ?label .
?concept schema:description ?description .
FILTER (lang(?description) = "en")
FILTER (lang(?label) = "en" || lang(?label) = "de" || lang(?label) = "fr" || lang(?label) = "it")
}
?s ?p ?o
}
Но похоже, что я получаю 400 обратно из Викиданных. Я делаю подобные DELETE/INSERT без SERVICE, но не понимаю, почему это не сработает, так как я не связываю переменные между существующим графиком и запросом SERVICE.
Кто-нибудь видит, что здесь происходит не так? По сути, я хотел бы стереть существующий график, но не заканчивать с пустым графиком в случае, если Wikidata не работает.
1 ответ
Решение
Спасибо пользователю AKSW за подсказку с UNION, этот запрос работает:
PREFIX wdt: <http://www.wikidata.org/prop/direct/>
PREFIX schema: <http://schema.org/>
DELETE { GRAPH <http://data.alod.ch/graph/wikidata> { ?s ?p ?o }}
INSERT { GRAPH <http://data.alod.ch/graph/wikidata> {
?concept wdt:P902 ?hls ;
rdfs:label ?label ;
schema:description ?description .
}} WHERE {
{
SERVICE <https://query.wikidata.org/sparql> {
?concept wdt:P902 ?hls .
?concept rdfs:label ?label .
?concept schema:description ?description .
FILTER (lang(?description) = "en")
FILTER (lang(?label) = "en" || lang(?label) = "de" || lang(?label) = "fr" || lang(?label) = "it")
}
}
UNION
{
GRAPH <http://data.alod.ch/graph/wikidata> {
?s ?p ?o
}
}
}