本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
使用 SPARQL 的 Neptune 最佳实践
当您将 SPARQL 查询语言与 Neptune 一起使用时,请遵循以下最佳实践。有关在 Neptune 中使用 SPARQL 的信息,请参阅使用 SPARQL 访问 Neptune 图形。
默认查询所有命名图形
Amazon Neptune 将每个三元组与一个命名图形相关联。默认图形定义为所有命名图形的并集。
如果提交 SPARQL 查询而未通过 GRAPH
关键字或 FROM NAMED
之类的构造明确指定图形,Neptune 将始终考虑数据库实例中的所有三元组。例如,以下查询从 Neptune SPARQL 端点返回所有三元组:
SELECT * WHERE { ?s ?p ?o }
显示在多个图形中的三元组将仅返回一次。
有关默认图形规范的信息,请参阅 SPARQL 1.1 查询语言规范的 RDF 数据集
为加载指定命名图形
Amazon Neptune 将每个三元组与一个命名图形相关联。如果加载、插入或更新三元组时未指定命名图形,Neptune 使用 URI http://aws.amazon.com/neptune/vocab/v01/DefaultNamedGraph
定义的回退命名图形。
如果您使用的是 Neptune 批量加载程序,则可以使用 parserConfiguration: namedGraphUri
参数指定要用于所有三元组(或第四个位置空白的四元组)的命名图形。有关 Neptune 加载程序 Load
命令语法的信息,请参阅Neptune 加载程序命令。
在查询的 FILTER、FILTER...IN 和 VALUES 之间进行选择
有三种方法在 SPARQL 查询中注入值:FILTER
、FILTER...IN
和 VALUES
。
例如,假设您要在单个查询内查找多个人员的好友。您可以使用 FILTER
构建查询,如下所示:
PREFIX ex: <https://www.example.com/> PREFIX foaf : <http://xmlns.com/foaf/0.1/> SELECT ?s ?o WHERE {?s foaf:knows ?o. FILTER (?s = ex:person1 || ?s = ex:person2)}
这将返回图形中 ?s
绑定到 ex:person1
或 ex:person2
并且传出边缘标记为 foaf:knows
的所有三元组。
您也可以创建一个使用 FILTER...IN
的查询,该查询返回等同的结果:
PREFIX ex: <https://www.example.com/> PREFIX foaf : <http://xmlns.com/foaf/0.1/> SELECT ?s ?o WHERE {?s foaf:knows ?o. FILTER (?s IN (ex:person1, ex:person2))}
您也可以使用 VALUES
创建查询,在此例中也会返回等同结果:
PREFIX ex: <https://www.example.com/> PREFIX foaf : <http://xmlns.com/foaf/0.1/> SELECT ?s ?o WHERE {?s foaf:knows ?o. VALUES ?s {ex:person1 ex:person2}}
尽管在许多情况下,这些查询在语义上是等效的,但在某些情况下,两个 FILTER
变体不同于 VALUES
变体:
-
第一种情况是在您注入重复值时,例如将同一个人注入两次。在这种情况下,
VALUES
查询会在结果中包含重复项。您可通过将DISTINCT
添加到SELECT
子句来显式消除此类重复。但是,在某些情况下,您可能希望在查询结果中包含重复项用于冗余值注入。而
FILTER
和FILTER...IN
在相同值多次显示时仅提取该值一次。 -
第二种情况涉及
VALUES
始终执行完全匹配,而FILTER
在某些情况下可能会应用类型提升并执行模糊匹配。例如,当您在 values 子句中包含类似于
"2.0"^^xsd:float
的文本时,VALUES
查询与此文本完全匹配,包括文本值和数据类型。相比之下,
FILTER
会为这些数字文本生成模糊匹配。该匹配会包括值相同但数字数据类型(例如xsd:double
)不同的文本。注意
枚举字符串文本或 URI 时,
FILTER
与VALUES
的行为没有区别。
FILTER
与 VALUES
之间的区别会影响优化以及所造成的查询计算策略。除非您的用例需要模糊匹配,否则我们建议您使用 VALUES
,因为它会避免查找与类型转换相关的特殊情况。因此,VALUES
通常会生成更高效的查询,运行速度更快,而且成本更低。