/var/log/messages

Jul 3, 2018 - 11 minute read - Comments - recommend

Gremlin Tutorial

以下のドキュメントを機械翻訳してみたのでこちらにも控えを。

  • g.V() : グラフのすべての頂点を取得します。
  • g.V(1) : 一意の識別子が「1」の頂点を取得します。
  • g.V(1).values('name') : 一意の識別子 “1"を持つ頂点のnameプロパティの値を取得します。
  • g.V(1).outE('knows') : 一意の識別子「1」を持つ頂点のラベルを「知って」いるエッジを取得します。
  • g.V(1).outE('knows').inV().values('name') : 一意の識別子 “1"を持つ頂点が “知っている"人々の名前を取得します。
  • g.V(1).out('knows').values('name') : 前のコマンドのようにoutE().inV()を使用すると、inE().inV() と in の場合と同様にout() に短縮することができます。
  • g.V(1).out('knows').has('age', gt(30)).values('name') : 頂点 “1” が知っている 30 歳以上の人の名前を取得します。
  • その次、は graph を作る、模様
    • 直感的に分かりやすいように、Gremlin自身にとっては、頂点、エッジ、プロパティがその存在の要素を構成するので、直感的です。
    • 私たちの友人、グレムリンは、トラバーサルを開発する際にグラフを移動し、トラバーサーが自分の次の所へ向かう必要がある場所を指し示すのに役立つと考えています。
    • 上記で議論した1つのエッジグラフを例として、2つの頂点を使用しましょう。 まず、このグラフを作成する必要があります:
    gremlin> graph = TinkerGraph.open()
    ==>tinkergraph[vertices:0 edges:0]
    gremlin> v1 = graph.addVertex(id, 1, label, "person", "name", "marko", "age", 29)
    ==>v[1]
    gremlin> v2 = graph.addVertex(id, 3, label, "software", "name", "lop", "lang", "java")
    ==>v[3]
    gremlin> v1.addEdge("created", v2, id, 9, "weight", 0.4)
    ==>e[9][1-created->3]
  • 上記のコードでは、いくつか重要なことを考慮する必要があります。
  • まず、IDとラベルはTinkerPopの特別な使い方のために “予約"されていることを思い出してください。
  • 作成メソッドに提供されたこれらの「キー」は、コンソールに静的にインポートされます。 あなたは通常、それらをT.idとT.labelと呼んでいます。
    • おそらく type も
    • レコードの例
    [[map[id:1 label:person type:vertex properties:map[name:[map[id:0 value:marko]] age:[map[id:2 value:29]]]]]]
  • 次に、TinkerGraphを使って作業していることを忘れないでください.TinkerGraphは識別子の割り当てを可能にします。
  • これは、ほとんどのグラフデータベースでは当てはまりません。
  • 最後に、Edgeのラベルが必要であり、addEdge()のメソッドシグネチャの一部です。
  • これは最初に指定されたパラメータで、次にv1が接続される頂点が続きます。
  • したがって、このようなaddEdgeの使用法は、v1からv2へと移動し、ラベルが「作成済み」であるエッジを作成することです。

