

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 建立自訂 IAM 政策陳述式以存取 Amazon Neptune 中的資料
<a name="iam-data-access-policies"></a>

Neptune 資料存取政策陳述式會使用[資料存取動作](iam-dp-actions.md)、[資源](iam-data-resources.md)和[條件金鑰](iam-data-condition-keys.md#iam-neptune-condition-keys)，它們前面全都會加上字首 `neptune-db:`。

**Topics**
+ [在 Neptune 資料存取政策陳述式中使用查詢動作](#iam-data-query-actions)
+ [Amazon Neptune 中資料存取的 IAM 動作](iam-dp-actions.md)
+ [用於存取 Amazon Neptune 中資料的 IAM 資源類型](iam-data-resources.md)
+ [用於存取 Amazon Neptune 中資料的 IAM 條件金鑰](iam-data-condition-keys.md)
+ [在 Amazon Neptune 中建立 IAM 資料存取政策](iam-data-access-examples.md)

## 在 Neptune 資料存取政策陳述式中使用查詢動作
<a name="iam-data-query-actions"></a>

有三個 Neptune 查詢動作可以用於資料存取政策陳述式，即 `ReadDataViaQuery`、`WriteDataViaQuery` 和 `DeleteDataViaQuery`。特定查詢可能需要許可才能執行其中多個動作，而且必須允許這些動作的哪個組合才能執行查詢，可能並不總是顯而易見。

在執行查詢之前，Neptune 會確定執行查詢每個步驟所需的許可，並將這些許可合併成查詢所需的完整許可集。請注意，這個完整許可集包括查詢可能**會執行的所有動作，這不一定是查詢在資料上執行時將實際執行的動作集。

這表示若要允許給定的查詢執行，您必須為查詢可能執行的每個動作提供許可，不論查詢是否實際執行這些動作。

以下是一些範例 Gremlin 查詢，其中更詳細地解釋了此情況：
+ 

  ```
  g.V().count()
  ```

  `g.V()` 和 `count()` 只需要讀取存取權，因此整體查詢只需要 `ReadDataViaQuery` 存取權。
+ 

  ```
  g.addV()
  ```

  `addV()` 需要在插入新頂點之前檢查具有給定 ID 的頂點是否存在。這表示它同時需要 `ReadDataViaQuery` 和 `WriteDataViaQuery` 存取權。
+ 

  ```
  g.V('1').as('a').out('created').addE('createdBy').to('a')
  ```

  `g.V('1').as('a')` 和 `out('created')` 只需要讀取存取權，但 `addE().from('a')` 同時需要讀取和寫入存取權，因為 `addE()` 需要讀取 `from` 和 `to` 頂點，並檢查具有相同 ID 的邊緣是否已經存在，然後再新增邊緣。因此，整體查詢同時需要 `ReadDataViaQuery` 和 `WriteDataViaQuery` 存取權。
+ 

  ```
  g.V().drop()
  ```

  `g.V()` 僅需要讀取存取權。`drop()` 同時需要讀取和刪除存取權，因為其需要在刪除頂點或邊緣之前讀取它，所以整體查詢同時需要 `ReadDataViaQuery` 和 `DeleteDataViaQuery` 存取權。
+ 

  ```
  g.V('1').property(single, 'key1', 'value1')
  ```

  `g.V('1')` 只需要讀取存取權，但 `property(single, 'key1', 'value1')` 需要讀取、寫入和刪除存取權。在這裡，`property()` 步驟會插入金鑰和值，如果它們不存在於頂點的 話，但如果它們確實已經存在，它會刪除現有的屬性值，並在其位置插入一個新值。因此，整個查詢需要 `ReadDataViaQuery`、`WriteDataViaQuery` 和 `DeleteDataViaQuery` 存取權。

  任何包含 `property()` 步驟的查詢都需要 `ReadDataViaQuery`、`WriteDataViaQuery` 和 `DeleteDataViaQuery` 許可。

以下是一些 openCypher 範例：
+ 

  ```
  MATCH (n)
  RETURN n
  ```

  此查詢讀取資料庫中的所有節點並傳回它們，這只需要 `ReadDataViaQuery` 存取權。
+ 

  ```
  MATCH (n:Person)
  SET n.dept = 'AWS'
  ```

  此查詢需要 `ReadDataViaQuery`、`WriteDataViaQuery` 和 `DeleteDataViaQuery` 存取權。它會讀取標籤為 'Person' 的所有節點，並將具有金鑰 `dept` 和值 `AWS` 的新屬性新增至其中，或者如果 `dept` 屬性已經存在，則其會刪除舊值並改為插入 `AWS`。此外，如果要設定的值為 `null`，則 `SET` 會完全刪除屬性。

   因為 `SET` 子句在某些情況下可能需要刪除現有值，所以它**始終**需要 `DeleteDataViaQuery` 許可以及 `ReadDataViaQuery` 和 `WriteDataViaQuery` 許可。
+ 

  ```
  MATCH (n:Person)
  DETACH DELETE n
  ```

  此查詢需要 `ReadDataViaQuery` 和 `DeleteDataViaQuery` 許可。它會找出所有具有標籤 `Person` 的節點，然後刪除它們以及連線至這些節點的邊緣和任何相關聯的標籤和屬性。
+ 

  ```
  MERGE (n:Person {name: 'John'})-[:knows]->(:Person {name: 'Peter'})
  RETURN n
  ```

  此查詢需要 `ReadDataViaQuery` 和 `WriteDataViaQuery` 許可。`MERGE` 子句會比對指定的模式或建立它。因為，如果模式不符，則可能會發生寫入，所以需要寫入許可以及讀取許可。