我在向我的sparql客户端端点提出邮政请求时会遇到以下错误:
Malformed query: org.openrdf.rio.RDFParseException: IRI included an unencoded space: '32' [line 1]
我正在使用Postman提出请求,并设置了一个是内容类型的单个标头,并具有值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客户端/Neptune数据库只能了解其中的三元组。
我在网上看到了很多有关此错误的信息,但找不到与直接发布数据有关的解决方案。任何想法如何解决此问题?
如评论中所讨论的,您的sparql命令在语法上无效:您不能仅在sparql INSERT DATA
命令中粘贴rdf/xml文档(请参阅SPARQL Update Specification有关详细信息正确的语法(。
我希望我只能在身体中发布整个RDF XML文档,而SPARQL客户端/Neptune数据库只能了解其中的三元组。
不幸的是,Neptune别无选择(至少在我从Neptune Docs中所看到的那样(。
您可以使用UPDATE LOAD
命令将RDF/XML文档上传到Neptune,如Neptune文档所示。如果不是您的选项,则需要转换文档中的数据以以某种方式纠正SPARQL语法。
有几种方法可以做到这一点,但是如果您在Java工作,一种可能的选择是使用RDF4J存储库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 Server可以理解的SPARQL更新请求(稍微警告:我没有使用Neptune对此进行测试,但是如果它符合SPARQL W3C建议,则该建议应该可以使用(。