k4200’s notes and thoughts

Programmer side of k4200

OrientDBをPHPから使う(1)

OrientDB?

仕事でソーシャル系のサービス作ってるんだけど、グラフデータはやっぱグラフDBを使ったほうが良いよね。

一番有名なNeo4jにしようかと思ったけど、以下の理由からOrientDBを試してみることにした。

  • 「有名なの使うのって何かカッコ悪い」って思ってしまう軽度の中二病なので
  • OrientDBは実際にはグラフDB + ドキュメントDBって感じらしいので

実際は、今年の初めにちょっと触り始めてたんだけど半年以上放置してて、最近ようやく時間が取れるようになったのでまた触ってみることに。

OrientDB のセットアップ

インスコ

こちらのページからパッケージをダウンロード。2種類あるけど、Graph Editionの方で。

後は適当な場所に解凍するだけ。 /usr/local の下とか /opt の下とか、まぁ好みでどうぞ。

起動

解凍したパッケージの中に bin/orientdb.sh ってのがあるので、それの中身を適当に修正して /etc/init.d の下に置く。

Ubuntuの人はこんなチュートリアルが。RedHat系の人も最後の update-rc.d を chkconfig にするだけなのでまぁ問題なし。マカーとかWindowsとかは知りません。

使ってみる

DBの作成

以下のURLにアクセスすると、OrientDB StudioっていうGUIの管理画面みたいなのにつながる。見た目は分かりやすいんだけど、微妙に使いづらかったりするのはまぁ仕方ない。

http://localhost:2480/

サンプル用のDBも入ってるんだけど、それはほっといてまずはDBを作成。

Createボタンを押した次の画面で必要な情報を入力。

  • Database name: 適当に
  • Type: graph を選択
  • Storage type: local を選択

ボタンを押すと標準認証のダイアログが表示された。何を入れればいいか迷って試行錯誤したんだけど、ユーザー名にroot、パスワードはパッケージの中の config/orientdb-server-config.xml というファイルの中に書いてあるパスワードを入力したらOKだった。

ログイン

OrientDB Studioの最初の画面に戻って、先ほど作成したDBを選択し、ユーザー名とパスワードは共にadminを入力してログイン。

パスワードの変え方はここを参考に。

「クラス」の作成

ログイン後は「Schema」タブが開かれていて、下の表にOGraphEdgeとかのデフォルトのクラスが表示されているはず。名前の通り、OGraphVertexはグラフの頂点でOGraphEdgeはグラフの辺。

それらをそのまま使ってもいいけど、OrientDBでは「クラス」というのを自由に定義出来る。詳細はドキュメントを確認してね。

「Add class」ボタンを押すとダイアログが出てくるので、例えば以下のように入力

  • name: Person
  • superClass: OGraphVertex
  • alias: 空

説明する必要もあまりないと思うけど、デフォルトで存在するOGraphVertexクラスを継承したPersonクラスを作成した。

ついでに OGraphEdge クラスの子供の Follow クラスを作っておこう。

頂点の作成

これはいろんな方法があるみたいだけど、OrientDB StudioからSQLを実行するのが一番簡単っぽい。

え?SQLって思ったかもしれないけど、OrientDBではSQLをグラフDB用に拡張したものが使える。Tinkerpop, Gremlinってのも使えるので、Neo4jとかに慣れた人はそっちの方がいいのかな。Tinkerpopとかの話はググると有名人のブログが見つかると思うので、その辺を参考に。

で、SQLを使う場合は上の方の「Query」というボタンをクリック。

真ん中のテキストボックスで以下のように入力。

insert into Person (name) values ('k4200');

複数のSQLの同時実行は出来ないっぽいので、以下のようなのを1行ずつ実行。

insert into Person (name) values ('John Doe');
insert into Person (name) values ('Jane Doe');
辺の作成

これもSQL文で。

本当だったらこんなことをしたいが、まだ実装されていないらしい。

-- NG
create edge Follow
from (select from Person where name = 'k4200')
to (select from Person where name = 'Jane Doe')

ということで、まずは以下のSQLで @rid を調べて、

select from Person where name = 'k4200'
select from Person where name = 'Jane Doe'

以下のように実行。

-- #8:0 とかの値は各自の環境によって違うかも
create edge Follow from #8:0 to #8:2

ちなみに @rid はどんなオブジェクトにもついている一意の値。

ドキュメント・リソース

ドキュメントはWikiに色々エントリーがあるけど、古い情報があったり、あまりまとまってなかったり、結構分かりにくい。

MLに入るのがオススメ(自分も昨日入った)。メールの流量は結構多いので安心感がある。

まとめ・感想

上の手順でとりあえずOrientDBが使える状態になったはず。上述の通り、ドキュメントが微妙なのでこんな簡単な内容でも結構苦労した。でも、最初の壁を超えると楽しくなってくるはず。

次回はPHP bindingの説明とかしようかなと。