本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
Amazon Neptune 中的 SPARQL 标准合规性
Amazon Neptune 在实施 SPARQL 图形查询语言时,符合以下标准。
SPARQL 的适用标准
SPARQL 根据 2013 年 3 月 21 日发布的 W3C SPARQL 1.1 查询语言
建议定义。 SPARQL 更新协议和查询语言由 W3C SPARQL 1.1 更新
规范定义。 对于数字格式,SPARQL 遵循W3C XML 架构定义语言 (XSD) 1.1 第 2 部分:数据类型
规范,与 IEEE 754 规范一致(IEEE 754-2019-IEEE 浮点算法标准 . 有关更多信息,请参阅维基百科 IEEE 754 页 )。但是, IEEE 754-1985
版本之后引入的功能不包括在该规范中。
Neptune SPARQL 实施细节
以下各节提供了如何在 Neptune 中实施 SPARQL 的具体详细信息。
主题
Neptune SPARQL 中的默认命名空间前缀
默认情况下定义了 Neptune 下前缀以用于 SPARQL 查询。有关更多信息,请参阅 SPARQL 规范中的前缀名称
rdf
–http://www.w3.org/1999/02/22-rdf-syntax-ns#
rdfs
–http://www.w3.org/2000/01/rdf-schema#
owl
–http://www.w3.org/2002/07/owl#
xsd
–http://www.w3.org/2001/XMLSchema#
SPARQL 默认图形和命名图形
将每个三 Amazon Neptune 组与命名图形相关联。默认图形定义为所有命名图形的并集。
查询的默认图形
如果提交 SPARQL 查询而未通过 GRAPH
关键字或 FROM NAMED
之类的构造明确指定图形,Neptune 将始终考虑数据库实例中的所有三元组。例如,以下查询从 Neptune SPARQL 终端节点返回所有三元组:
SELECT * WHERE { ?s ?p ?o }
显示在多个图形中的三元组将仅返回一次。
有关默认图形规范的信息,请参阅 SPARQL 1.1 查询语言规范的 RDF 数据集
为加载、插入或更新指定命名图形
如果加载、插入或更新三元组时未指定命名图形,Neptune 用 URI 定义的回退命名图形。http://aws.amazon.com/neptune/vocab/v01/DefaultNamedGraph
.
当你发行 NeptuneLoad
使用基于三元组的格式的请求时,可使用parserConfiguration:
namedGraphUri
参数。有关 Load
命令语法的信息,请参阅Neptune 加载程序命令。
如果您不使用此参数,并且未指定命名图形,将使用回退 URI:http://aws.amazon.com/neptune/vocab/v01/DefaultNamedGraph
。
如果通过 SPARQL
UPDATE
加载三元组而未显式提供命名图形目标,也将使用此回退命名图形。
可使用基于四元组的 N-Quads 格式为数据库中的每个三元组指定一个命名图形。
您可以使用 N-Quads 将命名图形保留为空。在本例中,将使用 http://aws.amazon.com/neptune/vocab/v01/DefaultNamedGraph
。
使用 namedGraphUri
解析程序配置选项,可以覆盖 N-Quads 的默认命名图形。
Neptune 支持的 SPARQL XPath 构造函数
SPARQL 标准允许 SPARQL 引擎支持一组可扩展的 XPath 构造函数。Neptune 目前支持以下构造函数,其中xsd
前缀定义为http://www.w3.org/2001/XMLSchema#
:
xsd:boolean
xsd:integer
xsd:double
xsd:float
xsd:decimal
xsd:long
xsd:unsignedLong
XSD: Neptune 中的 DateTime 值
出于性能考虑,Neptune 始终将日期/时间值存储为协调世界时 (UTC) 形式。这可让直接比较非常有效。
这也意味着如果你输入dateTime
Neptune 将将该值转换为 UTC 形式并丢弃该时区信息。当您稍后检索该 dateTime
值时,它会以 UTC 形式表示,而不是原始时区的时间,并且您再也无法确定原始时区。
Neptune 处理特殊浮点值
Neptune 所示处理 SPARQL 中的特殊浮点值。
Neptune 中的 SPARQL NaN 处理
在 Neptune 中,SPARQL 可以接受NaN
在查询中。信号和安静之间没有区别NaN
有效值。Neptune 对待所有NaN
价值观一样安静。
从语义上讲,无法进行 NaN
比较,因为没有什么大于、小于或等于 NaN
。这意味着比较一侧的 NaN
值理论上永远不会匹配另一侧的任何 内容。
但是,XSD 规范xsd:double
要么xsd:float
NaN
值是相等的。Neptune 关注这个IN
filter,对于过滤器表达式中的相等运算符,以及精确匹配语义(具有NaN
在三重模式的对象位置)。
Neptune 中的 SPARQL 无限值处理
在 Neptune 中,SPARQL 可以接受INF
要么-INF
在查询中。INF
比较大于任何其他数值,并且-INF
比较小于任何其他数值。
不管值的类型如何,带匹配符号的两个 INF 值的比较结果是相等(例如,浮点 -INF
等于双精度 -INF
)。
当然,无法进行 NaN
比较,因为没有什么内容大于、小于或等于 NaN
。
Neptune 中的 SPARQL 负零处理
Neptune 将负零值标准化为无符号零。您可以在查询中使用负零值,但它们不会原样记录在数据库中,并且在比较时与无符号零相等。
Neptune 对任意长度值的限制
Neptune 将 SPARQL 中的 XSD 整数、浮点数和十进制值的存储大小限制为 64 位。因此,系统可能会任意截断较大的值,产生意想不到的结果。
Neptune 在 SPARQL 中扩展了等于比较
SPARQL 标准定义了值表达式的三元逻辑,其中值表达式可求值为 true
、false
或 error
。术语相等的默认语义,如中定义的SPARQL 1.1 规范=
和!=
在中比较FILTER
条件,生成error
比较中不明确可比的数据类型时运算符表
此行为可能会导致不直观的结果,如以下示例所示。
数据:
<http://example.com/Server/1> <http://example.com/ip> "127.0.0.1"^^<http://example.com/datatype/IPAddress>
查询 1:
SELECT * WHERE { <http://example.com/Server/1> <http://example.com/ip> ?o . FILTER(?o = "127.0.0.2"^^<http://example.com/datatype/IPAddress>) }
查询 2:
SELECT * WHERE { <http://example.com/Server/1> <http://example.com/ip> ?o . FILTER(?o != "127.0.0.2"^^<http://example.com/datatype/IPAddress>) }
使用 Neptune 在版本 1.0.2.1 之前使用的默认 SPARQL 语义,两个查询均返回空结果。原因是,?o =
"127.0.0.2"^^<http://example.com/IPAddress>
在为 ?o :=
"127.0.0.1"^^<http://example.com/IPAddress>
评估时生成 error
而不是 false
,因为没有为自定义数据类型 <http://example.com/IPAddress>
指定明确的比较规则。因此,第二个查询中的否定版本也会生成 error
。在这两个查询中,error
会导致筛选掉候选解决方案。
从版本 1.0.2.1 开始,Neptune 根据规范,扩展了 SPARQL 不等于运算符。请参阅 SPARQL 1.1 关于运算符可扩展性的部分
利用此选项,Neptune 现在对在运算符映射表中未明确定义的任意两种数据类型进行比较时,如果对在计算结果中,则视为:true
如果文字值和数据类型在语法上相等,否则为 false。在任何情况下都不会产生 error
。
使用这些新语义,第二个查询将返回 "127.0.0.1"^^<http://example.com/IPAddress>
而不是空的结果。
处理 Neptune SPARQL 中超出范围的文字
XSD 语义定义每个数字类型及其值空间(integer
和 decimal
除外)。这些定义将每种类型限制为一个值范围。例如,xsd:byte
范围是从 -128 到 +127(含)。超出此范围的任何值都被视为无效。
如果您尝试在类型的值空间之外分配文字值(例如,如果您尝试设置xsd:byte
字面值为 999),Neptune 接受out-of-range按原样值,不舍入或截断它。但它不会将该值保留为数字值,因为给定的类型无法表示数字值。
也就是说,Neptune 接受"999"^^xsd:byte
尽管它是一个超出定义的值xsd:byte
值范围。但是,在数据库中保留该值后,它只能在三元模式的宾语位置用于完全匹配语义。不能对其执行范围过滤器,因为out-of-range文字不会被视为数字值。
SPARQL 1.1 规范定义范围运算符numeric
-运算符numeric
、string
-运算符string
、literal
-运算符literal
,依此类推。Neptune 不能执行范围比较运算符invalid-literal
-运算符numeric-value
.