除了XML

问题描述

我正在使用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"

(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既不抱怨formatoutput(如results)也不打印它们(如query)呢?

解决方法

SPARQLWrapper默认为添加

&format=turtle&output=turtle&results=turtle

针对请求。

SPARQLWrapper具有方法setOnlyConneg,该方法可以关闭其他查询字符串部分的添加。

  1. 发生WARN SPARQL Query: Unrecognize request parameter (ignored): results的原因是Fuseki确实了解results并记录了有关它的警告。这只是一个警告。

  2. format是一种覆盖适当的HTTP内容协商机制的机制,因为在某些情况下很难设置HTTP标头。这不适用于正确设置Accept:的SPARQLWrapper。

  3. format=turtle不在CONSTRUCT查询的名称列表中。 ttl是。 (为了完整起见,可以将turtle添加到Fuseki的未来版本中。)

最好的方法是不要使非标准查询字符串参数带有setOnlyConneg。 SPARQLWrapper在请求中正确设置了“ Accept:”标头,Fuseki进行了内容协商,并将与该标头一起使用。