【问题标题】:Handling commas when using a namespace PREFIX in a Sparql WHERE clause在 Sparql WHERE 子句中使用命名空间 PREFIX 时处理逗号
【发布时间】:2016-09-05 22:48:30
【问题描述】:

我正在尝试查询 DBPedia 类别“Diseases_of_oral_cavity,_salivary_glands_and_jaws”的 skos:broader 属性。此类别在以下 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]''')也不是正确的语法。

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

【问题讨论】:

标签: sparql semantic-web dbpedia virtuoso


【解决方案1】:

此答案基于W3C recommendation for Turtle

前缀 IRI 的本地部分不允许使用某些特殊字符。根据section about IRIs

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

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

此外,关于escape sequences 的部分为我们提供了更多见解:

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

更新(根据下面的评论)

正如@AndyS 指出的那样,

保留字符转义序列由一个“\”和后跟一个 ~.-!$&'()*+,;=/?#@%_ 组成,表示“\”右侧的字符。

所以用\ 转义适用于逗号,即你可以写\,。不幸的是,这仍然在 Virtuoso Web UI 中失败了

Virtuoso 37000 Error SP030: SPARQL compiler, line 0: Bad character '\' (0x5c) in SPARQL expression at '\'

所以这应该是一个错误。

【讨论】:

  • @AndyS 谢谢你的提示,你说得对,我更新了我的答案。
猜你喜欢
  • 2016-11-12
  • 1970-01-01
  • 2011-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多