Ответ 1
Так же, как SELECT-запросы используются, когда вы заинтересованы в получении набора привязок переменных назад, используются запросы CONSTRUCT, которые вы заинтересованы в возвращении модели. Подобно тому, как переменные, связанные в наборе результатов SELECT, не помещаются в какую-либо модель или постоянный набор привязок, ни одна из них не построена на основе CONSTRUCT. Вы хотите использовать SPARQL 1.1 INSERT. Функции обновления описаны в 3 языке обновления SPARQL 1.1. Таким образом, ваш запрос на обновление можно записать так:
INSERT {
GRAPH <http://graph.com/new> {
?s ?p ?o
}
}
WHERE {
GRAPH <http://graph.com/old> {
?s ?p ?o
}
}
В этом конкретном случае вы могли бы использовать операцию COPY, описанную в 3.2.3 COPY. COPY сначала удаляет все данные из целевого графика, поэтому может быть неприменим к вашему фактическому случаю (понимая, что предоставленный вами код может быть минимальным примером, а не обязательно фактическим обновлением, которое вы пытаетесь выполнить). О COPY в стандарте говорится:
Операция COPY - это ярлык для вставки всех данных из ввода график в граф назначения. Данные из входного графика не являются, но данные из графика назначения, если таковые имеются, удаляются перед вставкой.
COPY ( SILENT )? ( ( GRAPH )? IRIref_from | DEFAULT) TO ( ( GRAPH )? IRIref_to | DEFAULT )
аналогичен операции:
DROP SILENT (GRAPH IRIref_to | DEFAULT); INSERT { ( GRAPH IRIref_to )? { ?s ?p ?o } } WHERE { ( GRAPH IRIref_from )? { ?s ?p ?o } }
Разница между COPY и комбинацией DROP/INSERT заключается в том, что если COPY используется для копирования графика на себя, тогда никакая операция не будет и данные будут оставлены как есть. Использование DROP/INSERT в эта ситуация приведет к пустому графу.
Если граф назначения не существует, он будет создан. От по умолчанию, служба может вернуть сбой, если входной график не существовать. Если присутствует SILENT, результат операции всегда будет быть успешным.
Если COPY не подходит, ADD может быть тем, что вы ищете:
3.2.5 ADD
Операция ADD - это ярлык для вставки всех данных с входа график в граф назначения. Данные из входного графика не являются и исходные данные из графика назначения, если таковые имеются, сохраняются нетронутыми.
ADD ( SILENT )? ( ( GRAPH )? IRIref_from | DEFAULT) TO ( ( GRAPH )? IRIref_to | DEFAULT)
эквивалентно:
INSERT { ( GRAPH IRIref_to )? { ?s ?p ?o } } WHERE { ( GRAPH IRIref_from )? { ?s ?p ?o } }
Если граф назначения не существует, он будет создан. По умолчанию служба может вернуть сбой, если входной граф не существует. Если присутствует SILENT, результат операция всегда будет успешной.