我正在尝试查询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]'''
)也不是正确的语法。
在这种情况下如何处理逗号?
答案 0 :(得分:2)
此答案基于W3C recommendation for Turtle:
前缀IRI的本地部分不允许使用某些特殊字符。根据{{3}}
带前缀的名称是XML QNames的超集。它们的不同之处在于前缀名称的本地部分可能包括:
- 前导数字,例如
leg:3032571
或isbn13:9780136019701
- 非领先冒号,例如
og:video:height
- 保留字符转义序列,例如
醇>wgs:lat\-long
此外,关于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 37000 Error SP030: SPARQL compiler, line 0: Bad character '\' (0x5c) in SPARQL expression at '\'
这应该是一个错误。