У меня вопрос об обновлении данных RDF с использованием PHP-кода на сервере кунжута. Я попытался использовать SPARQL-обновление с конечной точки кунжута и добился успеха. Однако, используя PHP, он не дал никаких ошибок, но когда я проверяю данные RDF, ничего не меняется!
в соединении я использовал эту ссылку для продолжения обновления: http://localhost: 8080/Sesame/repositories/MyData/statements
и следующий код для обновления:
$query= "
DELETE DATA{
?s foaf:firstName \"Lina\".
}
WHERE {
?s foaf:firstName \"Lina\".
}";
$result = $sparql->query($query);
Я думал, что теперь мне нужно изменить функцию запроса, это не запрос, а обновление. Кроме того, я попытался
$result = $sparql->update($query);
и я получил ошибку!
что не так или что мне делать?
Проблема в том, что вы запутываете/смешиваете DELETE DATA
и DELETE WHERE
- это разные типы операций обновления в SPARQL. Просто удалите ключевое слово DATA
из вашего запроса, например:
$query= "
DELETE {
?s foaf:firstName \"Lina\".
}
WHERE {
?s foaf:firstName \"Lina\".
}";
Это приведет к удалению всех операторов с предикатным foaf:firstName
и объектом "Lina"
.
И поскольку вы хотите удалить точные тройки, которые вы соответствуете, вам не нужно повторять шаблон графика в предложении DELETE
, поэтому ваш запрос может стать короче:
$query= "
DELETE
WHERE {
?s foaf:firstName \"Lina\".
}";
Я решил проблему, поскольку я пытался использовать команду delete без какой-либо переменной (? S), и вместо этого использовать фактический объект такой:
$query= "DELETE DATA{ds:S1 foaf:firstName \"Lina\".}";
Я думаю, это потому, что вы не можете удалить что-то, чего не знаете. и я использовал для его выполнения следующее:
$result = $sparql->update($query);
DELETE...WHERE
удаляет все соответствующие утверждения. Конечно, может быть так, что в вашем фактическом наборе данных есть только одно утверждение с таким точным предикатом и значением объекта, но если вы не уверены в этом, будьте осторожны с тем, какой подход вам действительно нужен.