【レポート】NEW LAUNCH! Amazon Neptune Workshop : SPARQL と Gremlin を使って Amazon Neptune からデータを取得してみよう #reinvent #DAT342

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

本記事は AWS re:Invent 2017 のワークショップ 「DAT342 - NEW LAUNCH! How to build graph applications with SPARQL and Gremlin using Amazon Neptune」のレポートです。

私はグラフデータベースもそのクエリもほとんど触ったことがありませんでしたが、ステップごとに丁寧に説明があり、簡単なクエリなら理解して発行できるようになりました。また、新サービスが発表されたその日にこのようなハンズオン形式で学べるというのは、現地ならではですね。

Amazon Neptune の速報については以下を参照ください。

スピーカー

  • Michael Schmidt - Senior Software Development Engineer, Amazon
  • Divij Vaidya - Software Development Engineer, Amazon Web Services
  • Peter Haase - CEO, metaphacts GmbH
  • Patrick Madden - CA, Tom Sawyer Software

ワークショップの進め方

席につくと環境構築手順書がありました。

tutorial.png

そして、このワークショップは、以下の順で進めていくという説明がありました:

  • グラフデータベースについて
    • コンセプトとユースケースの説明
    • Amazon Neptune の紹介と展望の説明
    • ハンズオン:環境構築
  • Amazon Neptune SPARQL について
    • RDF と SPARQL の紹介
    • ハンズオン:SPARQLを使って RDF グラフのアプリケーションを構築する
  • Amazon Neptune Gremlin について
    • プロパティグラフと Gremlin の紹介
    • ハンズオン:Gremlinを使ってプロパティグラフに問い合わせ/操作する

ということで、テーマごとにセッションで説明があって、そのあとにハンズオンでやってみるという形式です。さっそくレポートしていきます。

グラフデータベースのコンセプトとユースケースの説明

グラフデータベースは、高度に関連しあったデータに対して有効です。その例は次のようなものです。 usecase.png

グラフのモデルとフレームワークの先導者は、プロパティグラフが Apache TinkerPop、RDFグラフのためのクエリ言語が SPARQL Query Language です。

Amazon Neptune の紹介

TinkerPop / Gremlin と RDF / SPARQL どちらもサポートします。 neptune_concept.png

ハンズオン:環境構築

ここまで聞いた私の感想は「全然わからない」でした。グラフデータベースに疎い状態でデータモデルとクエリ言語の話が出てきて必死に検索していました。が、後から丁寧に具体例を交えて説明してくれたので、問題なく進めることができました。ともあれこの時点では最初の環境構築です。今回のハンズオンで構築した環境は以下のようなものでした。

hands-on-env.png

SSHログインすると、手元のMacでポートフォワーディング先のサービスを開けます。

http://localhost:2345/ => フォワーディング先の metaphacts サイトが開ける metaphactory_hello.png

http://localhost:1234/ => フォワーディング先の Tom Sawyer が開ける tomsawyer_hello.png

これで環境構築は完了です。実際の手順書には、PEMの取得方法、SSHログインの方法などが書かれています。これに従えば特に難しい所はありません。次のセッションに移ります。

Amazon Neptune SPARQL

RDFグラフを説明します。RDFグラフでは、URIをグローバルなリソースのIDとして使います。 rdf_is.png

RDFはグラフのすべてのエッジを (subject, predicate, object ) 3つの組みあわせで表現します。URIを使うことで、リンクされたデータを表現することが簡単になります。 rdf_1.png

rdf_2.png

rdf_3.png

ではこのグラフに対してSPARQLでクエリを発行してみましょう。

sparql_1.png

sparql_2.png

sparql_3.png

sparql_4.png

  • WHERE 句で、( subject, predicate, object ) を指定しているのがわかります。
  • ?を接頭句につけると、合致するものをさがして返します
  • さらに、.(ピリオド)をつなげて 別の ( subject, predicate, object ) をつなげると、「前の結果から得られた object を subject に指定して探す」つまりリンクをたどることができます

ここまでで、ぼんやりとクエリを構築できるイメージが湧いてきました。

ハンズオン:SPARQLを使って RDF グラフのアプリケーションを構築する

metaphactsサイトで作業します。説明にあった SPARQL を使って、目的のデータをさがしたり、可視化する問題が並んでいました。ここではその中のひとつを紹介します。

SELECT specific properties

We want to select only specific properties and not all. For example, we want to select the name, the phone number, the place of incorporation and the location of Netflix Inc. We are interested in the data shown below.

ある情報がわかっているとき(ここでは Netflix 社のIDがわかっている想定)、紐づく情報を複数取得することができることを示す課題です。

2_3.png


