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
    }
}
}
Другие вопросы по тегам