Gremlin:圖遍歷語言

原文作者:ITRoad
原文地址:原文鏈接
摘抄申明:我們不占有不侵權(quán)民轴,我們只是好文的搬運工!轉(zhuǎn)發(fā)請帶上原文申明。

Gremlin簡介

Gremlin是Apache TinkerPop 框架下的圖遍歷語言。Gremlin是一種函數(shù)式數(shù)據(jù)流語言须板,可以使得用戶使用簡潔的方式表述復(fù)雜的屬性圖(property graph)的遍歷或查詢。每個Gremlin遍歷由一系列步驟(可能存在嵌套)組成兢卵,每一步都在數(shù)據(jù)流(data stream)上執(zhí)行一個原子操作习瑰。

Gremlin包括三個基本的操作:

  • map-step
    對數(shù)據(jù)流中的對象進行轉(zhuǎn)換;
  • filter-step
    對數(shù)據(jù)流中的對象就行過濾秽荤;
  • sideEffect-step
    對數(shù)據(jù)流進行計算統(tǒng)計甜奄;

以下是Gremlin在一些場景中的具體應(yīng)用:

  • 1.查找Gremlin朋友的朋友
g.V().has("name","gremlin").
  out("knows").
  out("knows").
  values("name")
  • 2.查找那些由兩個朋友共同創(chuàng)建的項目
g.V().match(
  as("a").out("knows").as("b"),
  as("a").out("created").as("c"),
  as("b").out("created").as("c"),
  as("c").in("created").count().is(2)).
    select("c").by("name")
  • 3.給出Gremlin的所有上司柠横,直至CEO
g.V().has("name","gremlin").
  repeat(in("manages")).
    until(has("title","ceo")).
  path().by("name")
  • 4.獲得Gremlin合作者的頭銜分布
g.V().has("name","gremlin").as("a").
  out("created").in("created").
    where(neq("a")).
  groupCount().by("title")
  • 5.獲取Gremlin購買產(chǎn)品的相關(guān)產(chǎn)品列表并排序
g.V().has("name","gremlin").
  out("bought").aggregate("stash").
  in("bought").out("bought").
    where(not(within("stash"))).
  groupCount().order(local).by(values,decr)
  • 6.獲取排名前十的中心人物
g.V().hasLabel("person").
  pageRank().
    by("friendRank").
    by(outE("knows")).
  order().by("friendRank",decr).
  limit(10)

OLTP 和 OLAP遍歷

  • 一次編寫,到處運行
    Gremlin遵循“一次編寫课兄,到處運行”的設(shè)計哲學(xué)牍氛。這意味著不僅所有的TinkerPop啟用的圖形系統(tǒng)都能執(zhí)行Gremlin遍歷,而且每個Gremlin遍歷都可以被評估為實時數(shù)據(jù)庫查詢或批處理查詢烟阐。(前者被稱為在線交易流程(OLTP)搬俊,后者被稱為在線分析流程(OLAP))。

  • 協(xié)調(diào)多種圖遍歷
    這種普遍性是由Gremlin遍歷機實現(xiàn)的蜒茄。這種分布式唉擂、基于圖形的虛擬機了解如何協(xié)調(diào)多機器圖遍歷的執(zhí)行。好處是檀葛,用戶不需要學(xué)習數(shù)據(jù)庫查詢語言和域特定的BigData分析語言(例如Spark DSL玩祟,MapReduce等)。Gremlin是構(gòu)建基于圖的應(yīng)用程序所必要的屿聋,其余一切都交給Gremlin遍歷機處理空扎。

image

命令式和聲明式遍歷

Gremlin遍歷可以以命令式(程序式)方式,聲明性(描述性)方式編寫润讥,也可以包含命令性和聲明性的混合方式編寫转锈。

  • 命令式編寫方式
    獲得Gremlin合作者的上司名字分布:
g.V().has("name","gremlin").as("a").
  out("created").in("created").
    where(neq("a")).
  in("manages").
  groupCount().by("name")

