我想使用PREFIX
来简化URI的创建。欢迎任何建议帮助我建立PREFIX
在SPARQL查询中正在做的事情的心理模型的建议-这似乎不是简单的键/值替换。
以下是一些尝试过的例子。
除了不使用PREFIX
之外,这按预期方式工作并且满足我的要求。
SELECT * WHERE {
BIND ( URI("http:://www.foo.com/bar/01/grik/234") as ?s ) # (a) works fine
?s a ?o .
# Here (a) works as expected. I'm binding ?s to a specific URI
# for testing because otherwise it runs too long to debug my query logic.
}
LIMIT 10
PREFIX
次尝试失败我的实际前缀URI片段更长,但此示例说明了这一点。
我想将上述URI的第一部分 http:://www.foo.com/bar/
放在PREFIX
中,并使用 01/grik/234
作为后缀。
此变化不返回任何内容或URI组合出错:
PREFIX foo: <http:://www.foo.com/bar/>
SELECT * WHERE {
# I'm just running run one of these BIND statements
# at a time; listing all of them here for easier visual comparison.
# BIND ( URI(foo:01/grik/234) as ?s ) # (b) Lexical error. Encountered "/" after "grik"
# BIND ( URI(foo:"01/grik/234") as ?s ) # (c) Encountered " <STRING_LITERAL2> "\01/grik/234"\""
# BIND ( URI(foo:URI("01/grik/234")) as ?s ) # (d) Encountered "/" after "01"
# BIND ( URI(foo:ENCODE_FOR_URI("01/grik/234")) as ?s ) # (e) Encountered "/" after "01"
# BIND( URI(foo:ENCODE_FOR_URI("01/grik/234")) as ?s ) # (f) WARN URI <http:://www.foo.com/bar/ENCODE_FOR_URI> has no registered function factory
?s a ?o .
}
LIMIT 10
答案 0 :(得分:4)
您正在尝试以前缀名称形式使用IRI。 W3C SPARQL recommendation包含以下section
4.1.1.1前缀名称
PREFIX关键字将前缀标签与IRI关联。前缀名称是前缀标签和局部部分,以冒号分隔 “:”。通过连接IRI将前缀名称映射到IRI 与前缀和本地部分相关联。前缀标签或 本地部分可能为空。请注意,SPARQL本地名称允许前导 数字,而XML本地名称则没有。 SPARQL本地名称还允许 通过反斜杠字符在IRI中允许使用非字母数字字符 转义(例如
ns:id\=123
)。 SPARQL本地名称具有更多语法 限制超过CURIE。
鉴于/
是非字母数字字符,此处最重要的部分是
SPARQL本地名称还允许使用非字母数字字符 在IRI中通过反斜杠字符转义(例如
ns:id\=123
)。
长话短说,您的查询应该是
PREFIX foo: <http:://www.foo.com/bar/>
SELECT * WHERE {
BIND ( URI(foo:01\/grik\/234) as ?s )
?s a ?o .
}
LIMIT 10