あるいは graph の traverse

  • Gremlinはグラフのデータがどこにあるか知っているので、グラフの構造上で何らかのプロセスを実行すると考えることができます。
  • 質問を英語で行い、それをGremlinに翻訳することができます。
  • この最初の例では、Gremlinに “Markoが作成したソフトウェアは?“と尋ねてみましょう。
  • この質問に答えるために、Gremlinは次のようにしたいと考えています:
  • Find “marko” in the graph
  • Walk along the “created” edges to “software” vertices
  • Select the “name” property of the “software” vertices
  • 上記の英語ベースの手順は、グラフ上のグレムリンの位置と、私たちが質問に答えるために必要なステップに大部分を変換します。
  • これらのステップを一緒にストリングすることで、我々はTraversalまたはGremlinがあなたに答えを得るために必要とする一連のプログラム的なステップを形成します。
  • まず、「マーク」を見つけることから始めましょう。
  • この操作は、 “name"プロパティ値 “marko"を持つものと一致するように、頂点の完全なセットを検索するときのフィルタリングステップです。
  • これは、次のようにhas() ステップを使用して行うことができます。
    gremlin> g.V().has('name','marko')
    ==>v[1]
  • :注:変数gはTraversalSourceであり、 “The First Five Minutes"に導入されました。
  • TraversalSourceはgraph.traversal()で作成され、新しいトラバーサルを生成するために使用されるオブジェクトです。
  • 重要:上記のクエリはグラフのすべての頂点を反復してその答えを得ます。
    • 私たちの小さな例では大丈夫ですが、数百万〜数十億のエッジグラフにとっては大きな問題です。
    • この問題を解決するには、インデックスを使用する必要があります。
    • TinkerPopは、索引管理のための抽象化を提供しません。
    • 選択したグラフのドキュメントを参照してネイティブAPIを利用してインデックスを作成し、これらのタイプのルックアップを高速化する必要があります。
    • ただし、実行時にインデックスが透過的に使用されるため、トラバーサルは変更されません。
  • Gremlinが “marko"を見つけたので、今度は、 “作成された"エッジに沿って “ソフトウェア"頂点に “歩いて行く"ように求める、トラバーサルの次のステップを検討することができます。
  • 先に説明したように、エッジには方向性があるため、グレムリンにどのような方向を伝える必要があります。
  • この場合、私たちは彼が “marko"頂点から出て行くエッジを横切るようにします。 このために、outEステップを使用します。
    gremlin> g.V().has('name','marko').outE('created')
    ==>e[9][1-created->3]
  • この時点で、Gremlinを “marko"頂点から “created"端に移動して描くことができます。
  • エッジのもう一方の端にある頂点に到達するには、GremlinにinV() を使用してエッジから入ってくる頂点に移動するように指示する必要があります。
    gremlin> g.V().has('name','marko').outE('created').inV()
    ==>v[3]
  • Gremlinに “作成された"エッジのプロパティで何かをさせるのではなく、上記のステートメントを単純化することができます:
    gremlin> g.V().has('name','marko').out('created')
    ==>v[3]
  • 最後に、Gremlinが “Markoが作成したソフトウェア"に到達したので、彼は “ソフトウェア"頂点のプロパティにアクセスできるので、Gremlinに次のように “name"プロパティの値を抽出するように要求することができます:
    gremlin> g.V().has('name','marko').out('created').values('name')
    ==>lop
  • Gremlinがグラフの構造にどのような関係があり、Gremlinが頂点から端までどのように動くかを見ることができるはずです。 グレムリンにもっと複雑なことを尋ねるための手順をまとめていく能力は、これらの基本概念の理解にかかっています。