一個命令式的Gremlin遍歷告訴運行器如何執(zhí)行遍歷中的每一步;然后楚殿,遍歷器分裂到所有的“Gremlin”的合作者(去除Gremlin自己)黑忱;下一步,遍歷器走到“Gremlin”合作者的上司(managers)勒魔,最終根據(jù)上司的名字進行統(tǒng)計分發(fā)。

之所以是命令式的Gremlin遍歷菇曲,就是它明確地冠绢、程序化地告訴遍歷器“去這里,然后去那里”常潮。

  • 聲明式編寫方式
    以下使用聲明式編寫方式實現(xiàn)了同樣的結(jié)果:
g.V().match(
  as("a").has("name","gremlin"),
  as("a").out("created").as("b"),
  as("b").in("created").as("c"),
  as("c").in("manages").as("d"),
    where("a",neq("c"))).
  select("d").
  groupCount().by("name")

聲明式的Gremlin遍歷并不能告訴遍歷器執(zhí)行它們的步驟的順序弟胀,而是允許每個遍歷器從一個(可能嵌套的)模式的集合中選擇一個模式來執(zhí)行。

然而喊式,聲明遍歷具有額外的好處孵户,它不僅利用了編譯時查詢計劃器(如命令式遍歷),而且還是一個運行時查詢計劃器岔留,根據(jù)每個模式的歷史統(tǒng)計信息選擇下一個執(zhí)行哪個遍歷模式 - 有利于那些傾向于減少/過濾大多數(shù)數(shù)據(jù)的模式夏哭。

用戶可以選擇上述提出的方式編寫自己的遍歷語句。不管怎樣献联,用戶的遍歷語句都會根據(jù)具體的執(zhí)行引擎和遍歷策略traversal strategies被重寫竖配。Gremlin為用戶提供靈活性表達自己的查詢的何址;圖系統(tǒng)也針對具體啟用TinkerPop的數(shù)據(jù)系統(tǒng)進行有效地評估圖遍歷提供了靈活性。

無縫嵌入主語言

  • 統(tǒng)一主開發(fā)語言和圖查詢語言
    經(jīng)典數(shù)據(jù)庫查詢語言(如SQL)被認為與最終在生產(chǎn)環(huán)境中使用的編程語言截然不同进胯。因此用爪,經(jīng)典數(shù)據(jù)庫要求開發(fā)人員既要編寫主編程語言,還要編寫數(shù)據(jù)庫相應(yīng)的查詢語言胁镐。Gremlin統(tǒng)一了這個劃分偎血,因為遍歷可以用支持功能組合和嵌套(主要編程語言都支持)的任何編程語言編寫。因此盯漂,用戶的Gremlin遍歷可以使用應(yīng)用程序語言(主語言颇玷,Host language)編寫,并受益于主語言及其工具(例如類型檢查宠能,語法高亮亚隙,點完成等)所提供的優(yōu)點。目前存在各種Gremlin語言變體违崇,包括:Gremlin-Java阿弃,Gremlin-Groovy,Gremlin-Python羞延,Gremlin-Scala等渣淳。

  • 示例程序
    比較以下兩種方式,高低立判:

