使用带有斜杠的PREFIX和后缀使用SPARQL的URI()吗?

时间:2019-01-28 04:49:22

标签: uri sparql

我想使用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

1 个答案:

答案 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