Image
Top
Navigation

チュートリアル02 : Orient studioで遊ぶ

チュートリアル01 : OrientDBをinstallする(windows)からの続きです。

前回は
– WindowsにOrientDBを簡単にインストール
– OrientDBに標準で付属しているOrient StudioというGUIツールを起動
– サンブルデータベースであるグラフデータベース「gratefuldeadconcerts(グレイトフルデッドコンサート)」に接続
まででした。

グラフデータベースの特徴

OrientDBは、ドキュメント指向とグラフ指向の二つの種類のデータベースが取り扱えますが、サンプルにはグラフ(Graph)データベースが付属しています。

グラフデータベースの特徴をまとめると以下のように表現できます。
– vertex(バーテックス 頂点)と、それを結ぶedge(エッジ 辺)よってネットワークのように構成されます
– vertexはノード、edgeはリレーションと表現する場合もあります。
– グラフには、有向グラフと無向グラフがあります。
– 有向グラフは、edgeに向きがあるもので、例えば「フォロー」する関係を表現できます(AさんがBさんをフォローする)
– 無向グラフは、edgeに向きがないもので、例えば「友達」関係を表現できます(AさんとBさんが友達)
– 本来は、
– vertexやedgeはそれぞれプロパティを持てます

とりあえず簡単な構造のグラフデータベースを作成していろいろ試してみましょう。

gratefuldeadconcertsデータベースの解説

gratefuldeadconcertsデータベースの構造

gratefuldeadconcerts

これがデータベースの構造を図に表したものです。

  • 四角がvertex
  • 線がedge

です。

後で見ていきますが、vertexであるSong(歌)とArtist(アーティスト)は、一つのクラス(V)の中で、’type’というプロパティに、’song’または’artist’という値を持つことで区分けしています。しかし、edgeは、sung_byとwritten_byが一つのクラス(E)の中に格納されており、followed_byはクラス(E)を継承したクラス(followed_by)に格納されています。

このあたりの詳しいところはまた今度ということで、とりあえずOrient Studioを操作してみましょう。

SQLの実行画面

SQL

ここに

select * from V 

と入力して、’run’をクリックするか、Ctrl+Enterを押します。

その結果がこちらです。

SQL

検索結果が表形式で表示されました。
今後は、右下にある”Raw”をクリックしましょう。

SQL

今度はJSON形式で表示されました。

次に、表形式に戻して、以下のSQLを実行します

select * from V where name = 'Garcia'

SQL

このガルシア(Garcia)さんは、ギター・ボーカルのジェリー・ガルシアさんで、グレイトフル・デッドの中心メンバーです。

レコードID(RID)の説明

OrientDBでは、レコードID(RID)と呼ばれる、各レコードにユニークなIDを持っていて、レコード登録時に自動採番号されます。 レコードIDは二つの部分で構成されます。
レコードIDは二つの部分で構成されます。

#<cluster-id>:<cluster-position>
  • cluster-id これは、クラスターを示すIDです。データベース毎に最大32,767件(2の15乗)のクラスターが持てます。
  • cluster-position これはクラスター中のレコードのIDです。クラスター単位で9,223,372,035,000,000,000件 (2の63乗)のレコードが持てます。

ここでクラスターという概念が初めて登場しました。しかし、ここでクラスターについて説明し出すと話が難しくなるので、いったん忘れます。
とりあえず、デフォルトではスキーマ(=テーブル)と1対1で存在する物理的な場所に関する概念、と考えて置いて下さい。

バージョン(version)の説明

OrientDBでは、データベースのレベルでレコードのバージョン番号を持っています。これは、プログラムレベルで意識しなくても自動的にカウントアップされます。
このバージョンは、楽観的排他で利用されます。

リレーションを表示する

さて、ここで、右上にある「shallow collection」のチェックを外して再度、クエリーを実行してみて下さい。

SQL

ここで表示された”in_sung_by”や”in_written_by”で表示されたたくさんの”9:1″とかのレコードIDは何でしょう?
ちょっとクリックしてみましょう。

SQL

これは、ガルシア(Garcia)さんを表すレコードと、”sung_by”や”written_by”というedgeでリレーションされた歌(song)を表しています。

イメージを図にしてみるとこんな感じです。

image

さて、ここからは、いろいろなSQLを入力して、グラフデータベースを検索してみましょう。

いろいろなSQL

レコードIDで検索する

select * from V where @RID=#9:8
select * from #9:8

条件指定で検索する

select * from V where type='song'
select * from V where type='artist'

複数の条件で検索する

select * from V where type='song' and performances > 10

件数を取得する

select count(*) from V where type='song'

※結果の@RIDが#-2:0のようにクラスターを表す部分が負の数字になります。これはテンポラリィデータであることを示しています。

トラバースする

traverse in('sung_by') from ( select * from V where @RID=#9:8)

結果はこうなりました。

image

意図としては、ガルシア(Garcia)さんに対して、”sung_by”でin方向にリレーションされた歌(song)を検索することでした。でも、でも赤線で囲われたところにを見ると、ガルシア(Garcia)さん自身のデータも表示されてしまいます。

そこで、副問合せを利用して、歌(song)だけに絞ってみます。

select * from 
     ( traverse in('sung_by') from ( select * from V where @RID=#9:8) ) 
 where type = 'song'

こんどはうまくいきましたね。

image

トラバース結果からさらにトラバースする

今度は、ガルシア(Garcia)さんが歌った歌(song)を作曲した人(アーティスト)を探してみましょう。
歌(song)側から見て”written_by”というedgeでトラバースするので向けは”out”になります。

select * from (
    traverse out('written_by') from (
        select * from 
             ( traverse in('sung_by') from ( select * from V where @RID=#9:8) ) 
         where type = 'song'
    )
 )
 where type = 'artist'

うまくいきました!

image

トラバースをもっと簡単に書く

OrientDBはグラフ機能のためにSQLを拡張しています。直前のSQLは以下のように簡単な書き方もできます。

select expand(in('sung_by').out('written_by')) from #9:8

この実行過程を見ていくと
– #9:8のレコードを取得(ガルシア(Garcia)さん)
– in(‘sung_by’)が実行されて、ガルシア(Garcia)さんが歌った歌が取得される
– そのそれぞれについて、out(‘written_by’)が実行されて、その歌を作曲した人が取得される
– expandでその結果のvertexが取得される

となります。

追加解説

  • in(‘sung_by’)はin_sung_byとも書けます
  • out(‘written_by’)はout_written_byとも書けます
  • 友達関係を表したい場合はinやoutだけではなくbothも使えます(この場合はどちら向きでも構わないことになります)

チュートリアル03 : OrientDBをサービスとして起動する(windows)に続きます。