本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
RDF 的池模型
资源描述框架 (RDF) 具有命名图的概念,它提供了一种分隔数据的合乎逻辑的方法。在 Amazon Neptune 中,您有一个默认的命名图表和用户定义的命名图表。您可以根据需要创建任意数量的命名图表。它们统称为 RDF 数据集。所有命名的图形,无论是默认的还是用户定义的,都由 RDF 数据集中的国际化资源标识符 (IRI) 定义。在 Neptune 中,除非用户在写入数据时声明了命名图,否则所有三元组
命名图有多种用例:
-
数据分区和数据隔离
-
数据来源
-
版本控制
-
推理
本指南重点介绍数据分区用例。我们建议为每个租户创建一个用户定义的命名图。
使用 Graph Store HTTP 协议的 SPARQL 查询选项
以下示例查询使用 SPARQL 协议和 RDF 查询语言 (SPARQL) 以及 Graph Store HTTP 协议为租户查询或创建命名图。
-
HTTP GET-要检索租户的特定图表,请执行以下操作:curl --request GET 'https://your-neptune-endpoint:port/sparql/gsp/?graph=http%3A//www.example.com/named/tenant1' -
HTTP PUTα 要使用请求中指定的有效负载创建或替换特定的命名图表,请执行以下操作:curl --request PUT -H "Content-Type: text/turtle" \ --data-raw "@prefix ex: http://example.com/ . ex:subject ex:predicate ex:object ." \ 'https://your-neptune-endpoint:port/sparql/gsp/?graph=http%3A//www.example.com/named/tenant1'在 RDF 中,物体是三元组。
-
HTTP POSTα 要创建一个新的命名图表(如果不存在),或者要与现有图表合并,请执行以下操作:curl --request POST -H "Content-Type: text/turtle" \ --data-raw "@prefix ex: http://example.com/ . ex:subject ex:predicate ex:object ." \ 'https://your-neptune-endpoint:port/sparql/gsp/?graph=http%3A//www.example.com/named/tenant1'
RDF 的租户隔离
要在应用程序层设置必要的防护栏的情况下对数据进行逻辑隔离,请在租户和用户定义的命名图形之间创建映射。在为 RDF 数据集设计多租户时,请注意以下方面 RDF 和 SPARQL:
-
在 Neptune 中,当你在不指定命名图的情况下进行查询时,它会检索数据库中所有命名图形中与模式匹配的所有三元组。
-
在 RDF 中,不同命名图的节点之间的连接没有限制。例如,在上图中,中的节点
:G1可以通过边缘连接到:G2中的节点。
例如,如果特定租户的最终用户向 API 提交查询,则 API 应在将查询提交到 Neptune 数据库之前验证以下要求:
-
任何以单个租户为范围的查询都必须指定命名图。否则,您就有可能在租户之间泄露数据。
-
更新或删除查询应始终指定命名图表。
-
边或关系两边的节点都应始终属于正确的命名图。
有关最佳实践的更多信息,请参阅 Neptune 文档。