SPARUL-запрос для удаления большинства графиков, используя Jena API

Я пытаюсь очистить большинство графиков, содержащихся в моем локальном тройном хранилище Virtuoso, используя Apache Jena, как часть моего процесса очистки до и после модульных тестов. Я думаю, что-то подобное должно быть сделано. Во-первых, я получаю URI графика, которые нужно удалить; затем я выполняю операцию SPARUL Drop.

String sparqlEndpointUsername = ...;
String sparqlEndpointPassword = ...;
String sparqlQueryString = ...; // Returns the URIs of the graphs to be deleted

HttpAuthenticator authenticator = new SimpleAuthenticator(sparqlEndpointUsername,
            sparqlEndpointPassword.toCharArray());
ResultSet resultSetToReturn = null;
try (QueryEngineHTTP queryEngine = new QueryEngineHTTP(sparqlEndpoint, sparqlQueryString, authenticator)) {
    resultSetToReturn = queryEngine.execSelect();
    resultSetToReturn = ResultSetFactory.copyResults(resultSetToReturn);

    while(resultSetToReturn.hasNext()){
        String graphURI = resultSetToReturn.next().getResource("?g").getURI();

        UpdateRequest request = UpdateFactory.create() ;
        request.add("DROP GRAPH <"+graphURI+">");

        Dataset dataset = ...; // how can I create a default dataset pointing to my local virtuoso installation?

        // And perform the operations.
        UpdateAction.execute(request, dataset) ;

    }
}
;

Вопросы:

  1. Как показано в этом примере, для работы ARQ необходим набор данных. Как мне создать этот набор данных, указывающий на мою локальную установку Virtuoso для операции обновления?
  2. Есть ли альтернатива моему подходу? Будет ли лучше использовать другой подход (кроме Джены)?

Обратите внимание, что я не пытаюсь удалить все графики. Я удаляю только те графики, имена которых возвращаются через запрос SPARQL, определенный в начале (3-я строка).

2 ответа

Похоже, ваш вопрос относится к Virtuoso и предназначен для удаления всех данных RDF, поэтому вы можете использовать встроенный в Virtuoso RDF_GLOBAL_RESET() функция

Это не SPARQL/SPARUL-запрос; обычно он создается через соединение SQL - это могут быть JDBC, ODBC, ADO.NET, OLE DB, iSQL и т. д.

Тем не менее, когда вы подключаетесь через SPARUL-привилегированное соединение, вы должны иметь возможность использовать (ограниченную) поддержку Virtuoso SQL-in-SPARQL, а -

SELECT
  ( bif:RDF_GLOBAL_RESET()  AS reset )
WHERE
  {  ?s  ?p  ?o  }
LIMIT 1

(Выполнение этого через непривилегированное соединение, такое как конечная точка SPARQL по умолчанию, приведет к ошибке, подобной Virtuoso 37000 Error SP031: SPARQL compiler: Function bif:RDF_GLOBAL_RESET() can not be used in text of SPARQL query due to security restrictions.)

(ObDisclaimer: OpenLink Software производит Virtuoso и нанимает меня.)

Вы можете создать один запрос на обновление SPARQL:

DROP GRAPH <g1> ;
DROP GRAPH <g2> ;
DROP GRAPH <g3> ;
... ;

потому что в SPARQL Update один HTTP-запрос может быть несколькими операциями обновления, разделенными ;,

Другие вопросы по тегам