使用SPARQL的URI()fn w/包含斜杠的前缀和后缀?

使用SPARQL的URI()fn w/包含斜杠的前缀和后缀?,uri,sparql,Uri,Sparql,我想使用前缀来简化URI的创建。如果有任何建议可以帮助我建立一个关于前缀在SPARQL查询中的作用的心智模型,我将表示欢迎——它似乎不是一个简单的键/值替换 下面是一些已经尝试过的例子 工作 这就像预期的那样工作,并且实现了我想要的,除了不使用前缀 我失败的前缀尝试 我的实际前缀URI片段更长,但这个例子说明了这一点 我想把上面URI的第一部分http://www.foo.com/bar/放在前缀中,并使用01/grik/234作为后缀 此版本的变体在URI组合中不返回任何内容或错误: PREF

我想使用前缀来简化URI的创建。如果有任何建议可以帮助我建立一个关于前缀在SPARQL查询中的作用的心智模型,我将表示欢迎——它似乎不是一个简单的键/值替换

下面是一些已经尝试过的例子

工作 这就像预期的那样工作,并且实现了我想要的,除了不使用前缀

我失败的前缀尝试 我的实际前缀URI片段更长,但这个例子说明了这一点

我想把上面URI的第一部分http://www.foo.com/bar/放在前缀中,并使用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

您正在尝试在其前缀名称形式中使用IRI。包含以下内容

4.1.1.1前缀名称

PREFIX关键字将前缀标签与IRI关联。前缀名称是前缀标签和局部部分,由冒号分隔 :。前缀名称通过连接IRI映射到IRI 与前缀和本地部分关联。前缀标签或 本地部分可能为空。请注意,SPARQL本地名称允许前导 数字,而XML本地名称则不是。SPARQL本地名称还允许 通过反斜杠字符在IRIs中允许使用非字母数字字符 转义,例如ns:id\=123。SPARQL本地名称具有更多语法特性 比居里夫妇更受限制

考虑到/是非字母数字字符,这里最重要的部分是

SPARQL本地名称还允许使用非字母数字字符 在虹膜中,通过反斜杠字符转义,例如ns:id\=123

长话短说,你的问题应该是

前缀foo: 选择*其中{ 将URIfoo:01\/grik\/234绑定为?s 是的。 } 限制10
您正在尝试在其前缀名称形式中使用IRI。包含以下内容

4.1.1.1前缀名称

PREFIX关键字将前缀标签与IRI关联。前缀名称是前缀标签和局部部分,由冒号分隔 :。前缀名称通过连接IRI映射到IRI 与前缀和本地部分关联。前缀标签或 本地部分可能为空。请注意,SPARQL本地名称允许前导 数字,而XML本地名称则不是。SPARQL本地名称还允许 通过反斜杠字符在IRIs中允许使用非字母数字字符 转义,例如ns:id\=123。SPARQL本地名称具有更多语法特性 比居里夫妇更受限制

考虑到/是非字母数字字符,这里最重要的部分是

SPARQL本地名称还允许使用非字母数字字符 在虹膜中,通过反斜杠字符转义,例如ns:id\=123

长话短说,你的问题应该是

前缀foo: 选择*其中{ 将URIfoo:01\/grik\/234绑定为?s 是的。 } 限制10
必须使用转义序列char \:BIND URIfoo:01\/grik\/234转义前缀URI的名称部分中的非字母数字字符,因为在查询本身中确实需要这样做吗?如果您只需要构造一个URI来替换查询,那么许多库都有参数化的查询支持,或者只需要使用您选择的语言字符串连接/替换功能真正需要的是什么?否:-但我的愿望来自于在Jena web界面中手工制作查询。我想要一个简短的代码片段,我可以在windows和程序输出之间复制/粘贴。完整的URI是80个字符,我只是觉得处理起来很笨拙。我很高兴我使用了前缀线程,因为在AKSW的帮助下,我现在更了解SPARQL了。Fwiw,我选择的语言是python,因此,我正在使用rdflib-欢迎您提供任何建议,以利用我正在查看的准备好的语句。您必须使用转义序列char \:BIND URIfoo:01\/grik\/234对前缀URI的名称部分中的非字母数字字符进行转义,因为?s您真的需要在查询本身中这样做吗?如果您只需要构造一个URI来替换查询,那么许多库都有参数化的查询支持,或者只需要使用您选择的语言字符串连接/替换功能真正需要的是什么?否:-但我的愿望来自于在Jena web界面中手工制作查询。我想要一个简短的代码片段,我可以在windows和程序输出之间复制/粘贴。完整的URI是80个字符,我只是觉得处理起来很笨拙。我很高兴我使用了前缀线程,因为在AKSW的帮助下,我现在更了解SPARQL了。Fwiw,我选择的语言是python,所以我使用的是rdflib-欢迎您提供任何建议,以便我在这里查看准备好的语句。
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