前言:Gremlin語言是圖數據庫最主流的查詢語言,是Apache TinkerPop框架下規範的圖語言,相當於SQL之於關係型數據庫。爲了圖數據庫使用者更好的掌握Gremlin這門圖語言,我們對Gremlin Steps進行了分類與總結,接下來將會出一個Gremlin系列文章(分25期來完成這個計劃),每一期會針對一類Step進行語法講解與實例分析。
深入學習Gremlin 系列文章鏈接彙總:https://blog.csdn.net/javeme/article/details/82631834
第1期 Gremlin Steps:
V()
、E()
、id()
、label()
、properties()
、valueMap()
、values()
本系列文章的Gremlin示例均在HugeGraph圖數據庫上執行,環境搭建可參考準備Gremlin執行環境,本文示例均以其中的“TinkerPop關係圖”爲初始數據,如下圖所示:
圖基本概念
- 圖Graph:指關係圖。比如:同學及朋友關係圖、銀行轉賬圖等。
- 頂點Vertex:一般指實體。比如:人、賬戶等。
- 邊Edge:一般指關係。比如:朋友關係、轉賬動作等。
- 屬性Property:頂點或邊可以包含屬性,比如:人的姓名、人的年齡、轉賬的時間。
下面使用一個例子來進一步理解上面的概念。如下圖片展示了一個“軟件、人”之間的關係圖。
其中:
- 包括4個頂點:3個“人”頂點、一個“軟件HugeGraph”頂點。
- 包括5條邊:3條“創建created”邊、2條“認識knows”邊。
- 包括若干屬性:如“HugeGraph”頂點包括“名稱name”、“標籤tag”、“語言lang”等屬性,一個屬性由屬性名和屬性值組成,如“lang:java”。
此外:
- 頂點與邊有類別之分,如“HugeGraph”頂點的label是“software”、3個“人”頂點的label是“person”,在Gremlin裏面稱之爲“label”。
- 頂點與邊均由id來唯一標識,Gremlin裏頂點與邊必須包括id,一般圖數據庫的頂點id或邊id均由系統自動生成。
圖基本操作
對圖基本概念有了初步瞭解之後,我們接下來學習如何使用Gremlin去操作它。首先準備好一些數據,這裏以搭建環境文章中的“TinkerPop關係圖”爲例。下面將要學習的Gremlin Steps包括:
V()
、E()
、id()
、label()
、properties()
、valueMap()
、values()
-
Step
V()
:查詢頂點,一般作爲圖查詢的第1步,後面可以續接的語句種類繁多(後續會一一講解)。示例:
// 查詢圖中所有的頂點 // 注意:g 代表的是整個圖 // 一切查詢都是以圖開始 g.V()
// 根據id查詢頂點 g.V('4:Gremlin', '3:TinkerPop')
請嘗試執行語句
g.V('4:Gremlin').in('supports')
---- 查詢支持Gremlin語言的所有圖數據庫。 -
Step
E()
:查詢邊,一般作爲圖查詢的第1步,後面可以續接的語句種類繁多。示例:
// 查詢圖中所有的邊 g.E()
// 根據id查詢邊 g.E('S3:TinkerPop>4>>S4:Gremlin')
-
Step
id()
:獲取頂點、邊的id。示例:
// 查詢所有頂點的id g.V().id()
類似的,通過
g.E().id()
查詢所有邊的id。注意:Gremlin Step是作用在上一步產生的結果集上,如果上一步的結果是多個元素,那麼這裏
id()
將返回多個元素的id。 -
Step
label()
:獲取頂點、邊的label。示例:
// 查詢所有頂點的label g.V().label()
類似的,通過
g.E().label()
查詢所有邊的label。 -
Step
properties()
:獲取頂點、邊的屬性。示例:
// 查詢所有頂點的屬性 g.V().properties()
// 查詢所有頂點的“lang”屬性 // 如果無“lang”屬性的頂點將跳過 g.V().properties('lang')
類似的,通過
g.E().properties()
查詢所有邊的屬性。
此外
properties()
還可以和key()
、value()
搭配使用,以獲取屬性的名稱或值。示例
key()
:// 查詢所有頂點的屬性名稱 g.V().properties().key()
示例
value()
:// 查詢所有頂點的屬性值 g.V().properties().value()
-
Step
valueMap()
:獲取頂點、邊的屬性,valueMap()
與properties()
不同的地方是:它們返回的結構不一樣,後者將所有的屬性扁平化到一個大列表裏面,一個元素代表一個屬性;前者保持一個頂點或一條邊的屬性作爲一組,每一組由若干屬性的鍵值對組成。示例:
// 查詢所有頂點的屬性 g.V().valueMap()
類似的,通過
g.E().valueMap()
查詢所有邊的屬性。 -
Step
values()
:獲取頂點、邊的屬性值。示例:
// 查詢所有頂點的屬性值 // 效果等同於: // g.V().properties().value() g.V().values()
// 查詢所有頂點的“lang”屬性 // 效果等同於: // g.V().properties('lang').value() g.V().values('lang')
類似的,通過
g.E().values()
查詢所有邊的屬性值。