View a markdown version of this page

使用 Gremlin 存取 Amazon Neptune 中的圖形資料 - Amazon Neptune

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

使用 Gremlin 存取 Amazon Neptune 中的圖形資料

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

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

注意

此範例假設您已完成下列各項:

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

    cd apache-tinkerpop-gremlin-console-3.7.2
  2. 輸入下列命令以執行 Gremlin 主控台。

    bin/gremlin.sh

    您應該會看到下列輸出:

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

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

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

    :remote connect tinkerpop.server conf/neptune-remote.yaml
  4. 在 gremlin> 提示下,輸入以下內容以切換為遠端模式。這會傳送所有 Gremlin 查詢到遠端連線。

    :remote console
  5. 新增頂點以及標籤和屬性。

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

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

  6. 新增頂點與自訂 ID。

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

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

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

  7. 如果屬性不存在,請變更屬性或新增屬性。

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

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

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

  8. 新增屬性,但如果屬性已有值則附加屬性。

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

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

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

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

  9. 新增多個頂點。

    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。

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

  10. 新增邊緣。

    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)

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

  11. 新增其他現代圖形。

    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)
  12. 刪除頂點。

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

    移除具有 name 屬性的頂點等於 justin。

    重要

    停在此處,您擁有完整的 Apache TinkerPop 現代圖形。TinkerPop 文件的周遊一節中的範例使用現代圖形。

  13. 執行周遊。

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

    傳回所有 person 頂點。

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

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

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

  15. 指定多個標籤。

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

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

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

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

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

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

  16. 指定時間/日期。

    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

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

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

    以下是數個 drop 範例。

    注意

    .next() 步驟不適用於 .drop()。請改用 .iterate()。

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

    :exit
注意

使用分號 (;) 或換行符號字元 (\n) 來分隔每個陳述式。

最終周遊之前的每個周遊節尾必須為 iterate(),才能執行。但只有最後的周遊資料會傳回。