

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

# 使用 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()`，才能執行。但只有最後的周遊資料會傳回。