【问题标题】:Setting content type in Jena RDFConnection Header在 Jena RDFConnection Header 中设置内容类型
【发布时间】:2022-08-04 15:01:05
【问题描述】:

我需要在 Jena 事务中修改 RDFConnection 对象的请求(例如:更新)的标头(特别是 Content-Type)。更准确地说,我需要添加以下 Header Content_Type Content-Type = [application/sparql-query; charset=UTF-8]

在下面的代码中

try (RDFConnection conn = connectionFactory.create()) {
  Txn.executeWrite(conn, () -> {
    conn.update(updateRequest);// HERE we want to setup the Content-Type in the header
  });
}catch (Exception e) {... }

我已将 connectionFactory 设置如下

public RDFConnection create() {
    HttpClientBuilder httpClientBuilder = HttpClientBuilder.create();
    HttpClient httpClient = httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider)
        .build();
    return
        RDFConnectionRemote.create()
        .destination(endpointURL)
        .queryEndpoint(\"query\")
        .updateEndpoint(\"update\")
        .httpClient(httpClient)
        .parseCheckSPARQL(true)
        .build();
  }

因此,我仍然需要在请求标头 content-Type 中指定请求正文的字符集。我怎么能用 JENA 做到这一点?

注意:默认的 JENA RDFConnection 设置是不够的,因为远程端点仍然需要明确的字符集规范来解析我在 URI 中包含法语口音的 SPARQL 请求。

提前致谢

  • SPARQL 更新字符串是为 UTF-8 定义的(仅)。如果端点不遵守这一点,这是一个错误,尽管请确保 updateRequest 字符串是 UTF-8(例如,如果它是从 Windows 上的文件中读取的,则可能不是)。服务器端点在运行什么?
  • Apache Jena 已切换(在 4.3 版)使用 JDK java.net.http 代码 - 您的示例使用 Apache HttpComponents。
  • @Andys 感谢您的快速反馈。我正在使用免费版的 stardog Triplestore。 curl --location --request POST \'http://localhost:5820/datasetTest/query\'\\ --header \'Origin: https://stardog.studio/\'\\ --header \'Content type: application/sparql-query; charset=UTF-8\'\\ --data-raw \'select distinct * where { graph ?g { <https://myTest.com/ontologies#Régime_Alimentaire> ?x ?y }}\' 此查询返回预期结果。但是,如果我删除 Content-Type 或 charset=UTF-8,查询将返回空。
  • @Andys,我刚刚在 Stardog 社区中发现了一份报告,其中用户在使用 rdflib (python) 查询 Stardog 时必须将 Header Content-Type 指定为 charset=UTF-8 (https://community.stardog) .com/t/python3-8-rdflib-utf-8-problems-sparqlstore/3394) 由于此错误似乎在某些 Triplestore 中反复出现,有没有办法访问 Jena RDFConnection 中的 Content-Type 参数?谢谢 :)
  • curl 请求的标头错误:\"Content type:\"(没有 \"-\"),它是查询而不是更新。抱歉——这些细节很重要。如果根本没有 Content-type,那么它根本就不是 SPARQL 查询。如果查询不匹配,那么关于更新是否插入错误或查询没有正确传输,或者如果没有强制字符集,stardog 可能会尝试自动检测。正如耶拿票上所问的那样,您使用的是什么操作系统?

标签: java sparql jena triplestore


【解决方案1】:

Apache Jena 4.3.2 有一个统一的接口,可以详细控制 HTTP 请求。

http://jena.apache.org/documentation/sparql-apis/#changes

对于 SPARQL 更新 UpdateExecutionHTTP.newBuilder() 和 SPARQL 查询 QueryExecutionHTTP.newBuilder(),有一个用于设置任何 HTTP 标头的构建器操作。

【讨论】:

  • 感谢@Andys 的反馈和回复。是的,我们同意这主要是一个 STARDOG 错误(我在标签中添加了它)。实际上,JENA UpdateExecHTTP 另一方面允许访问标头的配置,除非我弄错了(?),这个系统不像 RDFConnection 那样是事务性的。
  • 我们会将其标记为已接受的答案。在大多数情况下,我们仍在使用 Jena 3.x。我们开始慢慢升级到 4.2。原因是我们被困在仅内置 Java8 的 centos 服务器上。由于 centos 发生了巨大的变化,我们转移到了其他 OS + java 11。一些代码仍在使用旧的 Jena。
  • RDFConnection 对服务器来说不是事务性的,因此不会丢失任何内容。 RDFConnection 的事务是本地/客户端隔离。 SPARQL 更新操作被定义为原子的,通常系统封装在服务器的事务中。因此,使用 UpdateExecutionHTTP 和通用 SPARQL 协议不会丢失功能。以原子方式执行是服务器的职责。
  • @mahery-rafara 您可以在更改常量后从源代码构建。发布是带有方便二进制文件的源代码,这些二进制文件将进入 Maven 中心。但是 Java8 现在变得有点老了(安全性),而 Java11 更快。
猜你喜欢
  • 1970-01-01
  • 2013-07-12
  • 2019-06-12
  • 2014-09-11
  • 2012-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多