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

Int*_*ion 3 rdf sparql jena arq

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

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

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

Jos*_*lor 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  ::=   '\' ( '_' | '~' | '.' | '-' | '!' | '$' | '&' | "'" | '(' | ')' | '*' | '+' | ',' | ';' | '=' | '/' | '?'
Run Code Online (Sandbox Code Playgroud)

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

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

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

因此你应该能够写:

?s ?p root1:level1\/level2\/element .
Run Code Online (Sandbox Code Playgroud)

  • +1只是键入相同的东西,但你打败了我! (2认同)

And*_*dyS 6

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

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

SELECT * {
  ?s ?p  level2:etc .
}
Run Code Online (Sandbox Code Playgroud)

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