SPARQL 中的有效 URI 是什么?

What is a valid URI in SPARQL?

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: The character violates the grammar rules for URIs/IRIs.

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

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

A path segment that contains a colon character (e.g., "this:that") cannot be used as the first segment of a relative-path reference, as it would be mistaken for a scheme name. Such a segment must be preceded by a dot-segment (e.g., "./this:that") to make a relative- path reference.

在 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 ":"