SPARQL INSERT / DELETE - PullRequest
       9

SPARQL INSERT / DELETE

0 голосов
/ 19 декабря 2018

Мне нужна помощь в написании запроса на обновление.

DELETE {
      ?contactInfo vivo:freeTextValue5 ?o .
}
INSERT { 
      ?contactInfo vivo:freeTextValue5 "new_url"^^<http://www.w3.org/2001/XMLSchema#string> .
}
WHERE {
      ?contactInfo vivo:freeTextValue5 "old_url"^^<http://www.w3.org/2001/XMLSchema#string> .
}

Не могли бы вы сообщить мне, что не так с этим запросом на обновление?

1 Ответ

0 голосов
/ 19 декабря 2018

Я догадываюсь , что ваша проблема в том, что это обновление добавляет новую тройку, но не удаляет старую.

Причина в том, что ваше предложение DELETE содержитнесвязанная переменная: ?o.Это недопустимо - или, по крайней мере, происходит то, что шаблоны с несвязанными переменными просто игнорируются механизмом SPARQL.Таким образом, ваш DELETE фактически не удалит тройки.Переменная ?o должна быть связана со значением в предложении WHERE.

Один из способов исправить это - просто заменить ?o на определенное значение:

DELETE {
      ?contactInfo vivo:freeTextValue5 "old_url"^^<http://www.w3.org/2001/XMLSchema#string> .
}
INSERT { 
      ?contactInfo vivo:freeTextValue5 "new_url"^^<http://www.w3.org/2001/XMLSchema#string> .
}
WHERE {
      ?contactInfo vivo:freeTextValue5 "old_url"^^<http://www.w3.org/2001/XMLSchema#string> .
}

В более общем смысле вы можете использовать предложение VALUES для привязки ?o к значению, например так:

DELETE {
      ?contactInfo vivo:freeTextValue5 ?o.
}
INSERT { 
      ?contactInfo vivo:freeTextValue5 "new_url"^^<http://www.w3.org/2001/XMLSchema#string> .
}
WHERE {
      VALUES ?o { "old_url"^^<http://www.w3.org/2001/XMLSchema#string> }
      ?contactInfo vivo:freeTextValue5 ?o.

}

Это, пожалуй, лучший подход, поскольку он упрощает расширение вашего обновления на другиезначения для ?o.

...