DBPedia 的 SPARQL 和 SNORQL 返回不同的结果

DBPedia's SPARQL and SNORQL returning different results

DBpedia SPARQL endpoint、运行

PREFIX dc: <http://purl.org/dc/elements/1.1/>
PREFIX : <http://dbpedia.org/resource/>
PREFIX dbpedia2: <http://dbpedia.org/property/>

SELECT ?a (3+3 AS ?y)
WHERE 
{ 
   ?a dc:description "English footballer" .
   ?a dbpedia2:placeOfBirth :Merseyside .
}

显示所有 English Footballers 出生在默西塞德郡的人,列 y 仅在每一行显示值 6 [result link]; however, the same query on the SNORQL endpoint 显示错误:

Virtuoso 37000 Error SP030: SPARQL compiler, line 16: syntax error at '3'
before 'AS' SPARQL query: define sql:big-data-const 0 #output-
format:application/sparql-results+json define input:default-graph-uri PREFIX 
owl: PREFIX xsd: PREFIX rdfs: PREFIX rdf: PREFIX foaf: PREFIX dc: PREFIX : 
PREFIX dbpedia2: PREFIX dbpedia: PREFIX skos: PREFIX pos: PREFIX dbo: SELECT 
?a (3 3 AS ?y) WHERE { ?a dc:description "English footballer" . ?a 
dbpedia2:placeOfBirth :Merseyside . }

更奇怪的是,使用其他 3 个算术运算符中的任何一个 都可以在 SNORQL 端点中工作(例如 with division

A previous question 暗示 SPARQL 和 SNORQL 端点应该 return 相同的结果,那么这里发生了什么?!

Kingsley Idehen 在邮件列表中回复说:

The snorql doesn't encode properly plus, so the expression becomes : "SELECT ?a (3 3 AS ?y)” which is wrong.

snorql 代码使用了 'escape' javascript 函数,该函数不是对一段文本进行编码的正确函数,该文本需要作为参数参数嵌入到官方 /sparql 端点。

这导致 + 字符作为文字传输,并被 /sparql 端点解码为 space 字符,从而改变查询的语法。

我们修复了 dbpedia.org 上的 snorql 代码以使用 encodeURIComponent,如:

url = url + '&query=' + encodeURIComponent(query_text);

闭包证明,通过与实际数据状态松散耦合的“Cool URI”。