【问题标题】:Jena SPARQL update doesn't executeJena SPARQL 更新不执行
【发布时间】:2013-05-10 17:27:06
【问题描述】:

我的情况很简单:我有一个要上传到 sparql-auth-endpoint 的 RDF (N3) 文件。我使用 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 创建一个新图形,但在耶拿我不能;没有错误,没有新图表。

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

【问题讨论】:

    标签: rdf sparql jena arq


    【解决方案1】:

    您通过这一行阅读的实际 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解决了。​​

    【讨论】:

    • turtle.ttl 是基本的 sparql 插入查询 - 前缀 a: INSERT DATA {graph { a:adddda "paráda!!!"}} - 一样当前示例。那么有没有可能如何做到这一点?谷歌没有帮助我...谢谢很多
    • @159753 我已经根据您的其他信息更新了我的答案,提供了更多建议
    • URI 没有问题,我在任何地方都使用绝对。无论如何,我编辑了正文 - 只是为了通过 UpdateRequest 创建一个新图表 - 仍然无法达到目标:(
    • 嗯,尝试为您的代码启用DEBUG 级别的日志记录。 ARQ 在后台使用 Apache HttpClient 来提交更新,因此通过DEBUG 级别的登录,您应该能够准确地看到发送到服务器和从服务器发送的内容。一种可能性是您的服务器不支持带有Content-Type: application/sparql-updatePOST 请求,这是您的代码所做的,您可以尝试使用UpdateExecutionFactory.createRemoteForm(),而不是发送更传统的表单URL 编码POST 请求
    • 另请注意,裸 CREATE 更新可能无论如何都没有效果,如果底层存储没有空图的概念,则不需要做任何事情,CREATE 本质上是禁止的op - w3.org/TR/sparql11-update/#create - “不记录空命名图的商店将始终在创建不存在的图时返回成功。”
    【解决方案2】:

    Virtuoso 不支持 INSERT DATA {graph &lt;graph&gt; {}}online documentation 替换。

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

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

    【讨论】:

    • 那么为什么它可以在 localhost:8890 (也是 Virtuoso 服务器)中工作?任何想法如何直接发送?如果我尝试这个 - 帖子可能会导致问题 - 没有错误,图表没有变化......HttpOp.execHttpPost("http://endpoint:8890/sparql-auth", WebContent.contentTypeSPARQLUpdate, request.toString(), null, null, httpContext);
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多