0

向我的 SPARQL 客户端端点发出 POST 请求时出现以下错误:

Malformed query: org.openrdf.rio.RDFParseException: IRI included an unencoded space: '32' [line 1]

我正在使用 Postman 发出请求并设置了一个标头,它是 Content-Type 并且具有 value sparql-update

我在正文中传递的数据是这样的:

insert data { <rdf:RDF xmlns:html="http://www.w3.org/1999/xhtml"
         xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
         xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
         xmlns:country="http://example.xyz.ds/country/"
         xmlns:currency="http://example.xyz.ds/currency/"
         xmlns:area="http://example.xyz.ds/area/"
         xmlns:city="http://example.xyz.ds/city/"
         xmlns:root="http://example.xyz.ds/terms#"
         xmlns:specialIdenifier="http://example.xyz.ds/specialIdenifier/"
         xmlns:product="http://example.xyz.ds/product/"
         xmlns:company="http://example.xyz.ds/company/"
         xmlns:office="http://example.xyz.ds/office/"
         xmlns:schema="http://schema.org/"
         xmlns:uuid="java:java.util.UUID"
         xmlns:acmUtil="http://example.xyz.ds/util-functions">
    <rdf:Description rdf:about="http://example.xyz.ds/company/123456789>
        <rdf:type rdf:resource="http://example.xyz.ds/terms#company"/>
        <rdfs:label/>
        <root:fid xmlns:urn="urn:"
                  xmlns:func="http://example.xyz.ds/func"
                  rdf:datatype="http://www.w3.org/2001/XMLSchema#string">4049</root:fid>
        <root:deleted xmlns:urn="urn:"
                      xmlns:func="http://example.xyz.ds/func"
                      rdf:datatype="http://www.w3.org/2001/XMLSchema#boolean">false</root:deleted>
    </rdf:Description>
</rdf:RDF> }

我希望我可以将整个 RDF XML 文档发布到正文中,并且 SPARQL 客户端/海王星数据库只会理解其中的三元组。

我在网上看到了很多关于此错误的信息,但找不到与直接发布数据相关的解决方案。知道如何解决这个问题吗?

4

1 回答 1

1

正如评论中所讨论的,您的 SPARQL 命令在语法上无效:您不能只是将 RDF/XML 文档粘贴到 SPARQLINSERT DATA命令中(有关正确语法的详细信息,请参阅SPARQL 更新规范)。

我希望我可以将整个 RDF XML 文档发布到正文中,并且 SPARQL 客户端/海王星数据库只会理解其中的三元组。

不幸的是,海王星对此没有选择(至少,就我从海王星文档中看到的而言)。

您可以使用命令将 RDF/XML 文档上传到 Neptune UPDATE LOAD,如Neptune 文档中所示。如果这不是您的选择,您将需要以某种方式将文档中的数据转换为更正 SPARQL 语法。

有几种方法可以做到这一点,但如果您使用 Java,一种可能的选择是使用rdf4j Repository API。您可以使用SPARQLRepository该类连接到 Neptune 实例的 SPARQL 端点,如下所示:

Repository rep = new SPARQLRepository("https://your-neptune-endpoint:port/sparql");
rep.init();

然后你可以打开一个连接并以这种方式加载你的文件:

try(RepositoryConnection conn = rep.getConnection()) {
      File file = new File("/my/local/rdf-xml-file.rdf");
      conn.add(file, "", RDFFormat.RDFXML);
}

Rdf4j 将负责将您的命令转换为 Neptune 服务器可以理解的 SPARQL 更新请求(轻微警告:我自己没有使用 Neptune 对此进行过测试,但如果它符合 SPARQL W3C 建议,这应该可以工作)。

于 2019-06-27T03:55:27.147 回答