使用 SPARQL 的 Neptune 最佳实践 - Amazon Neptune
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用 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 查询中注入值:FILTERFILTER...INVALUES

例如,假设您要在单个查询内查找多个人员的好友。您可以使用 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:person1ex: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 子句来显式消除此类重复。但是,在某些情况下,您可能希望在查询结果中包含重复项用于冗余值注入。

    FILTERFILTER...IN 在相同值多次显示时仅提取该值一次。

  • 第二种情况涉及 VALUES 始终执行完全匹配,而 FILTER 在某些情况下可能会应用类型提升并执行模糊匹配。

    例如,当您在 values 子句中包含类似于 "2.0"^^xsd:float 的文本时,VALUES 查询与此文本完全匹配,包括文本值和数据类型。

    相比之下,FILTER 会为这些数字文本生成模糊匹配。该匹配会包括值相同但数字数据类型(例如 xsd:double)不同的文本。

    注意

    枚举字符串文本或 URI 时,FILTERVALUES 的行为没有区别。

FILTERVALUES 之间的区别会影响优化以及所造成的查询计算策略。除非您的用例需要模糊匹配,否则我们建议您使用 VALUES,因为它会避免查找与类型转换相关的特殊情况。因此,VALUES 通常会生成更高效的查询,运行速度更快,而且成本更低。