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是否仅限于一个级别?
4.1.1.1前缀名称
PREFIX关键字将前缀标签与IRI相关联.带前缀的名称是前缀标签和本地部分,用冒号":"分隔.通过连接与前缀和本地部分关联的IRI,将前缀名称映射到IRI.前缀标签或本地部分可以为空.请注意,SPARQL本地名称允许前导数字,而XML本地名称则不允许.SPARQL本地名称还允许IRI中允许的非字母数字字符通过反斜杠字符转义(例如ns:id\= 123).SPARQL本地名称比CURIE具有更多的语法限制.
让我们检查一下语法,看看是否\是一个假设的非字母数字字符:
19.8语法
...
Run Code Online (Sandbox Code Playgroud)[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 .
Run Code Online (Sandbox Code Playgroud)
您可以在前缀声明中使用相对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中重复部分字符串的一些开销.