Gremlin

Gremlin是Apache軟體基金會下的Apache TinkerPop開發的圖遍歷語言和虛擬機器。Gremlin適用於基於OLTP的圖資料庫以及基於OLAP的圖處理器。Gremlin的函式式語言和自動機基礎使Gremlin能夠自然地支援指令式和宣告式查詢、主機語言不可知性、使用者定義的領域特定語言、可擴充套件的編譯器/最佳化器、單機和多機執行模型、混合深度和廣度優先評估以及圖靈完備性。作為一個解釋性的類比，Apache TinkerPop和Gremlin之於圖資料庫，就如同JDBC和SQL之於關係型資料庫。 同樣，Gremlin遍歷機與圖計算的關係也類似於為Java虛擬機器與通用計算之間的關係。供應商的一體化.Gremlin是Apache2許可的圖遍歷語言，可供圖系統供應商使用。通常有兩種型別的圖系統供應商：OLTP圖資料庫和OLAP圖處理器。下表概述了支援Gremlin的圖系統供應商。圖遍歷示例.以下Gremlin-Groovy環境中的Gremlin查詢和響應示例與MovieLens資料集的圖表示有關。 該資料集包括為電影評分的使用者，每個使用者都有各自的職業，每部電影都有一個或多個與之相關的類別，MovieLens圖表架構詳述如下。user--rated[stars:0-5]--&gt;movieuser--occupation--&gt;occupationmovie--category--&gt;category簡單遍歷.gremlin&gt; g.V().label().groupCount()==&gt;[occupation:21, movie:3883, category:18, user:6040]gremlin&gt; g.V().hasLabel('movie').values('year').min()==&gt;1919gremlin&gt; g.V().has('movie','name','Die Hard').inE('rated').values('stars').mean()==&gt;4.121848739495798投影遍歷.gremlin&gt; g.V().hasLabel('category').as('a','b').select('a','b').by('name').by(inE('category').count())==&gt;[a:Animation, b:105]==&gt;[a:Children's, b:251]==&gt;[a:Comedy, b:1200]==&gt;[a:Adventure, b:283]==&gt;[a:Fantasy, b:68]==&gt;[a:Romance, b:471]==&gt;[a:Drama, b:1603]==&gt;[a:Action, b:503]==&gt;[a:Crime, b:211]==&gt;[a:Thriller, b:492]==&gt;[a:Horror, b:343]==&gt;[a:Sci-Fi, b:276]==&gt;[a:Documentary, b:127]==&gt;[a:War, b:143]==&gt;[a:Musical, b:114]==&gt;[a:Mystery, b:106]==&gt;[a:Film-Noir, b:44]==&gt;[a:Western, b:68]gremlin&gt; g.V().hasLabel('movie').as('a','b').where(inE('rated').count().is(gt(10))).select('a','b').by('name').by(inE('rated').values('stars').mean()).order().by(select('b'),decr).limit(10)==&gt;[a:Sanjuro, b:4.608695652173913]==&gt;[a:Seven Samurai (The Magnificent Seven), b:4.560509554140127]==&gt;[a:Shawshank Redemption, The, b:4.554557700942973]==&gt;[a:Godfather, The, b:4.524966261808367]==&gt;[a:Close Shave, A, b:4.52054794520548]==&gt;[a:Usual Suspects, The, b:4.517106001121705]==&gt;[a:Schindler's List, b:4.510416666666667]==&gt;[a:Wrong Trousers, The, b:4.507936507936508]==&gt;[a:Sunset Blvd. (a.k.a. Sunset Boulevard), b:4.491489361702127]==&gt;[a:Raiders of the Lost Ark, b:4.47772]宣告式模式匹配遍歷.Gremlin支援類似於SPARQL的宣告式圖模式匹配。例如，下面的查詢使用了Gremlin的match() 步驟。gremlin&gt; g.V().match(__.as('a').hasLabel('movie'),__.as('a').out('category').has('name','Action'),__.as('a').has('year',between(1980,1990)),__.as('a').inE('rated').as('b'),__.as('b').has('stars',5),__.as('b').outV().as('c'),__.as('c').out('occupation').has('name','programmer'),__.as('c').has('age',between(30,40))).select('a').groupCount().by('name').order(local).by(valueDecr).limit(local,10)==&gt;Raiders of the Lost Ark=26==&gt;Star Wars Episode V - The Empire Strikes Back=26==&gt;Terminator, The=23==&gt;Star Wars Episode VI - Return of the Jedi=22==&gt;Princess Bride, The=19==&gt;Aliens=18==&gt;Boat, The (Das Boot)=11==&gt;Indiana Jones and the Last Crusade=11==&gt;Star Trek The Wrath of Khan=10==&gt;Abyss, The=9OLAP遍歷.gremlin&gt; g = graph.traversal(computer(SparkGraphComputer))==&gt;graphtraversalsource[hadoopgraph[gryoinputformat-&gt;gryooutputformat], sparkgraphcomputer]gremlin&gt; g.V().repeat(outE('rated').has('stars', 5).inV().groupCount('m').by('name').inE('rated').has('stars', 5).outV()).times(4).cap('m')==&gt;Star Wars Episode IV - A New Hope 35405394353105332==&gt;American Beauty 31943228282020585==&gt;Raiders of the Lost Ark 31224779793238499==&gt;Star Wars Episode V - The Empire Strikes Back 30434677119726223==&gt;Godfather, The 30258518523013057==&gt;Shawshank Redemption, The 28297717387901031==&gt;Schindler's List 27539336654199309==&gt;Silence of the Lambs, The 26736276376806173==&gt;Fargo 26531050311325270==&gt;Matrix, The 26395118239203191Gremlin圖遍歷機.Gremlin是一個由指令集和執行引擎組成的虛擬機器。下表在Gremlin和Java之間進行了類比。Gremlin步驟(指令集).以下歷是一個Gremlin遍歷在Gremlin-Java8的方言。g.V().as("a").out("knows").as("b").select("a","b").by("name").by("age")Gremlin語言"的步驟序列。下面提供了遍歷的字串表示。[GraphStep([],vertex)@[a], VertexStep(OUT,[knows],vertex)@[b], SelectStep([a, b],[value(name), value(age)])]這些"步驟"是Gremlin圖遍歷機的原語。它們是機器最終執行的引數化指令。Gremlin指令集大約有30個步驟。這些步驟足以提供通用計算以及表達任何圖遍歷查詢的共同主題通常所需的內容。鑑於Gremlin是一種語言、一個指令集和一個虛擬機器，可以設計另一種編譯為Gremlin遍歷機器的遍歷語言。例如，可以編譯流行的SPARQL圖模式匹配語言以在Gremlin機器上執行。以下SPARQL查詢SELECT ?a ?b ?cWHERE {?a a Person .?a ex:knows ?b .?a ex:created ?c .?b ex:created ?c .?b ex:age ? d .FILTER(?d &lt; 30)將被編譯到[GraphStep([],vertex), MatchStep(AND,MatchStartStep(a), LabelStep, IsStep(eq(Person)), MatchEndStep], [MatchStartStep(a), VertexStep(OUT,[knows],vertex), MatchEndStep(b)], [MatchStartStep(a), VertexStep(OUT,[created],vertex), MatchEndStep(c)], [MatchStartStep(b), VertexStep(OUT,[created],vertex), MatchEndStep(c)], [MatchStartStep(b), PropertiesStep([age],value), MatchEndStep(d)], [MatchStartStep(d), IsStep(gt(30)), MatchEndStep), SelectStep([a, b, c])].在Gremlin-Java8中，上面的SPARQL查詢將被編譯為相同的Gremlin步驟序列，其表示如下。g.V().match(as("a").label().is("person"),as("a").out("knows").as("b"),as("a").out("created").as("c"),as("b").out("created").as("c"),as("b").values("age").as("d"),as("d").is(gt(30))).select("a","b","c")Gremlin機(虛擬機器).Gremlin圖遍歷機可以在單臺機器上執行，也可以在多機計算叢集上執行。執行不可知論允許Gremlin在圖資料庫上執行。