【问题标题】:Query Marklogic with RDF4J SPARQLRepository使用 RDF4J SPARQLRepository 查询 Marklogic
【发布时间】:2017-01-13 14:31:46
【问题描述】:

我尝试通过他们的 sparql 端点和来自 rdf4j(2.1.4) 的 sparqlrepository 查询 marklogic 服务器(版本 8),但 marklogic 端点​​似乎不接受这些 sparql 查询。

代码示例:

String sparqlEndpoint = "http://url/v1/graphs/sparql";
SPARQLRepository repo = new SPARQLRepository(sparqlEndpoint);
repo.initialize();
repo.getConnection().hasStatement(null, null, null, false);

这会导致以下错误:

"errorResponse":{"statusCode":400, "status":"Bad Request", "messageCode":"REST-UNSUPPORTEDPARAM", "message":"REST-UNSUPPORTEDPARAM: (err:FOER0000) 端点没有支持查询参数:无效参数:queryLn, infer for request"}}

有什么建议吗?

【问题讨论】:

    标签: marklogic marklogic-8 rdf4j


    【解决方案1】:

    MarkLogic 不接受名为 queryLn(查询语言)的参数。

    这两种语言是 SARQL 和 StructuredQueries,并使用不同的参数来传递这两种语言。

    请参阅此处的文档: https://docs.marklogic.com/REST/GET/v1/graphs/sparql

    我建议您找到一种方法来抑制调用代码中的 queryLn 参数..

    【讨论】:

    • 问题记录为 RDF4J 中的错误:github.com/eclipse/rdf4j/issues/721。可以说,MarkLogic 可能会更宽松一些,只是忽略该参数:)
    • 对于问题范围,基本答案是否可接受且完整?如果是这样,请将其标记为这样,以便我们保持 Stack Overflow 干净。任何系统忽略调用者认为必要的未知参数都是危险的。对我来说,连接系统将遵循记录的 API 更有意义。 MarkLogic 可以考虑将 queryLn 视为只有一个有效值 (SPARQL) 的“可选”参数,而不是忽略参数。这与允许客户端连接到 API 并认为它正在发送被忽略的有用参数完全不同。
    • queryLn 是一个特定于 RDF4J 自己的 REST API 的参数。这不是客户端错误地认为这是 MarkLogic 的 API 可以理解的问题,它只是一些冗余信息,包含在基于 RDF4J 的服务器中,但在标准 SPARQL 协议中没有任何意义。记录警告是明智的,但没有理由让请求完全失败:服务器接收到足够的信息来满足请求(据我所知,SPARQL 协议中没有要求 only 记录的参数已发送)。
    【解决方案2】:

    正如 David Ennis 的回答中所解释的,问题在于 RDF4J 的 SPARQL 端点客户端在其请求中发送了几个不属于 W3C SPARQL 1.1 Protocol 的参数;它们是RDF4J REST API(SPARQL 协议的扩展)的一部分。

    虽然大多数 SPARQL 端点实现只是忽略不属于标准的参数(或记录警告),但 MarkLogic 实现了更严格的策略,并且完全拒绝回答此类请求。

    您的解决方案是升级到 RDF4J 2.2。改进#721,即确保仅将符合标准的参数发送到非 RDF4J SPARQL 端点,已在此新版本中实现,并且(假设 MarkLogic 在其他方面符合标准)这应该解决与您的 MarkLogic 端点​​。

    【讨论】:

      猜你喜欢
      • 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
      相关资源
      最近更新 更多