SPARQL 中的有效 URI 是什么?

问题描述

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: 该字符违反了 URIs/IRI 的语法规则。

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

解决方法

验证器在这里是正确的。问题是您在相对路径的第一段末尾有一个“:”。引用 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 ":"

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...