

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

# RDF 的池模型
<a name="pool-model-rdf"></a>

资源描述框架 (RDF) 具有命名图的概念，它提供了一种分隔数据的合乎逻辑的方法。在 Amazon Neptune 中，您有一个默认的命名图表和用户定义的命名图表。您可以根据需要创建任意数量的命名图表。它们统称为 RDF 数据集。所有命名的图形，无论是默认的还是用户定义的，都由 RDF 数据集中的国际化资源标识符 (IRI) 定义。在 Neptune 中，除非用户在写入数据时声明了命名图，否则所有[三元组](https://www.w3.org/TR/PR-rdf-syntax/#model)都被视为默认命名图的一部分。

命名图有多种用例：
+ 数据分区和数据隔离
+ 数据来源
+ 版本控制
+ 推理

本指南重点介绍数据分区用例。我们建议为每个租户创建一个用户定义的命名图。

## 使用 Graph Store HTTP 协议的 SPARQL 查询选项
<a name="sparql"></a>

以下示例查询使用 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 的租户隔离
<a name="isolation"></a>

要在应用程序层设置必要的防护栏的情况下对数据进行逻辑隔离，请在租户和用户定义的命名图形之间创建映射。[在为 RDF 数据集设计多租户时，请注意以下方面 RDF 和 SPARQL：](https://www.w3.org/TR/sparql11-query/)
+ 在 Neptune 中，当你在不指定命名图的情况下进行查询时，它会检索数据库中所有命名图形中与模式匹配的所有三元组。
+ 在 RDF 中，不同命名图的节点之间的连接没有限制。例如，在上图中，中的节点`:G1`可以通过边缘连接到:`G2`中的节点。

例如，如果特定租户的最终用户向 API 提交查询，则 API 应在将查询提交到 Neptune 数据库之前验证以下要求：
+ 任何以单个租户为范围的查询都必须指定命名图。否则，您就有可能在租户之间泄露数据。
+ 更新或删除查询应始终指定命名图。
+ 边或关系两侧的节点应始终属于正确的命名图。

有关最佳实践的更多信息，请参阅 [Neptune 文档](https://docs.aws.amazon.com/neptune/latest/userguide/feature-sparql-compliance.html)。