本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
使用 Gremlin 存取 Amazon Neptune 中的圖形資料
您可以使用 Gremlin 主控台來實驗 REPL(read-eval-print 迴圈) 環境中的 TinkerPop 圖形和查詢。
以下教學會逐步解說如何使用 Gremlin 主控台在 Neptune 圖形中新增頂點、邊緣、屬性及更多,反白 Neptune 特定 Gremlin 實作中的一些差異。
注意
此範例假設您已完成下列各項:
您已使用 SSH連線至 Amazon EC2執行個體。
您已建立 Neptune 叢集,如 建立 Neptune 叢集 中所詳述。
您已如安裝 Gremlin 主控台所述安裝 Gremlin 主控台。
使用 Gremlin 主控台
-
將目錄變更為 Gremlin 主控台檔案解壓縮的資料夾。
cd apache-tinkerpop-gremlin-console-3.7.2
-
輸入下列命令以執行 Gremlin 主控台。
bin/gremlin.sh
您應該會看到下列輸出:
\,,,/ (o o) -----oOOo-(3)-oOOo----- plugin activated: tinkerpop.server plugin activated: tinkerpop.utilities plugin activated: tinkerpop.tinkergraph gremlin>
您現在進入
gremlin>
提示。您會在這個提示下進入其餘的步驟。 -
在
gremlin>
提示下,輸入以下命令以連線到 Neptune 資料庫執行個體。:remote connect tinkerpop.server conf/neptune-remote.yaml
-
在
gremlin>
提示下,輸入以下內容以切換為遠端模式。這會傳送所有 Gremlin 查詢到遠端連線。:remote console
-
新增頂點以及標籤和屬性。
g.addV('person').property('name', 'justin')
頂點會獲指派包含 的
string
IDGUID。所有頂點IDs都是 Neptune 中的字串。 -
新增頂點與自訂 ID。
g.addV('person').property(id, '1').property('name', 'martin')
id
屬性不使用括號括住。這是頂點 ID 的關鍵字。此處的頂點 ID 是一個字串,其中有數字1
。正常屬性名稱必須包含在引號中。
-
如果屬性不存在,請變更屬性或新增屬性。
g.V('1').property(single, 'name', 'marko')
您在這裡變更前一個步驟頂點的
name
屬性。這會移除name
屬性所有現有的值。如果您未指定
single
,則會改為附加值到name
屬性 (如果尚未這樣做)。 -
新增屬性,但如果屬性已有值則附加屬性。
g.V('1').property('age', 29)
Neptune 使用成組基數做為預設動作。
此命令會新增
age
屬性以及值29
,但不會取代任何現有的值。如果
age
屬性已有值,這個命令會附加29
到屬性。例如,如果age
屬性原本是27
,新的值會是[ 27, 29 ]
。 -
新增多個頂點。
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
。一起傳送的所有陳述式會包含在單一交易中,一起成功或一起失敗。
-
新增邊緣。
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)
以下是新增邊緣的兩個不同方式。
-
新增其他現代圖形。
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)
-
刪除頂點。
g.V().has('name', 'justin').drop()
移除具有
name
屬性的頂點等於justin
。重要
停在這裡,您有完整的 Apache TinkerPop Modern 圖形。 TinkerPop 文件的周遊區段
中的範例使用現代圖表。 -
執行周遊。
g.V().hasLabel('person')
傳回所有
person
頂點。 -
使用值 (valueMap()) 執行周遊。
g.V().has('name', 'marko').out('knows').valueMap()
傳回
marko
「知道」的所有頂點的索引鍵值組。 -
指定多個標籤。
g.addV("Label1::Label2::Label3")
Neptune 支援頂點的多個標籤。當您建立標籤時,您可以指定多重標籤並用
::
分隔。此範例新增有三種不同標籤的頂點。
hasLabel
步驟將比對此頂點和這三個標籤:hasLabel("Label1")
、hasLabel("Label2")
和hasLabel("Label3")
。::
分隔符號僅針對本用途保留。您不能在
hasLabel
步驟中指定多重標籤。例如,hasLabel("Label1::Label2")
不符合任何內容。 -
指定時間/日期。
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
-
刪除頂點、屬性或邊緣。
g.V().hasLabel('person').properties('age').drop().iterate() g.V('1').drop().iterate() g.V().outE().hasLabel('created').drop()
以下是數個 drop 範例。
注意
.next()
步驟不適用於.drop()
。請改用.iterate()
。 -
完成後,輸入以下內容以退出 Gremlin 主控台。
:exit
注意
使用分號 (;
) 或換行符號字元 (\n
) 來分隔每個陳述式。
最終周遊之前的每個周遊節尾必須為 iterate()
,才能執行。但只有最後的周遊資料會傳回。