我使用SPARQLWrapper查询本地SPARQL端点(使用apache 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/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'(我已将UUID替换为0。)
我找到了这个职位。不幸的是,源数据超出了我的控制范围,所以我不能轻松地更改它的内容--它是control,它的标准告诉它使用这种表示形式。因此,我需要使用其他返回格式。我在yasgui上尝试了和Turtle格式,它们在那里工作。
但是,当在SPARQLWrapper上设置返回格式时,会出现问题。如果我将其设置为SPARQLWrapper.XML以外的任何内容,它将返回此错误(以N3为例):
Response:
b"Error 400: Can't determine output content type: n3\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)我复制了打印的查询,它在YASGUI上工作。还有一些关于URI/IRI方案违反的错误,我在这里省略了这些错误。
我在查询URL的末尾看到了这些额外的查询参数:
&format=turtle&output=turtle&results=turtle也许它们与错误有关?但是为什么fuseki不抱怨format和output (比如results),也不打印它们(比如query)?
发布于 2020-11-05 17:35:28
SPARQLWrapper默认添加
&format=turtle&output=turtle&results=turtle
为了请求。
SPARQLWrapper有一个方法setOnlyConneg,它关闭附加查询字符串部件的添加。
WARN SPARQL Query: Unrecognize request parameter (ignored): results,是因为Fuseki确实理解results并记录了关于它的警告。这只是一个警告。format是一种覆盖适当HTTP内容协商机制的机制,因为在某些情况下很难设置headers。这不适用于SPARQLWrapper,它确实正确地设置了Accept:。format=turtle不在构造查询的名称列表中。ttl是。(“为完整起见,可将海龟添加到未来版本的Fuseki中)。最好的方法是不使用setOnlyConneg的非标准查询字符串参数。SPARQLWrapper在请求中正确地设置了"Accept:“报头,而Fuseki有内容协商,并将与该标头一起工作。
https://stackoverflow.com/questions/64646788
复制相似问题