| グレムリン | |
|---|---|
| デザイン : | マルコ・A・ロドリゲス |
| 開発者 | Apacheソフトウェア財団のApache TinkerPop |
| 初 登場 | 2009年 (2009年) |
| 安定放出 | |
| OS | クロスプラットフォーム(マルチプラットフォーム) |
| ライセンス | Apache License 2.0 |
| Webサイト | tinkerpop.apache.org |
| 方言 | |
| Gremlin - Java、Gremlin - Python、Gremlin - JavaScript、Gremlin.Net、Gremlin - Go、Gremlin - Groovy | |
| 影響を受けた | |
| 正規表現、XPath、Ripple、SPARQL、SQL、Java / JVM | |
Gremlin は、 Apache Software FoundationのApache TinkerPopによって開発されたグラフ走査言語および仮想マシンです。Gremlin は、 OLTPベースのグラフ データベースとOLAPベースのグラフ プロセッサの両方で動作します。Gremlin のオートマタと関数型言語の基盤により、Gremlin は、命令型および宣言型のクエリ、ホスト言語非依存性、ユーザー定義のドメイン固有言語、拡張可能なコンパイラ/オプティマイザ、シングルマシンおよびマルチマシン実行モデル、チューリング完全性を備えたハイブリッド深さ優先および幅優先評価を自然にサポートできます。[ 2 ]
説明的な類推として、Apache TinkerPopとGremlinは、グラフデータベースにとってJDBCとSQLがリレーショナルデータベースにとっての存在と同じである。同様に、Gremlinトラバーサルマシンは、グラフコンピューティングにとってJava仮想マシンが汎用コンピューティングにとっての存在と同じである。[ 3 ]
GremlinはApache2ライセンスのグラフ走査言語であり、グラフシステムベンダーが利用できます。グラフシステムベンダーには、一般的にOLTPグラフデータベースとOLAPグラフプロセッサの2種類があります。以下の表は、Gremlinをサポートするグラフベンダーの一覧です。
Gremlin-Groovy環境におけるGremlinクエリとレスポンスの以下の例は、MovieLensデータセットのグラフ表現に関するものです。[ 4 ]このデータセットには、映画を評価するユーザーが含まれています。ユーザーはそれぞれ1つの職業を持ち、各映画には1つ以上のカテゴリが関連付けられています。MovieLensグラフスキーマの詳細は以下に記載されています。
ユーザー--評価[星: 0 - 5 ] -->映画ユーザー--職業-->職業映画--カテゴリ-->カテゴリグラフ内の各頂点について、そのラベルを出力し、各ラベルをグループ化して、それぞれの異なるラベルの数をカウントする。
gremlin > g . V (). label (). groupCount () ==>[ occupation: 21 , movie: 3883 , category: 18 , user: 6040 ]最も古い映画はいつ製作されましたか?
gremlin > g.V (). hasLabel ( 'movie' ). values ( 'year' ) . min () == > 1919『ダイ・ハード』の平均評価は?
gremlin > g . V (). has ( 'movie' , 'name' , 'Die Hard' ). inE ( 'rated' ). values ( 'stars' ). mean () ==> 4.121848739495798各カテゴリについて、その名前とそれが表す映画の数をマップとして出力します。
gremlin > g . V (). hasLabel ( 'category' ). as ( 'a' , 'b' ). select ( 'a' , 'b' ). by ( 'name' ). ( inE ( 'category' ). count ()) == >[ a: Animation , b: 105 ] ==>[ a: Children ' s , b: 251 ] ==>[ a: Comedy , b: 1200 ] ==>[ a: Adventure , b: 283 ] ==>[ a: Fantasy , b: 68 ] ==>[ a: Romance , b: 471 ] ==>[ a: Drama , b: 1603 ] ==>[ a: Action , b: 503 ] ==>[ a: Crime , b: 211 ] ==>[ a: Thriller , b: 492 ] ==>[ a: Horror , b: 343 ] ==>[ a: Sci - Fi , b: 276 ] ==>[ a: Documentary ] , b: 127 ] ==>[ a:戦争, b: 143 ] ==>[ a:ミュージカル, b: 114 ] ==>[ a:ミステリー, b: 106 ] ==>[ a:フィルム・ノワール, b: 44 ] ==>[ a:西部劇, b: 68 ]評価数が11件以上の映画ごとに、映画名と平均評価を示すマップを出力します。マップは平均評価の高い順に並べ替えます。上位10件のマップを出力します。
gremlin > 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 ) ==>[ a: Sanjuro , b : 4.608695652173913 ] ==>[ a: Seven Samurai ( The Magnificent Seven ) , b: 4.560509554140127 ] ==>[ a: Shawshank Redemption , b : 4.554557700942973 ] ==>[ a: Godfather , b : 4.524966261808367 ] ==>[ a: Close Shave , b : 4.52054794520548 ] == > [ a: Usual Suspects , b : 4.517106001121705 ] ==>[ a: Schindler ' s List ] , b: 4.510416666666667 ] ==>[ a: Wrong Trousers , The , b: 4.507936507936508 ] ==>[ a: Sunset Blvd . ( a . k . a . Sunset Boulevard ), b: 4.491489361702127 ] ==>[ a: Raiders of the Lost Ark , b: 4.47772 ]Gremlinは、 SPARQLと同様の宣言型グラフパターンマッチングをサポートしています。例えば、以下のクエリはGremlinのmatch()ステップを使用しています。
30代のプログラマーはどんな80年代アクション映画が好きなのでしょうか?映画名ごとにグループカウントを行い、グループカウントマップを値の降順に並べ替えます。マップを上位10件に絞り込み、マップのエントリを出力します。
グレムリン> 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 ) ==>レイダース/失われたアーク= 26 ==>スター・ウォーズエピソード5 /帝国の逆襲= 26 == >ターミネーター、ザ= 23 ==>スター・ウォーズエピソードVI -ジェダイの帰還= 22 == >プリンセス・ブライド= 19==>エイリアン= 18 == >ボート(ダス・ブート) = 11 == >インディ・ジョーンズ/最後の聖戦= 11 == >スター・トレックカーンの逆襲= 10 == >アビス= 9暗黙の5つ星評価グラフにおいて、最も中心的な位置を占める映画はどれですか?
gremlin > g = graph . traversal ( computer ( SparkGraphComputer )) ==> graphtraversalsource [ hadoopgraph [ gryoinputformat -> gryooutputformat ], sparkgraphcomputer ] gremlin > g . V (). repeat ( outE ( 'rated' ). has ( 'stars' , 5 ). inV (). groupCount ( 'm' ). by ( 'name' ). inE ( 'rated' ). has ( 'stars' , 5 ). outV ()). times ( 4 ). cap ( ' m' ) ==>スター・ウォーズエピソードIV -新たなる希望35405394353105332 ==>アメリカン・ビューティー31943228282020585 == >レイダース/失われたアーク《聖櫃》31224779793238499 == >スター・ウォーズエピソードV -帝国の逆襲30434677119726223 == >ゴッドファーザー30258518523013057 == >ショーシャンクの空に28297717387901031 == >シンドラーのリスト27539336654199309 == >羊たちの沈黙26736276376806173 == >ファーゴ26531050311325270 == >マトリックス26395118239203191Gremlinは、命令セットと実行エンジンから構成される仮想マシンである。GremlinはJavaと類似点があるとされる。
以下の走査は、Gremlin-Java8方言によるGremlinの走査です。
g . V (). as ( "a" ). out ( "knows" ). as ( "b" ). select ( "a" , "b" ). by ( "name" ). by ( "age" )Gremlin 言語(つまり、グラフ走査を流暢に表現するスタイル)は、関数合成と関数ネストをサポートする任意のホスト言語で表現できます。このシンプルな要件により、Gremlin-Groovy、Gremlin-Scala、Gremlin-Clojure など、さまざまな Gremlin 方言が存在します。上記の Gremlin-Java8 による走査は、最終的に走査と呼ばれるステップシーケンスにコンパイルされます。上記の走査の文字列表現を以下に示します。
[ GraphStep ( [] , vertex ) @ [ a ] , VertexStep ( OUT , [ knows ] , vertex ) @ [ b ] , SelectStep ( [ a , b ] , [ value ( name ), value ( age ) ] ) ]ステップは、Gremlinグラフ走査マシンの基本要素です。これらは、マシンが最終的に実行するパラメータ化された命令です。Gremlinの命令セットは約30ステップで構成されています。これらのステップは、汎用コンピューティングを実現するのに十分であり、一般的なグラフ走査クエリの共通モチーフを表現するために通常必要とされるものです。
Gremlinは言語、命令セット、仮想マシンであるため、Gremlinトラバーサルマシンにコンパイルされる別のトラバーサル言語を設計することが可能です(ScalaがJVMにコンパイルされるのと同様)。例えば、広く使われているSPARQLグラフパターンマッチング言語は、Gremlinマシン上で実行できるようにコンパイルできます。以下のSPARQLクエリは、
SELECT ?a ?b ?c WHERE { ?a はPersonです。? aは?bを知っています。? aは?cを作成しました。? bは?cを作成しました。? bは ? cの年齢です。? dが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はグラフデータベース(OLTP)とグラフプロセッサ(OLAP)の両方で動作します。