

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

# 在 Amazon Neptune 中存取圖形資料
<a name="get-started-access-graph"></a>

您可以在建立連線後與 Amazon Neptune 資料庫叢集互動。這包括載入資料、執行查詢，以及執行其他操作。大多數使用者會利用 `curl`或 `awscurl`命令列工具，有效地與 Neptune 資料庫叢集通訊。這些工具可讓您傳送請求、載入資料，並從圖形資料庫擷取結果，促進無縫資料管理和查詢功能。

## 設定 `curl` 以與 Neptune 端點通訊
<a name="get-started-access-graph-curl"></a>

如本文件中的許多範例所述，[curl](https://curl.haxx.se/) 命令列工具是可與 Neptune 端點通訊的便利選項。如需工具資訊，請參閱 [curl man 頁面](https://curl.haxx.se/docs/manpage.html)和 *[Everything curl](https://ec.haxx.se/)* 一書。

若要依我們的建議與 Neptune 在大部分區域的要求使用 HTTPS 連線，`curl` 需要存取適當的憑證。若要了解如何取得這些憑證，以及如何將它們正確格式化為 `curl` 可以使用的憑證授權機構 (CA) 憑證存放區，請參閱 `curl` 文件中的 [SSL 憑證驗證](https://curl.haxx.se/docs/sslcerts.html)。

然後，您可以使用 `CURL_CA_BUNDLE` 環境變數來指定此 CA 憑證存放區的位置。在 Windows 上，`curl` 會自動在名為 `curl-ca-bundle.crt` 的檔案中尋找它。它會先在和 `curl.exe` 相同的目錄中尋找，然後再尋找路徑的其他位置。如需詳細資訊，請參閱 [SSL Certificate Verification](https://curl.haxx.se/docs/sslcerts.html)。

只要 `curl` 可以找到適當的憑證，它處理 HTTPS 連線的方式就跟 HTTP 連線一樣，無需額外參數。此文件的範例是以該案例為基礎。

## 使用查詢語言存取 Neptune 資料庫叢集中的圖形資料
<a name="get-started-access-graph-query-langs"></a>

一旦連線，您可以使用 Gremlin 和 OpenCypher 查詢語言，來建立和查詢屬性圖，或者使用 SPARQL 查詢語言，來建立和查詢包含 RDF 資料的圖形。

**Neptune 支援的圖形查詢語言**
+ [Gremlin](access-graph-gremlin.md) 是一種適用於屬性圖的圖形周遊語言。Grimlin 中的查詢是由離散步驟組成的周遊，每個步驟都沿著一個邊緣到一個節點。如需詳細資訊，請參閱 [Apache TinkerPop](https://tinkerpop.apache.org/docs/current/reference/) 的 Gremlin 文件。

  Gremlin 的 Neptune 實作與其他實作有一些不同，尤其是使用 Gremlin-Groovy 時 (以序列化的文字傳送的 Gremlin 查詢)。如需詳細資訊，請參閱[Amazon Neptune 中的 Gremlin 標準合規](access-graph-gremlin-differences.md)。
+ [OpenCypher](access-graph-opencypher.md) 是屬性圖的宣告式查詢語言，最初由 Neo4j 開發，然後在 2015 年成為開放原始碼，並在 Apache 2 開放原始碼授權下投入 [OpenCypher](http://www.opencypher.org/) 專案。其語法記載於 [Cypher 查詢語言參考第 9 版](https://s3.amazonaws.com/artifacts.opencypher.org/openCypher9.pdf)。
+ [SPARQL](access-graph-sparql.md) 是 [RDF](https://www.w3.org/2001/sw/wiki/RDF) 資料的宣告式查詢語言，以全球資訊網協會 (W3C) 制定的標準圖形模式配對為基礎，於 [SPARQL 1.1 概觀](https://www.w3.org/TR/sparql11-overview/)和 [SPARQL 1.1 查詢語言](https://www.w3.org/TR/sparql11-query/)規格中描述。

**注意**  
您可以使用 Gremlin 和 OpenCypher，但不使用 SPARQL，來存取 Neptune 屬性圖資料。同樣地，您只能使用 SPARQL，而不是 Gremlin 或 openCypher 存取 RDF 資料。

# 使用 Gremlin 存取 Amazon Neptune 中的圖形資料
<a name="get-started-graph-gremlin"></a>

您可使用 Gremlin 主控台在 REPL (read-eval-print loop) 環境中試驗 TinkerPop 圖表和查詢。

以下教學會逐步解說如何使用 Gremlin 主控台在 Neptune 圖形中新增頂點、邊緣、屬性及更多，反白 Neptune 特定 Gremlin 實作中的一些差異。

**注意**  
此範例假設您已完成下列各項：  
您已使用 SSH 連線到 Amazon EC2 執行個體。
您已建立 Neptune 叢集，如 [建立 Neptune 叢集](get-started-create-cluster.md) 中所詳述。
您已如[安裝 Gremlin 主控台](access-graph-gremlin-console.md)所述安裝 Gremlin 主控台。

**使用 Gremlin 主控台**

1. 將目錄變更為 Gremlin 主控台檔案解壓縮的資料夾。

   ```
   cd apache-tinkerpop-gremlin-console-3.7.2
   ```

1. 輸入下列命令以執行 Gremlin 主控台。

   ```
   bin/gremlin.sh
   ```

   您應該會看到下列輸出：

   ```
            \,,,/
            (o o)
   -----oOOo-(3)-oOOo-----
   plugin activated: tinkerpop.server
   plugin activated: tinkerpop.utilities
   plugin activated: tinkerpop.tinkergraph
   gremlin>
   ```

   您現在進入 `gremlin>` 提示。您會在這個提示下進入其餘的步驟。

1. 在 `gremlin>` 提示下，輸入以下命令以連線到 Neptune 資料庫執行個體。

   ```
   :remote connect tinkerpop.server conf/neptune-remote.yaml
   ```

1. 在 `gremlin>` 提示下，輸入以下內容以切換為遠端模式。這會傳送所有 Gremlin 查詢到遠端連線。

   ```
   :remote console
   ```

1. **新增頂點以及標籤和屬性。**

   ```
   g.addV('person').property('name', 'justin')
   ```

   頂點會獲指派一個 `string` ID，包含 GUID。所有頂點 ID 都是 Neptune 中的字串。

1. **新增頂點與自訂 ID。**

   ```
   g.addV('person').property(id, '1').property('name', 'martin')
   ```

   `id` 屬性不使用括號括住。這是頂點 ID 的關鍵字。此處的頂點 ID 是一個字串，其中有數字 `1`。

   正常屬性名稱必須包含在引號中。

1. **如果屬性不存在，請變更屬性或新增屬性。**

   ```
   g.V('1').property(single, 'name', 'marko')
   ```

   您在這裡變更前一個步驟頂點的 `name` 屬性。這會移除 `name` 屬性所有現有的值。

   如果您未指定 `single`，則會改為附加值到 `name` 屬性 (如果尚未這樣做)。

1. **新增屬性，但如果屬性已有值則附加屬性。**

   ```
   g.V('1').property('age', 29)
   ```

   Neptune 使用成組基數做為預設動作。

   此命令會新增 `age` 屬性以及值 `29`，但不會取代任何現有的值。

   如果 `age` 屬性已有值，這個命令會附加 `29` 到屬性。例如，如果 `age` 屬性原本是 `27`，新的值會是 `[ 27, 29 ]`。

1. **新增多個頂點。**

   ```
   g.addV('person').property(id, '2').property('name', 'vadas').property('age', 27).iterate()
   g.addV('software').property(id, '3').property('name', 'lop').property('lang', 'java').iterate()
   g.addV('person').property(id, '4').property('name', 'josh').property('age', 32).iterate()
   g.addV('software').property(id, '5').property('name', 'ripple').property('lang', 'java').iterate()
   g.addV('person').property(id, '6').property('name', 'peter').property('age', 35)
   ```

   您可以同時將多個陳述式傳送至 Neptune。

   陳述式可以使用換行符號 (`'\n'`)、空格 (`' '`)、分號 (`'; '`) 來隔開，也可以不使用任何分隔符號 (例如：`g.addV(‘person’).iterate()g.V()` 為有效)。
**注意**  
Gremlin 主控台會在每個新行 (`'\n'`) 處傳送個別命令，所以在這種情況下每個都是單獨的交易。此範例將所有命令放在不同的行以方便閱讀。移除新行 (`'\n'`) 字元可透過 Gremlin 主控台將其做為單一命令傳送。

   最後一個陳述式除外的所有陳述式都必須結束在終止步驟，例如 `.next()` 或 `.iterate()`，否則不會執行。Gremlin 主控台不需要這些終止步驟。每當您不需要序列化結果時就使用 `.iterate`。

   一起傳送的所有陳述式會包含在單一交易中，一起成功或一起失敗。

1. **新增邊緣。**

   ```
   g.V('1').addE('knows').to(__.V('2')).property('weight', 0.5).iterate()
   g.addE('knows').from(__.V('1')).to(__.V('4')).property('weight', 1.0)
   ```

   以下是新增邊緣的兩個不同方式。

1. **新增其他現代圖形。**

   ```
   g.V('1').addE('created').to(__.V('3')).property('weight', 0.4).iterate()
   g.V('4').addE('created').to(__.V('5')).property('weight', 1.0).iterate()
   g.V('4').addE('knows').to(__.V('3')).property('weight', 0.4).iterate()
   g.V('6').addE('created').to(__.V('3')).property('weight', 0.2)
   ```

1. **刪除頂點。**

   ```
   g.V().has('name', 'justin').drop()
   ```

   移除具有 `name` 屬性的頂點等於 `justin`。
**重要**  
*停在此處，您擁有完整的 Apache TinkerPop 現代圖形。TinkerPop 文件的[周遊一節](https://tinkerpop.apache.org/docs/current/reference/#graph-traversal-steps)中的範例使用現代圖形。*

1. **執行周遊。**

   ```
   g.V().hasLabel('person')
   ```

   傳回所有 `person` 頂點。

1. **使用值 (valueMap ()) 執行周遊。**

   ```
   g.V().has('name', 'marko').out('knows').valueMap()
   ```

   傳回 `marko`「知道」的所有頂點的索引鍵值組。

1. **指定多個標籤。**

   ```
   g.addV("Label1::Label2::Label3") 
   ```

   Neptune 支援頂點的多個標籤。當您建立標籤時，您可以指定多重標籤並用 `::` 分隔。

   此範例新增有三種不同標籤的頂點。

   `hasLabel` 步驟將比對此頂點和這三個標籤：`hasLabel("Label1")`、`hasLabel("Label2")` 和 `hasLabel("Label3")`。

   `::` 分隔符號僅針對本用途保留。

   您不能在 `hasLabel` 步驟中指定多重標籤。例如，`hasLabel("Label1::Label2")` 不符合任何內容。

1. **指定時間/日期**。

   ```
   g.V().property(single, 'lastUpdate', datetime('2018-01-01T00:00:00'))
   ```

   Neptune 不支援 Java 日期。請改用 `datetime()` 函數。`datetime()` 接受 ISO8061 相容 `datetime` 字串。

   支援格式如下：`YYYY-MM-DD, YYYY-MM-DDTHH:mm`、`YYYY-MM-DDTHH:mm:SS` 和 `YYYY-MM-DDTHH:mm:SSZ`

1. **刪除頂點、屬性或邊緣。**

   ```
   g.V().hasLabel('person').properties('age').drop().iterate()
   g.V('1').drop().iterate()
   g.V().outE().hasLabel('created').drop()
   ```

   以下是數個 drop 範例。
**注意**  
 `.next()` 步驟不適用於 `.drop()`。請改用 `.iterate()`。

1. 完成後，輸入以下內容以退出 Gremlin 主控台。

   ```
   :exit
   ```

**注意**  
使用分號 (`;`) 或換行符號字元 (`\n`) 來分隔每個陳述式。  
最終周遊之前的每個周遊節尾必須為 `iterate()`，才能執行。但只有最後的周遊資料會傳回。

# 使用 openCypher 存取 Amazon Neptune 中的圖形資料
<a name="get-started-graph-opencypher"></a>

若要開始使用 OpenCypher，請參閱 [openCypher](access-graph-opencypher.md)，或使用 GitHub [Neptune 圖形筆記本存放庫](https://github.com/aws/graph-notebook/tree/main/src/graph_notebook/notebooks)中的 OpenCypher 筆記本。

# 使用 SPARQL 存取 Amazon Neptune 中的圖形資料
<a name="get-started-graph-sparql"></a>

SPARQL 是一種資源描述架構 (RDF) 的查詢語言，其是專為網路設計的圖形資料格式。Amazon Neptune 與 SPARQL 1.1 相容。這表示您可以連線到 Neptune 資料庫執行個體，並使用 [SPARQL 1.1 查詢語言](https://www.w3.org/TR/sparql11-query/)規格所述的查詢語言來查詢圖形。

 SPARQL 的查詢包含 `SELECT` 子句，用於指定要傳回的變數，和 `WHERE` 子句，用於指定要比對圖形中的哪些資料。如果您不熟悉 SPARQL 查詢，請參閱 [SPARQL 1.1 查詢語言](https://www.w3.org/TR/sparql11-query/#WritingSimpleQueries)中的[編寫簡易查詢](https://www.w3.org/TR/sparql11-query/)。

對 Neptune 資料庫執行個體進行 SPARQL 查詢時所用的 HTTP 端點為 `https://your-neptune-endpoint:port/sparql`。

**若要連接到 SPARQL**

1. 您可以從 CloudFormation 堆疊的**輸出**區段中的 **SparqlEndpoint** 項目取得 Neptune 叢集的 SPARQL 端點。

1. 輸入下列命令，以使用 HTTP `POST` 和 **curl** 命令提交 SPARQL **`UPDATE`**。

   ```
   curl -X POST --data-binary 'update=INSERT DATA { <https://test.com/s> <https://test.com/p> <https://test.com/o> . }' https://your-neptune-endpoint:port/sparql
   ```

   上述範例插入以下三元組到 SPARQL 預設圖形：`<https://test.com/s> <https://test.com/p> <https://test.com/o>`

1. 輸入下列命令，以使用 HTTP `POST` 和 **curl** 命令提交 SPARQL **`QUERY`**。

   ```
   curl -X POST --data-binary 'query=select ?s ?p ?o where {?s ?p ?o} limit 10' https://your-neptune-endpoint:port/sparql
   ```

   先前範例使用 `?s ?p ?o` 查詢和限制 10，以傳回圖形中的最多 10 個三元組 (subject-predicate-object)。若要查詢其他項目，請將查詢換成其他 SPARQL 查詢。
**注意**  
`SELECT` 和 `ASK` 查詢回應的預設 MIME 類型為 `application/sparql-results+json`。  
`CONSTRUCT` 和 `DESCRIBE` 查詢回應的預設 MIME 類型為 `application/n-quads`。  
如需所有可用 MIME 類型的清單，請參閱 [SPARQL HTTP API](sparql-api-reference.md)。