首页 文章

Jena SPARQL 更新无法执行

提问于
浏览
2

我的情况很简单:我有一个 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-endpoint?

编辑 1

这是一个较小的例子,也没有用。我可以在浏览器中通过 sparql-endpoint 创建一个新图形,但在 Jena 中我不能;没有错误,没有新的图表。

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

使用带有 sparql-auth-endpoint 的 Virtuoso 服务器,我已经改变了这些行,它的工作效果要好得多。

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

嗯,它适用于 localhost:8890,但不适用于另一个 virtuoso 服务器

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()

4 回答

  • 2

    您正在使用此行阅读的实际 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。

  • 0

    Virtuoso 不支持INSERT DATA {graph <graph> {}}前往在线文档

    400 Bad Request表示服务器的语法错误。

    您需要将请求字符串直接发送到服务器 - 因为它不是 SPARQL 1.1 synatx,Jena 不会解析它。

  • 0

    如果它在 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 服务器发送查询。

  • 0

    我有同样的问题,当我在端点 uri 的末尾添加“/update”时它开始工作。

相关问题