Graph Traversal - Increasing Complexity

  • 前のセクションの知識を武器に、Gremlinにもっと難しいトラバーサルタスクを実行してもらいましょう。
  • 私たちが持っていた “赤ちゃん"グラフではそれ以上のことはできませんので、 “5分セクション"の “現代"のおもちゃのグラフに戻りましょう。
  • このグラフを作成し、TraversalSourceを確立することができます:
  • 先ほどhas()ステップを使ってGremlinに “marko"頂点を見つける方法を教えました。 has()を使う他の方法を見てみましょう。
  • Gremlinに “vadas"と “marko"の両方の “年齢"の値を見つけさせたいとしたらどうでしょうか?
  • この場合、以下のようにhas()を使ってwithinコンパレータを使うことができます:
    gremlin> g.V().has('name',within('vadas','marko')).values('age')
    ==>29
    ==>27
  • PがGremlin Consoleに静的にインポートされていることは注目に値する(前述のようにTがそうであるように)。
  • 注意:Pの完全修飾名はorg.apache.tinkerpop.gremlin.process.traversal.Pです。
  • Gremlinに “vadas"と “marko"の平均年齢を尋ねたければ、mean()ステップを次のように使うことができます:
    gremlin> g.V().has('name',within('vadas','marko')).values('age').mean()
    ==>28.0
  • フィルタリングの別の方法は、whereステップの使用にあります。
  • マルコが作成した「ソフトウェア」を見つける方法はわかっています。
    gremlin> g.V().has('name','marko').out('created')
    ==>v[3]
  • そのマークを拡張して、彼が作成したソフトウェアについて「マルコ」が誰と協力しているかを知ろうとしましょう。
  • 言い換えれば、「マルコがソフトウェアを開発する人は誰ですか?」という質問に答えようとします。
  • これを行うには、前のクエリで彼を残したGremlinを最初に描いておく必要があります。
  • 彼は「ソフトウェア」の頂点に立っていた。
  • その “ソフトウェア"を “作成"した人物を知るためには、Gremlinを “作成された"辺に沿ってトラバースして、 “人"の頂点を見つける必要があります。
    gremlin> g.V().has('name','marko').out('created').in('created').values('name')
    ==>marko
    ==>josh
    ==>peter
  • それでいいのですが、 “ピーター”、 “ジョシュ”、 “マーク"の両方が “lop"の作成を担当していることがわかります。
  • もちろん、私たちはすでに “マーク"の関与について知っており、 “マーク"は自分と協力していると言うのは奇妙なので、結果から “マーク"を除外することは理にかなっています。 次のトラバーサルでその除外が処理されます。
    gremlin> g.V().has('name','marko').as('exclude').out('created').in('created').where(neq('exclude')).values('name')
    ==>josh
    ==>peter
  • 結果から「マルコ」を除外するために、トラバーサルに2つの追加を行いました。

  • 最初に、as()ステップを追加しました。

  • as()ステップは、実際には「ステップ」ではなく、「ステップ変調器」 - ステップまたはトラバーサルにフィーチャーを追加するものです。

  • ここでは、as( ‘exclude’)ラベルにhas()という名前の名前を付け、そのステップを通過するすべての値を後の使用のためにそのラベルに保持します。

  • この場合、 “marko"頂点はその点を通過する唯一の頂点なので、 “exclude"に保持されます。

  • もう1つの追加はhas()のようなフィルターステップであるwhere()ステップでした。

  • where()はin()ステップの後に配置され、 “person"頂点を持ちます。つまり、 “marko"コラボレーターのリストでwhere()フィルターが発生しています。

  • where()は、それを通過する「人」の頂点が「除外」ラベルの内容と等しくならないように指定します(つまり、neq())。

  • “marko"頂点だけを含んでいるので、where()は、 “作成された"辺をトラバースするときに得られる “marko"をフィルタリングします。

  • as()の多くの用途があります。 ここではselectとの組み合わせです:

    gremlin> g.V().as('a').out().as('b').out().as('c').select('a','b','c')
    ==>[a:v[1], b:v[4], c:v[5]]
    ==>[a:v[1], b:v[4], c:v[3]]
  • 上記の例では、Gremlinにすべての頂点を反復し、それぞれから2回横断するように指示します。

  • Gremlinはそのパスの各頂点にそれぞれ “a”、 “b”、 “c"というラベルを付けます。 selectを使用して、そのラベルの内容を抽出することができます。

  • 共通の重要なステップの1つは、group()ステップとそれに関連するステップモジュレータ()です。

  • グラフのすべての頂点を頂点ラベルでグループ化するようにGremlinに依頼したい場合、次のようにします。

    gremlin> g.V().group().by(label)
    ==>[software:[v[3], v[5]], person:[v[1], v[2], v[4], v[6]]]
  • by()を使用すると、グループ化の仕組みが提供されます。
  • この場合、Gremlinにラベルを使用するように依頼しました(これは、コンソールからTからの自動静的インポートです)。
  • 頂点の一意の識別子を出力として持つだけなので、私たちの分布について実際には分かりません。
  • これをより良くするために、Gremlinにgroup()に別のby()モジュレータを渡して値を変換することによって、それらの頂点から “name"プロパティの値を取得するようにGremlinに依頼することができました。
    gremlin> g.V().group().by(label).by('name')
    ==>[software:[lop, ripple], person:[marko, vadas, josh, peter]]
  • このセクションでは、プロパティグラフがどのようなもので、Gremlinがそれらとどのように対話するかについてもう少し詳しく学びました。
  • Gremlinがグラフを描くように構想する方法と、より複雑で一般的に利用されるいくつかのトラバーサルステップを使用する方法を学びました。
  • グラフ・コンピューティングへの適用範囲が広いという点でTinkerPopについて考える準備が整いました。

Gparted すごい沖縄

comments powered by Disqus