除了 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 不抱怨 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 headers。这不适用于正确设置 Accept:
.
的 SPARQLWrapper
format=turtle
不在 CONSTRUCT 查询的名称列表中。 ttl
是。 (为了完整性,`turtle 可以添加到 Fuseki 的未来版本中)。
最好的方法是不要让 non-standard 查询字符串参数带有 setOnlyConneg
。 SPARQLWrapper 在请求中正确设置了“Accept:”header,并且 Fuseki 进行了内容协商并将使用该 header.
我正在使用 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。)
我发现
但是,在 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 不抱怨 format
和 output
(比如 results
)也不打印它们(比如 query
)?
SPARQLWrapper 默认添加
&format=turtle&output=turtle&results=turtle
请求。
SPARQLWrapper 有一个方法 setOnlyConneg
可以关闭添加额外的查询字符串部分。
WARN SPARQL Query: Unrecognize request parameter (ignored): results
的发生是因为 Fuseki 确实理解results
并记录了有关它的警告。这只是一个警告。
的 SPARQLWrapperformat
是一种覆盖正确的 HTTP 内容协商机制的机制,因为在某些情况下很难设置 HTTP headers。这不适用于正确设置Accept:
.format=turtle
不在 CONSTRUCT 查询的名称列表中。ttl
是。 (为了完整性,`turtle 可以添加到 Fuseki 的未来版本中)。
最好的方法是不要让 non-standard 查询字符串参数带有 setOnlyConneg
。 SPARQLWrapper 在请求中正确设置了“Accept:”header,并且 Fuseki 进行了内容协商并将使用该 header.