PREFIX fibo: <http://www.omg.org/spec/EDMC-FIBO/BE/LegalEntities/CorporateBodies/>
PREFIX organization: <http://permid.org/ontology/organization/>
PREFIX vcard: <http://www.w3.org/2006/vcard/ns#>
SELECT * WHERE {
  <https://permid.org/1-4295902158> vcard:organization-name ?organizationName.
  <https://permid.org/1-4295902158> organization:hasRegisteredPhoneNumber ?phoneNumber.
  <https://permid.org/1-4295902158> organization:isIncorporatedIn ?isIncorporatedIn.
  <https://permid.org/1-4295902158> fibo:isDomiciledIn ?location.
}

実行すると以下の結果が得られます。

2_3_result.png

さて、まず クエリの WHERE 句を 見てください。<https://permid.org/1-4295902158> という会社IDに対して、?organizationName、?phoneNumber、?isIncorporatedIn、?locationと複数の項目を問い合わせていますね。問い合わせた分だけ結果が得られるようです。RDBでいう SELECT 文で取得するカラムを指定するのと似ているのではないでしょうか。SPARQL ではこのような使い方もできます。

Amazon Neptune Gremlin

プロパティグラフとは、辺と頂点で構成され、それぞれがプロバティ(例えば key/value ペア)を持っているグラフを指します。

property_graph.png

Apache TinkerPop はオープンソースのグラフコンピューティングフレームワークです。また、Gremlin は TinkerTop のためのグラフ探索言語であり、プロパティグラフを実装し探索するセットのひとつです。

Amazon Neptune は TinkerTop Gremlin 3.3.0 と完全な互換性があります

Gremlin

  • グラフのためのDSLです
  • Gremlin は ステップで構成された言語です
  • ステップは、データストリームに対してアトミックに操作を実行します
  • ステップがつながり、ひとつのひとつのたどれる線をつくります
  • 前のステップの出力が次のステップおの入力になります

gremlin_query_expanded.png

上の例を見てください。これは音楽のブレーンのデータセットです。これをたどっていきます。

g.V()
  .hasLabel("work") // "work" というラベルを持つ頂点で
  .has("type","Song") // プロパティ "type" が "Song" のもの
  .has("name","I Miss You")  // さらにプロパティ "name" が "I Miss You" のもの
  .in("WRITER")  // そのライタが作った曲を演奏するアーティストで
  .out("FROM_AREA") // そのアーティストの住所
  .values("name") // 住所の名前は何?

このクエリは「曲 "I Miss You" のライタが住んでいる場所はどこ?」ということをやっています。

ハンズオンではGremlinコンソールを使います。

  • インタラクティブな REPL grooby shell
  • WebSocket利用
  • ハンズオン用のEC2のプリインストールされている
  • やってみましょう!

gremlin_filters.png

ハンズオン:Gremlinを使ってプロパティグラフに問い合わせ/操作する

こちらのハンズオンは、用意されたクエリを Amazon Neptune に発行するタイプでした。結果は以下のようになります。

// Find a artist with name as ”Paul McCartney”
g.V().hasLabel("artist").has("name", "Paul McCartney")
==>v[5035]

// Find vertex with Id 5042
g.V("5042")
==>v[5042]

// Find all releases after the year 2002
g.E().hasLabel("RELEASED_IN").has("year", between(1990, 2000))
==>e[24478][22043-RELEASED_IN->221]
==>e[24746][22083-RELEASED_IN->221]
==>e[397][21778-RELEASED_IN->221]
...

他にも様々なタイプのクエリを実行しました。 Gremlin のクエリを構築する上で重要となると感じたのは以下です:

  • 辺の方向を意識する(INなのかOUTなのか)
  • 今わかっている情報と、目的となる取得したい情報を整理する
  • クエリにおこす前に、実際にたどってみる
  • たどれたらそれをクエリにおこすだけ
  • たどれなかったら、用意する情報を増やすか、他にわかっている情報がもしあるならば、起点をかえてみる

総じて、目的となるデータの「位置」を意識することが重要だと思いました。グラフとしての距離が遠ければ遠いほど、複雑なクエリになりがちです。そうなった場合、起点を見直したり、またはそもそもグラフの構造を再考慮する必要があるかもしれません。いずれにしても、グラフというツールを用いてデータセットを探索できることは強力な手段の1つだと思います。

おわりに

Amazon Neptune は、TinkerPop / Gremlin と RDF / SPARQL どちらもサポートします。本ワークショップは、セッションとハンズオンを交えることで、SPARQLとGremlinをチュートリアル形式で経験することができました。グラフデータベースは検索もさることながら、構築のための設計も重要だと考えるため、次はビジネス要件に応じた適切なグラフ設計を知りたいな、とおもっています。とても楽しくためになるワークショップでした。