public class GremlinTinkerPopExample {
  public void run(String name, String property) {

    Graph graph = GraphFactory.open(...);
    GraphTraversalSource g = graph.traversal();

    double avg = g.V().has("name",name).
                   out("knows").out("created").
                   values(property).mean().next();

    System.out.println("Average rating: " + avg);
  }
}
public class SqlJdbcExample {
  public void run(String name, String property) {

    Connection connection = DriverManager.getConnection(...)
    Statement statement = connection.createStatement();
    ResultSet result = statement.executeQuery(
      "SELECT AVG(pr." + property + ") as AVERAGE FROM PERSONS p1" +
        "INNER JOIN KNOWS k ON k.person1 = p1.id " +
        "INNER JOIN PERSONS p2 ON p2.id = k.person2 " +
        "INNER JOIN CREATED c ON c.person = p2.id " +
        "INNER JOIN PROJECTS pr ON pr.id = c.project " +
          "WHERE p.name = '" + name + "');

    System.out.println("Average rating: " + result.next().getDouble("AVERAGE")
  }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末伴箩,一起剝皮案震驚了整個濱河市入愧,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌嗤谚,老刑警劉巖棺蛛,帶你破解...
    沈念sama閱讀 222,865評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異巩步,居然都是意外死亡旁赊,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,296評論 3 399
  • 文/潘曉璐 我一進店門椅野,熙熙樓的掌柜王于貴愁眉苦臉地迎上來终畅,“玉大人,你說我怎么就攤上這事竟闪±敫#” “怎么了?”我有些...
    開封第一講書人閱讀 169,631評論 0 364
  • 文/不壞的土叔 我叫張陵炼蛤,是天一觀的道長妖爷。 經(jīng)常有香客問我,道長理朋,這世上最難降的妖魔是什么赠涮? 我笑而不...
    開封第一講書人閱讀 60,199評論 1 300
  • 正文 為了忘掉前任子寓,我火速辦了婚禮,結(jié)果婚禮上笋除,老公的妹妹穿的比我還像新娘斜友。我一直安慰自己,他們只是感情好垃它,可當我...
    茶點故事閱讀 69,196評論 6 398
  • 文/花漫 我一把揭開白布鲜屏。 她就那樣靜靜地躺著,像睡著了一般国拇。 火紅的嫁衣襯著肌膚如雪洛史。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,793評論 1 314
  • 那天酱吝,我揣著相機與錄音也殖,去河邊找鬼。 笑死务热,一個胖子當著我的面吹牛忆嗜,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播崎岂,決...
    沈念sama閱讀 41,221評論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼捆毫,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了冲甘?” 一聲冷哼從身側(cè)響起绩卤,我...
    開封第一講書人閱讀 40,174評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎江醇,沒想到半個月后濒憋,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,699評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡陶夜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,770評論 3 343
  • 正文 我和宋清朗相戀三年跋炕,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片律适。...
    茶點故事閱讀 40,918評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖遏插,靈堂內(nèi)的尸體忽然破棺而出捂贿,到底是詐尸還是另有隱情,我是刑警寧澤胳嘲,帶...
    沈念sama閱讀 36,573評論 5 351
  • 正文 年R本政府宣布厂僧,位于F島的核電站,受9級特大地震影響了牛,放射性物質(zhì)發(fā)生泄漏颜屠。R本人自食惡果不足惜辰妙,卻給世界環(huán)境...
    茶點故事閱讀 42,255評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望甫窟。 院中可真熱鬧密浑,春花似錦、人聲如沸粗井。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,749評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽浇衬。三九已至懒构,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間耘擂,已是汗流浹背胆剧。 一陣腳步聲響...
    開封第一講書人閱讀 33,862評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留醉冤,地道東北人秩霍。 一個月前我還...
    沈念sama閱讀 49,364評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像冤灾,于是被迫代替她去往敵國和親前域。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,926評論 2 361

推薦閱讀更多精彩內(nèi)容

  • 甲圖是一個構(gòu)成的結(jié)構(gòu)的頂點和邊緣韵吨。頂點和邊都可以有任意數(shù)量的鍵/值對稱為屬性匿垄。頂點表示離散對象,例如人归粉,地點或事件...
    達微閱讀 3,133評論 0 8
  • ORA-00001: 違反唯一約束條件 (.) 錯誤說明:當在唯一索引所對應(yīng)的列上鍵入重復(fù)值時椿疗,會觸發(fā)此異常。 O...
    我想起個好名字閱讀 5,343評論 0 9
  • 官網(wǎng) 中文版本 好的網(wǎng)站 Content-type: text/htmlBASH Section: User ...
    不排版閱讀 4,408評論 0 5
  • TITLE: 編程語言亂燉 碼農(nóng)最大的煩惱——編程語言太多糠悼。不是我不學(xué)習届榄,這世界變化快! 有時候還是蠻懷念十幾倔喂、二...
    碼園老農(nóng)閱讀 5,337評論 2 35
  • 69【旅行】旅行的意義 放松铝条,觀世界or世界觀,提要求席噩,動力 一個人生活的廣度表現(xiàn)ta優(yōu)秀的深度班缰。 一切都有可能。
    依盈閱讀 120評論 0 0