不能使用SPARQL进行PREFIX层次结构

时间:2014-08-28 11:01:16

标签: rdf sparql jena arq

我需要在我的网址中表示层次结构,如下所示:

http://www.me.org/
-----------------root1/
-----------------------level1/
------------------------------level2/etc

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

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

select * where {
    ?s ?p root1:level1/level2/etc .
} limit 100

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

Encountered " "/" "/ "" at line 10, column 43.
Was expecting one of:
    "values" ...
    "graph" ...
...

我是否能够在我的网址中表示层次结构,或者SPARQL和PREFIX是否仅限于一个级别?

3 个答案:

答案 0 :(得分:6)

  

4.1.1.1 Prefixed Names

     

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

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

  

19.8 Grammar

     

...

[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 .

答案 1 :(得分:6)

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

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

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

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

答案 2 :(得分:4)

  

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

您似乎将URI与前缀名称混淆,前缀名称是一种便利机制,旨在允许您以更紧凑的形式写下URI以便于人类可读性。因此,它们不能代表所有可能的URI而不使用转义字符来处理语法中不明确的事情。

正如约书亚·泰勒的回答所证明的那样(在您看来),您不能使用相对URI作为前缀名称,这仅仅是SPARQL和其他RDF序列化的语法限制使用类似的句法结构。

但是,如果我们改为使用BASE指令,我们可以自然地写下相对URI而无需使用任何特殊字符。

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

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

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

这可能会给你一些你认为更自然的东西吗?