Обновление Jena SPARQL не выполняется

Моя ситуация проста: у меня есть файл RDF (N3), который я хочу загрузить в sparql-auth-endpoint. Я использую Jena ARQ, но, к сожалению, не работает; Ошибок нет, но график не меняется. В чем может быть проблема? Мой код:

HttpContext httpContext = new BasicHttpContext();
CredentialsProvider provider = new BasicCredentialsProvider();
provider.setCredentials(new AuthScope(AuthScope.ANY_HOST,
    AuthScope.ANY_PORT), new UsernamePasswordCredentials("user", "pass"));
httpContext.setAttribute(ClientContext.CREDS_PROVIDER, provider);

GraphStore graphStore = GraphStoreFactory.create() ;

UpdateRequest request = UpdateFactory.read("turtle.ttl");

/*another possible query, same result - no errors but the graph doesn't change
request.add(new UpdateCreate("graph")) ;
request.add(new UpdateLoad("file:turtle_2.ttl", "graph")) ;
request.add("prefix dcterms: <http://purl.org/dc/terms/>"
    + "INSERT DATA { GRAPH <graph> {<http://example/book3> dcterms:title    \"A new book\" }}");
UpdateAction.execute(request, graphStore) ;
*/

UpdateProcessor processor = UpdateExecutionFactory
    .createRemote(request, "http://sparql-endpoint/sparql-auth");
((UpdateProcessRemote)processor).setHttpContext(httpContext);
processor.execute();

Как я могу изменить код для загрузки этих данных в конечную точку sparql?

Редактировать 1

Вот небольшой пример, тоже не работающий. Я могу создать новый граф через sparql-endpoint в браузере, но в Йене я не могу; ни ошибок, ни нового графика.

UpdateRequest request = UpdateFactory.create();
request.add(new UpdateCreate("http://linkeddata.com/graph"));
UpdateProcessor processor = UpdateExecutionFactory
    .createRemote(request, "http://sparql-endpoint/sparql-auth");
((UpdateProcessRemote)processor).setHttpContext(httpContext);
processor.execute();

Редактировать 2

Используя сервер Virtuoso с sparql-auth-endpoint, я изменил эти строки, и он работает намного лучше.

UpdateProcessor processor = UpdateExecutionFactory
    .createRemoteForm(request, "http://sparql-endpoint/sparql-auth");
((UpdateProcessRemoteForm)processor).setHttpContext(httpContext);
processor.execute();

Что ж, он работает на localhost: 8890, но не работает на другом виртуозном сервере

Exception in thread "main" org.apache.jena.atlas.web.HttpException: 400 Bad Request
at org.apache.jena.riot.web.HttpOp.httpResponse(HttpOp.java:425)
at org.apache.jena.riot.web.HttpOp.execHttpPostForm(HttpOp.java:316)
at com.hp.hpl.jena.sparql.modify.UpdateProcessRemoteForm.execute(UpdateProcessRemoteForm.java:75)
at bakalarska_prace.UpVirtuoso.main(UpVirtuoso.java:108) -> processor.execute()

person 159753    schedule 10.05.2013    source источник


Ответы (4)


Какое на самом деле обновление SPARQL вы читаете с помощью этой строки:

UpdateRequest request = UpdateFactory.read("turtle.ttl");

Не зная, что такое настоящее обновление SPARQL, трудно сказать, что происходит не так.

Предположения ...

Основываясь на закомментированном примере, вы пытаетесь сделать что-то вроде следующего:

LOAD <file:local.ttl> INTO GRAPH <http://graph>

Если это так, то это не сработает, удаленный сервер не имеет доступа к вашей локальной файловой системе, поэтому эта команда не будет работать.

Кроме того, file:local.ttl в любом случае является недопустимым URI, URI файла должен выглядеть как file:///local.ttl.

Редактировать

Согласно комментарию, я думаю, что ваша проблема может быть связана с используемыми URI графика, во всех ваших примерах вы используете относительные URI, поэтому ваши данные могут не отображаться на графике, который вы ожидаете. Скорее всего, ваши данные вставляются, но не в ожидаемый график, если у вас не слишком много данных, вы можете попробовать следующий запрос, чтобы выгрузить все данные в именованных графах, чтобы узнать, куда-то пропали данные:

