【问题标题】:What is a valid URI in SPARQL?SPARQL 中的有效 URI 是什么?
【发布时间】:2021-04-28 22:41:45
【问题描述】:

SPARQL 和 Turtle 都将 IRIREF 定义为不包含无效字符之一的 <> 的产生式,有关详细信息,请参阅 RDF 3986。 URI 引用语法元素要么表示(绝对)URI,要么表示相对引用(如果它不能被解析为绝对 URI)。

这让我相信urn,: 是一个相对引用,因为它不是以有效方案开头的。但是,将其写入validator

SELECT ?a
WHERE {
  BIND(<urn,:> as ?a)
}

失败:

[line: 3, col: 8 ] Bad IRI: 'urn,:': Code: 0/ILLEGAL_CHARACTER in SCHEME: 该字符违反了 URI/IRI 的语法规则。

为什么?是按照规范还是我弄错了?

【问题讨论】:

    标签: uri sparql


    【解决方案1】:

    这里的验证器是正确的。问题是你有一个':'在你的相对路径的第一段的末尾。引用section 4.2 of RFC 3986:

    包含冒号字符的路径段(例如,“this:that”) 不能用作相对路径引用的第一段,因为 它会被误认为是方案名称。这样的段必须是 前面有一个点段(例如,“./this:that”)以构成一个相对- 路径参考。

    在 ABNF 中,这是通过以下事实来表达的:对于相对路径,存在以下产生式:

          relative-part = "//" authority path-abempty
                        / path-absolute
                        / path-noscheme
                        / path-empty
    

    由于您的 URI 不以“/”开头且不为空,因此只有 path-noscheme 可能匹配:

    path-noscheme = segment-nz-nc *( "/" segment )
    

    segment-nz-nc 规则明确用于排除在路径的第一个元素中使用冒号:

      segment-nz-nc = 1*( unreserved / pct-encoded / sub-delims / "@" )
                     ; non-zero-length segment without any colon ":"
    

    【讨论】:

    • 这就解释了为什么唯一有效的字符而不是,/?#,因为它们以segment-nz-nc 结尾。我假设“this:that”仅表示在方案中有效的字母或其他字符,但似乎 ABNF 将其排除在外。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-05
    • 1970-01-01
    • 1970-01-01
    • 2015-04-13
    • 2018-02-16
    • 2015-07-15
    • 2011-05-03
    相关资源
    最近更新 更多