问题描述
我正在使用SPARQLWrapper查询本地SPARQL端点(使用apache-jena-fuseki),而我的一些查询是CONSTRUCT查询。
查询将为我提供基于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。)
我找到了this post。不幸的是,源数据不受我的控制,因此我无法轻松更改其内容-它是CWL-Prov,其standard告诉它使用此表示形式。 因此,我需要使用其他返回格式。我在yasgui上尝试了N-Triples和Turtle格式,它们在那里工作。
但是,在SPARQLWrapper上设置返回格式时,会出现问题。如果我将其设置为SPARQLWrapper.XML
以外的任何其他值,它将返回此错误(以N3为例):
Response:
b"Error 400: Can't determine output content type: n3\n"
如果我使用给定字符串以外的自定义字符串,它将自动回退到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方案的违反也有一些错误,我在这里省略。
&format=turtle&output=turtle&results=turtle
也许它们与错误有关?但是,为什么funki既不抱怨format
和output
(如results
)也不打印它们(如query
)呢?
解决方法
SPARQLWrapper默认为添加
&format=turtle&output=turtle&results=turtle
针对请求。
SPARQLWrapper具有方法setOnlyConneg
,该方法可以关闭其他查询字符串部分的添加。
-
发生
WARN SPARQL Query: Unrecognize request parameter (ignored): results
的原因是Fuseki确实了解results
并记录了有关它的警告。这只是一个警告。 -
format
是一种覆盖适当的HTTP内容协商机制的机制,因为在某些情况下很难设置HTTP标头。这不适用于正确设置Accept:
的SPARQLWrapper。 -
format=turtle
不在CONSTRUCT查询的名称列表中。ttl
是。 (为了完整起见,可以将turtle添加到Fuseki的未来版本中。)
最好的方法是不要使非标准查询字符串参数带有setOnlyConneg
。 SPARQLWrapper在请求中正确设置了“ Accept:”标头,Fuseki进行了内容协商,并将与该标头一起使用。