SELECT * WHERE { GRAPH ?g { ?s ?p ?o } }

Или, если вы ожидаете, что в магазине будет небольшое количество именованных графов, в следующем списке будут перечислены именованные графы, чтобы вы могли увидеть, есть ли у вас какие-либо неожиданные графы:

SELECT DISTINCT ?g WHERE { GRAPH ?g { } }

Вообще говоря, всегда рекомендуется использовать абсолютные URI, чтобы гарантировать, что вы создаете данные, которые вы ожидаете в ожидаемом графике, относительные URI подвержены ошибкам, потому что они могут преобразовываться в разные абсолютные URI в зависимости от контекста, в котором они разрешаются.

person RobV    schedule 10.05.2013
comment
turtle.ttl - это базовый запрос вставки sparql - префикс a: ‹xx› INSERT DATA {graph ‹graph› {‹dassdds› a: adddda paráda !!!}} - он такой же, как в текущем примере. Так есть ли возможность, как это сделать? Google мне не помог ... Спасибо большое - person 159753; 10.05.2013
comment
@ 159753 Я добавил в свой ответ больше предложений, основанных на вашей дополнительной информации - person RobV; 10.05.2013
comment
С URI нет проблем, я везде использую absolute. Так или иначе, я отредактировал основной текст - просто чтобы создать новый график через UpdateRequest - все равно не могу достичь цели :( - person 159753; 10.05.2013
comment
Хм, попробуйте включить ведение журнала на уровне DEBUG для вашего кода. ARQ использует Apache HttpClient под капотом для отправки обновлений, поэтому с входом на уровне DEBUG вы сможете точно видеть, что отправляется на сервер и с него. Одна из возможностей заключается в том, что ваш сервер не поддерживает POST запросы с Content-Type: application/sparql-update, что и делает ваш код, вы можете попробовать использовать вместо этого UpdateExecutionFactory.createRemoteForm(), который отправляет более традиционный запрос POST с кодировкой URL формы - person RobV; 11.05.2013
comment
Также обратите внимание, что простое обновление CREATE может в любом случае не иметь никакого эффекта, если базовое хранилище не имеет представления о пустых графах, от него не требуется ничего делать, а CREATE по сути является бесполезным - w3.org/TR/sparql11-update/#create - магазины, которые не записывают пустые именованные графы, всегда возвращают успех. о создании несуществующего графа. - person RobV; 11.05.2013
comment
Я использую типичный сервер Virtuoso, и у меня тоже была эта проблема на localhost. Итак, createRemoteForm теперь отлично работает на localhost, проблема на другом сервере, но я думаю, что это вопрос к администратору этого сервера, верно? Или у вас есть еще один хороший совет? :-) В любом случае спасибо большое :) - person 159753; 11.05.2013

Virtuoso не поддерживает INSERT DATA {graph <graph> {}} использование интерактивной документации.

400 Bad Request означает синтаксическую ошибку сервера.

Вам нужно будет отправить строку запроса прямо на сервер - поскольку это не синаткс SPARQL 1.1, Jena не будет его анализировать.

person AndyS    schedule 11.05.2013
comment
Так почему он работает на localhost: 8890 (также на сервере Virtuoso)? Есть идеи, как отправить его прямо? Если я попробую это сделать - сообщение может вызвать проблему - ни ошибок, ни изменений в графике ... HttpOp.execHttpPost("http://endpoint:8890/sparql-auth", WebContent.contentTypeSPARQLUpdate, request.toString(), null, null, httpContext); - person 159753; 11.05.2013

Если он работает в интерфейсе проводника Virtuoso (http://localhost:8890), вы можете использовать поставщика Virtuoso Jena и следующий код:

  String queryString = "INSERT DATA {graph <graph> ...."; // your query
  Model m = VirtModel.openDatabaseModel(file, connectionURL, username, password); 
  VirtuosoUpdateRequest vur = VirtuosoUpdateFactory.create(queryString, m);
  vur.exec();  

Он отправит запрос прямо на сервер Virtuoso.

person Sergey Malinin    schedule 07.11.2013

У меня была та же проблема, и она начала работать, когда я добавил «/ update» в конец uri конечной точки.

person Hannu    schedule 12.04.2016