3

我需要在我的 URL 中表示一个层次结构,如下所示:

http://www.me.org/
-----------------root1/
-  -  -  -  -  -  -  -  -  -  - -1级/
------------------level2/etc

我想定义前缀并在 SPARQL 查询中使用它们,如下所示:

前缀 root1:<http://www.me.org/root1/>

选择 * 其中 {
    ?s ?p root1:level1/level2/etc 。
} 限制 100

这将在 ARQ 中失败,并出现以下错误:

在第 10 行第 43 列遇到“”/“”/“”。
期待其中之一:
    “价值观”...
    “图表”...
...

我应该能够像这样在我的 URL 中表示层次结构,还是 SPARQL 和 PREFIX 的使用仅限于一个级别?

4

3 回答 3

6

您可以在前缀声明中使用相对 URI:

BASE <http://example/>
PREFIX root1:  <root1/>
PREFIX level1: <root1/level1/>
PREFIX level2: <root1/level1/level2/>

SELECT * {
  ?s ?p  level2:etc .
}

这避免了在 URI 中重复部分字符串的一些开销。

于 2014-08-28T12:46:54.790 回答
6

4.1.1.1 前缀名称

PREFIX 关键字将前缀标签与 IRI 相关联。前缀名称是前缀标签和本地部分,用冒号“:”分隔。通过连接与前缀相关联的 IRI 和本地部分,将前缀名称映射到 IRI。前缀标签或本地部分可能为空。请注意,SPARQL 本地名称允许前导数字,而 XML 本地名称不允许。SPARQL 本地名称还允许通过反斜杠字符转义在 IRI 中使用非字母数字字符(例如 ns:id\=123)。SPARQL 本地名称比 CURIE 有更多的语法限制。

让我们检查一下语法,看看是否\是假定的非字母数字字符之一:

19.8 语法

[169]     PN_LOCAL      ::=   (PN_CHARS_U | ':' | [0-9] | PLX ) ((PN_CHARS | '.' | ':' | PLX)* (PN_CHARS | ':' | PLX) )?
[170]     PLX           ::=   PERCENT | PN_LOCAL_ESC
[171]     PERCENT       ::=   '%' HEX HEX
[172]     HEX           ::=   [0-9] | [A-F] | [a-f]
[173]     PN_LOCAL_ESC  ::=   '\' ( '_' | '~' | '.' | '-' | '!' | '$' | '&' | "'" | '(' | ')' | '*' | '+' | ',' | ';' | '=' | '/' | '?'

| '#' | '@' | '%')

果然,我们应该可以通过:

PN_LOCAL → PLX → PN_LOCAL_ESC → '\' '/'

因此,您应该能够编写:

?s ?p root1:level1\/level2\/element .
于 2014-08-28T11:39:47.953 回答
4

我认为问题在于 SPARQL/RDF 的价值主张是它是 WWW 的扩展,并建立在 URI/URL 原则之上,通常被视为使用 / 作为名称空间分隔符,因此您不会期望必须做一些特别的事情处理一个 URL

您似乎将 URI 与前缀名称混为一谈,前缀名称是一种方便的机制,旨在让您以更紧凑的形式写下 URI,以提高人类可读性。因此,如果不对语法中不明确的内容使用转义字符,它们就无法表示所有可能的 URI。

正如 Joshua Taylor 的回答所证明的那样(在您看来)的缺点是您不能按原样使用带有前缀名称的相对 URI,这仅仅是 SPARQL 和使用类似语法结构的其他 RDF 序列化的语法限制。

但是,如果我们使用BASE指令,例如

BASE <http://www.me.org/root1/>

SELECT *
WHERE
{
    ?s ?p <level1/level2/etc> .
}
LIMIT 100

请注意,在这种情况下,我们必须将相对 URI 括起来,< >因为我们使用的是 URI 而不是前缀名称。如果 URI 是相对的,SPARQL 处理器将根据声明的方式解析它,BASE从而为您提供所需的完整 URI,而无需使用任何转义字符。

这也许会给你一些你认为更自然的东西?

于 2014-08-28T12:23:44.133 回答