2014-03-29 62 views
0

是否可以在使用Fuseki的SPARQL查询中将双引号用作URI的一部分?我的工作掀起了DBpedia的数据集,它有一些类似的URI:在Fuseki SPARQL查询中转义双引号?

<http://dbpedia.org/resource/"Crocodile"_Dundee> 

我已经试过:

PREFIX dbo: <http://dbpedia.org/ontology/> SELECT ?summary WHERE { <http://dbpedia.org/resource/\"Crocodile\"_Dundee> dbo:abstract ?summary }" localhost:3030/knowledge/query 

PREFIX dbo: <http://dbpedia.org/ontology/> SELECT ?summary WHERE { <http://dbpedia.org/resource/%22Crocodile%22_Dundee> dbo:abstract ?summary }" localhost:3030/knowledge/query 

而是继续出现以下错误:

Encountered " "<" "< "" at line 1, column 68. 
Was expecting one of: 
<IRIref> ... 

回答

1

经过一些更多的阅读和实验后,问题是因为我没有正确设置Content-Type标题。它需要设置为application/sparql-query,然后你可以使用百分号编码(虽然它是由SPARQL规范气馁),像这样:

curl -i -X POST -d 'PREFIX dbo: <http://dbpedia.org/ontology/> SELECT ?summary WHERE { <http://dbpedia.org/resource/%22Crocodile%22_Dundee> dbo:abstract ?summary }' localhost:3030/knowledge/query --header "Content-Type: application/sparql-query" 

可惜我还是没能逃脱双引号工作。

作为奖励,这也可以让你在查询中使用符号(&):

curl -i -X POST -d 'PREFIX dbo: <http://dbpedia.org/ontology/> SELECT ?uri WHERE { { ?alias_uri rdfs:label "Gibson Dunn & Crutcher"@en; dbo:wikiPageRedirects ?uri . } UNION { ?uri rdfs:label "Gibson Dunn & Crutcher"@en NOT EXISTS { ?uri dbo:wikiPageRedirects ?nil } } } ' localhost:3030/knowledge/query --header "Content-Type: application/sparql-query" 
4

有两个问题在这里:

  1. 双引号是不允许的URI(RFC 3986) 。
  2. 当您发送%22作为一个HTTP URL查询字符串,另一端将解码这一点,得到“

因此使用POST并把体内的查询避免了问题(或编码%本身获得发送%2522)。

使用--data-binary-d是安全的呢。

+0

感谢澄清!我是假设的问题是双引号使其无效IRI,但不幸的是DBpedia的不通过走该公约。 – frnsys

+0

@frnsys你能否提供任何关于w你的意思是“DBpedia不符合那个惯例”?毕竟,DBpedia没有定义使IRI有效或无效的原因。他们可能存在格式不正确的数据,但在这种情况下,您能举一个例子吗? [DBpedia URI的编码方案](http://wiki.dbpedia.org/URIencoding?v=9oh)表示“Wikipedia页面名称中可能出现的以下字符是百分比编码的:”(双引号)%(百分号) ?(问号) \(反斜杠) ^(插入符号) '(backtick)“。 –

+0

@JoshuaTaylor我得到的URI类似于'而不是用他们的百分比编码,但我现在意识到这可能是因为他们在我收到他们的时候已经解码了。 – frnsys