我正在使用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。)
我找到了这个帖子。不幸的是,源数据超出了我的控制范围,因此我无法轻松更改其内容-它是CWL-Prov,其标准要求它使用此表示形式。因此,我需要使用其他返回格式。我在yasgui上尝试了N-Triples和Turtle格式,它们在那里工作。
但是,在SPARQLWrapper上设置返回格式时,会出现问题。如果将其设置为以外的任何其他值SPARQLWrapper.XML
,它将返回此错误(以N3为例):
Response:
b"Error 400: Can't determine output content type: n3\n"
(CONSTRUCT查询不支持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
也许它们与错误有关?但是,为什么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标头。这不适用于正确设置的SPARQLWrapper Accept:
。
format=turtle
不在CONSTRUCT查询的名称列表中。ttl
是。(为了完整起见,可以将turtle添加到Fuseki的未来版本中)。
最好的方法是不要使非标准查询字符串参数带有setOnlyConneg
。SPARQLWrapper在请求中正确设置了“ Accept:”标头,Fuseki进行了内容协商,并将与该标头一起使用。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句