我需要在我的网址中表示层次结构,如下所示:
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是否仅限于一个级别?
答案 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,而无需使用任何转义字符。
这可能会给你一些你认为更自然的东西吗?