除了 XML 之外,SPARQLWrapper 无法进行 CONSTRUCT 查询 return

SPARQLWrapper can't make CONSTRUCT query return other than XML

我正在使用 SPARQLWrapper 查询本地 SPARQL 端点(使用 apache-jena-fuseki),我的一些查询是 CONSTRUCT 查询。

该查询将在基于 Web 的 SPARQL 界面上为我提供有效结果,例如亚斯圭。 使用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。)

我发现 . Unfortunately the source data is out of my control so I cannot change its content easily -- it is CWL-Prov and its standard 告诉它使用这种表示。 因此,我需要使用其他 return 格式。我在 yasgui 上尝试了 N-Triples 和 Turtle 格式,它们在那里工作。

但是,在 SPARQLWrapper 上设置 return 格式时,出现问题。如果我将它设置为 SPARQLWrapper.XML 以外的任何值,它会 return 出现此错误(以 N3 为例):

Response:
b"Error 400: Can't determine output content type: n3\n"

(JSON 不支持 CONSTRUCT 查询。)

如果我使用给定字符串以外的自定义字符串,它将自动回退到 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,但是还是报错。 运行 fuseki 与 -v,这是我得到的:

[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 scheme violation 的错误,这里我省略了。

我在查询末尾看到了这些额外的查询参数 URL:

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

可能与错误有关?但是为什么 fuseki 不抱怨 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 headers。这不适用于正确设置 Accept:.

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

最好的方法是不要让 non-standard 查询字符串参数带有 setOnlyConneg。 SPARQLWrapper 在请求中正确设置了“Accept:”header,并且 Fuseki 进行了内容协商并将使用该 header.