SPARQLWrapper can';t使构造查询返回非XML
我使用SPARQLWrapper查询本地SPARQL端点(使用ApacheJena fuseki),我的一些查询是构造查询 该查询将在基于web的SPARQL界面(例如yasgui)上为我提供有效的结果。 使用SPARQLWrapper时,默认的查询方法将显示以下错误:SPARQLWrapper can';t使构造查询返回非XML,sparql,fuseki,sparqlwrapper,Sparql,Fuseki,Sparqlwrapper,我使用SPARQLWrapper查询本地SPARQL端点(使用ApacheJena fuseki),我的一些查询是构造查询 该查询将在基于web的SPARQL界面(例如yasgui)上为我提供有效的结果。 使用SPARQLWrapper时,默认的查询方法将显示以下错误: Response: b'Error 400: Failed to write output in RDF/XML: Only well-formed absolute URIrefs can be included in RDF
Response:
b'Error 400: Failed to write output in RDF/XML: Only well-formed absolute URIrefs can be included in RDF/XML output: <arcp://uuid,00000000-0000-0000-0000-000000000000/> Code: 28/NOT_DNS_NAME in HOST: The host component did not meet the restrictions on DNS names.\n'
(构造查询不支持JSON。)
如果使用给定字符串以外的自定义字符串,它将自动回退到XML(如文档中所述)
这个错误是由fuseki产生的,所以我相信我可能做错了什么。有人经历过这种情况吗?如何解决
我用于执行查询的代码段:
import SPARQLWrapper
sparql = SPARQLWrapper.SPARQLWrapper('http://localhost:3030/prov')
#query = '' # The CONSTRUCT query here
sparql.setQuery(query)
sparql.setReturnFormat(SPARQLWrapper.N3)
return sparql.query().convert()
正如@AndyS所建议的,我用Turtle替换了N3,但错误仍然存在。使用-v运行fuseki,我得到的结果如下:
[2020-11-04 17:02:22] Fuseki INFO [1] => User-Agent: sparqlwrapper 1.8.5 (rdflib.github.io/sparqlwrapper)
[2020-11-04 17:02:22] Fuseki INFO [1] => Connection: close
[2020-11-04 17:02:22] Fuseki INFO [1] => Host: 127.0.0.1:3030
[2020-11-04 17:02:22] Fuseki INFO [1] => Accept-Encoding: identity
[2020-11-04 17:02:22] Fuseki INFO [1] => Accept: application/turtle,text/turtle
[2020-11-04 17:02:22] Fuseki WARN SPARQL Query: Unrecognize request parameter (ignored): results
[2020-11-04 17:02:22] Fuseki INFO [1] Query =
MY-ORIGINAL-QUERY-OMITTED
[2020-11-04 17:02:22] Fuseki INFO [1] <= Vary: Accept,Accept-Encoding,Accept-Charset
[2020-11-04 17:02:22] Fuseki INFO [1] 400 Can't determine output content type: turtle (165 ms)
也许它们与错误有关?但是为什么fuseki不抱怨
格式
和输出
(如结果
),也不打印它们(如查询
)?&format=turtle&output=turtle&results=turtle
根据请求
SPARQLWrapper有一个方法setonlyconnect
,该方法关闭添加额外的查询字符串部分
WARN SPARQL查询:Unrecognize请求参数(已忽略):results
之所以发生,是因为Fuseki确实理解了results
并记录了有关它的警告。这只是一个警告
format
是一种覆盖适当的HTTP内容协商机制的机制,因为在某些情况下很难设置HTTP头。这不适用于SPARQLWrapper,它正确设置了Accept:
format=turtle
不在构造查询的名称列表中<代码>ttl为。(`为了完整起见,可以将海龟添加到Fuseki的未来版本中)
最好的方法是不要将非标准查询字符串参数设置为
setonlyconnect
。SPARQLWrapper在请求中正确设置了“Accept:”标头,Fuseki进行了内容协商,并将使用该标头。我很困惑-您已将数据加载到本地Fuseki三重存储中,对吗?如果有,哪个版本?如果是这样的话,为什么不能通过标准SPARQL支持的响应类型获得任何响应?(1)使用“-v”运行Fuseki以查看实际发送的HTTP头是什么。(2) 要海龟,不要N3。获取RDF/XML表明它不是Fuseki支持的MIME类型(它提供了N3所支持的标准类型和数据,就像Turtle一样,尽管SPARQLWrapper似乎确实为N3提供了Turtle,至少在我看到的版本中是如此)。@UninformedUser Yes。我正在使用fueski 3.13.1,它是从AUR(archlinux的)安装的。Fuseki似乎工作正常,我可以使用YASGUI或Fuseki的内置web界面获得响应。当我使用SPARQLWrapper时,问题就出现了——我的系统是用Python编写的。选择查询不会出现这种情况——我正在使用一些构造查询。@AndyS感谢您的建议。我重新运行代码,错误仍然存在。我更新了描述并在最后添加了新信息。真正的问题是“海龟”不是“输出”(或“格式”)的合法名称。“ttl”是。这并不是这个机制的真正目的,理想的情况是sparqlwrapper使用“Accept:”而不是替代的、非标准的“?格式”。SPARQLWrapper具有setOnlyConnect
,因此请尝试将其设置为true。不应添加then result/output/format查询参数。或者错误的样式:Wrapper.\u returnFormatSetting=()
或修复数据,因为“arcp://”表示下一部分是主机名,“uuid,00000000-0000-0000-0000-000000000000”不是合法的主机名(逗号不正确)
[2020-11-04 17:02:22] Fuseki INFO [1] => User-Agent: sparqlwrapper 1.8.5 (rdflib.github.io/sparqlwrapper)
[2020-11-04 17:02:22] Fuseki INFO [1] => Connection: close
[2020-11-04 17:02:22] Fuseki INFO [1] => Host: 127.0.0.1:3030
[2020-11-04 17:02:22] Fuseki INFO [1] => Accept-Encoding: identity
[2020-11-04 17:02:22] Fuseki INFO [1] => Accept: application/turtle,text/turtle
[2020-11-04 17:02:22] Fuseki WARN SPARQL Query: Unrecognize request parameter (ignored): results
[2020-11-04 17:02:22] Fuseki INFO [1] Query =
MY-ORIGINAL-QUERY-OMITTED
[2020-11-04 17:02:22] Fuseki INFO [1] <= Vary: Accept,Accept-Encoding,Accept-Charset
[2020-11-04 17:02:22] Fuseki INFO [1] 400 Can't determine output content type: turtle (165 ms)
&format=turtle&output=turtle&results=turtle