在Sparql WHERE子句中使用命名空间PREFIX时处理逗号

时间:2016-09-05 22:48:30

标签: sparql semantic-web dbpedia virtuoso

我正在尝试查询skos:broader属性以查找DBPedia类别“Diseases_of_oral_cavity,_salivary_glands_and_jaws”。此类别在以下URI中可用: http://dbpedia.org/resource/Category:Diseases_of_oral_cavity,_salivary_glands_and_jaws

以下查询提供了所需的输出:

PREFIX skos: <http://www.w3.org/2004/02/skos/core#> 

SELECT ?broaderCategory
WHERE {
    <http://dbpedia.org/resource/Category:Diseases_of_oral_cavity,_salivary_glands_and_jaws> skos:broader ?broaderCategory
}

要求是使用Python代码和Sparql包装器在skos:broader属性中查询多个类别。我试图通过为所有DBPedia类别URI定义PREFIX并在WHERE子句中使用它来使代码更具可读性,如下所示:

PREFIX dbpcat: <http://dbpedia.org/resource/Category:> 
PREFIX skos: <http://www.w3.org/2004/02/skos/core#> 

SELECT ?broaderCategory
WHERE {
    dbpcat:Diseases_of_oral_cavity,_salivary_glands_and_jaws skos:broader ?broaderCategory
}

第二个查询在类别名称中的','处返回语法错误。用转义序列(hex-unicode和html)替换逗号没有帮助。并且,使用字符串文字(dbc:"[category]"dbc:'''[category]''')也不是正确的语法。

在这种情况下如何处理逗号?

1 个答案:

答案 0 :(得分:2)

此答案基于W3C recommendation for Turtle

前缀IRI的本地部分不允许使用某些特殊字符。根据{{​​3}}

  

带前缀的名称是XML QNames的超集。它们的不同之处在于前缀名称的本地部分可能包括:

     
      
  1. 前导数字,例如leg:3032571isbn13:9780136019701
  2.   
  3. 非领先冒号,例如og:video:height
  4.   
  5. 保留字符转义序列,例如wgs:lat\-long
  6.   

此外,关于section about IRIs的部分为我们提供了更多见解:

  

% - 编码序列在IRI的字符范围内,并在本地名称中明确允许。这些显示为&#39;%&#39;后跟两个十六进制字符,表示三个字符的相同序列。在处理期间不解码这些序列。在Turtle中写为escape sequences的术语指定IRI http://a.example/%66oo-bar而不是IRI http://a.example/%66oo-bar。写为ex:%66oo-bar且带有前缀@prefix ex: <http://a.example/>的术语也指定IRI http://a.example/foo-bar

更新(根据下面的评论)

正如@AndyS指出的那样,

  

保留字符转义序列由&#39; \&#39;组成。然后是〜.-!$&amp;&#39;()* + ,; = /?#@%_中的一个,并代表&#39; \&#39;右侧的字符。

使用\转义为逗号,即可以编写\,。不幸的是,在使用

的Virtuoso Web UI中仍然无法实现
Virtuoso 37000 Error SP030: SPARQL compiler, line 0: Bad character '\' (0x5c) in SPARQL expression at '\'

这应该是一个错误。