本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
SPARQL亚马逊 Neptune 中的标准合规性
在列出适用SPARQL标准之后,以下各节提供了有关Neptune的SPARQL实施如何扩展或偏离这些标准的具体细节。
主题
Amazon Neptune 在实现SPARQL图形查询语言时符合以下标准。
适用标准 SPARQL
SPARQL由 2013 年 3 月 21 日的 W3C SPARQL1.1 查询语言
建议定义。 SPARQL更新协议和查询语言由 W3C SPARQL1.1 更新
规范定义。 对于数字格式,请SPARQL遵循 W3C XML 架构定义语言 (XSD) 1.1 第 2 部分:数据类型
规范,该规范与 754 规范 (IEEEIEEE754-2019 -浮点算术标准) 一致。IEEE 欲了解更多信息,另请参见维基百科 IEEE 754页面 )。但是, IEEE 754-1985
版本之后引入的功能不包括在该规范中。
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 将始终考虑数据库实例中的所有三元组。例如,以下查询返回来自 Nept SPARQL une 端点的所有三元组:
SELECT * WHERE { ?s ?p ?o }
显示在多个图形中的三元组将仅返回一次。
有关默认图形规范的信息,请参阅 SPARQL 1.1 查询语言规范的 “RDF数据集
为加载、插入或更新指定命名图形
如果您在加载、插入或更新三元组时未指定命名图形,Neptune 将使用由定义的备用命名图形。URI http://aws.amazon.com/neptune/vocab/v01/DefaultNamedGraph
使用基于三元组的格式发出 Neptune Load
请求时,可使用 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 的默认命名图形。
SPARQLXPathNeptune 支持的构造函数
该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
查询和更新的默认基础 IRI
由于 Neptune 集群有多个不同的终端节点,因此使用查询或更新请求URL作为基础IRI可能会在解析相对值时导致意想不到的结果。IRIs
从引擎版本 1.2.1.0 开始,IRI如果请求中没有明确的基础,Neptun IRI e 将使用http://aws.amazon.com/neptune/default/
作为基础。
在以下请求中,基础IRI是请求的一部分:
BASE <http://example.org/default/> INSERT DATA { <node1> <id> "n1" } BASE <http://example.org/default/> SELECT * { <node1> ?p ?o }
结果将是:
?p ?o http://example.org/default/id n1
但是,在此请求中,IRI不包括基础:
INSERT DATA { <node1> <id> "n1" } SELECT * { <node1> ?p ?o }
在这种情况下,结果将是:
?p ?o http://aws.amazon.com/neptune/default/id n1
xsd:Neptune 中的dateTime 值
出于性能考虑,Neptune 始终将日期/时间值存储为协调世界时 ()。UTC这可让直接比较非常有效。
这也意味着,如果您输入指定特定时区的dateTime
值,Neptune 会将该值转换为UTC并丢弃该时区信息。然后,当你稍后检索该dateTime
值时,它是用原始时区的时间表示的UTC,而不是用原始时区的时间来表示,而且你无法再分辨出那个原始时区是什么样子。
Neptune 的特殊浮点值处理
Neptune 按如下方式处理中的特殊浮点值。SPARQL
SPARQL在 Neptune 中处理 NaN
在 Neptune 中,SPARQL可以在查询NaN
中接受的值。信号和安静 NaN
值之间没有区别。Neptune 将所有 NaN
值都视为安静值。
从语义上讲,无法进行 NaN
比较,因为没有什么大于、小于或等于 NaN
。这意味着比较一侧的 NaN
值理论上永远不会匹配另一侧的任何 内容。
但是,该XSD规范xsd:double
或xsd:float
NaN
值视为相等。对于 IN
筛选条件、筛选表达式中的等于运算符以及完全匹配语义(在三元模式的对象位置具有 NaN
),Neptune 遵循此规则。
SPARQLNeptune 中的无限值处理
在 Neptune 中,SPARQL可以在查询-INF
中接受INF
或的值。 INF
比较为大于任何其他数值,-INF
比较时小于任何其他数值。
两个带有匹配符号的INF值在比较时彼此相等,无论其类型如何(例如,浮点数-INF
比较等于双精度-INF
)。
当然,无法进行 NaN
比较,因为没有什么内容大于、小于或等于 NaN
。
SPARQLNeptune 中的负零处理
Neptune 将负零值标准化为无符号零。您可以在查询中使用负零值,但它们不会原样记录在数据库中,并且在比较时与无符号零相等。
Neptune 的任意长度值限制
Neptune 将XSD整数、浮点和十进制值的存储大小限制在 64 位SPARQL以内。使用较大的值会导致 InvalidNumericDataException
错误。
Neptune 扩展了 Equals 比较功能 SPARQL
该SPARQL标准为值表达式定义了三元逻辑,其中值表达式的计算结果可以为true
false
、或。error
术语相等(在 SPARQL1.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 中处理 Out-of-Range文字 SPARQL
XSD语义定义每种数值类型及其值空间,但integer
和decimal
除外。这些定义将每种类型限制为一个值范围。例如,xsd:byte
范围是从 -128 到 +127(含)。超出此范围的任何值都被视为无效。
如果您尝试在类型的值空间之外分配文字值(例如,如果您尝试将的文字值设置为 999),Neptune 会按原样接受该 out-of-range值,而不对其进行四舍五入或xsd:byte
截断。但它不会将该值保留为数字值,因为给定的类型无法表示数字值。
也就是说,即使 "999"^^xsd:byte
是一个超出定义的 xsd:byte
值范围的值,Neptune 也可以接受它。但是,在数据库中保留该值后,它只能在三元模式的宾语位置用于完全匹配语义。无法对其执行范围过滤器,因为 out-of-range字面值不被视为数值。
SPARQL1.1 规范以-operator-、numeric
-operator- numeric
、string
-operator- string
等形式定义范围literal
literal
Neptune 无法执行诸如 invalid-literal
-operator-numeric-value
之类的范围比较运算符。