いまのNeo4jの使いどころ
GeekWomenJapan Advent Calendar 2016 5日目
最近触り始めたグラフデータベースのNeo4j。
実際に利用している中で得た、いまのNeo4jの使いどころについてです。
主には、気になっていたけどさてどんな目的で提案しよう...なんて思っていた方向け。
いちおう簡単な紹介も書きますが、なにこれ知らなかったけど面白い!という方は、ググって他の方の記事をお読みいただく方がきっと適切です。
数年前にも一度流行っていたので、日本語の記事も結構ありますし分かりやすいと思います。
1.グラフデータベース?Neo4j?
要するに、データをグラフ(ネットワーク)の形でCRUDできるデータベースです。
現状、グラフ"データベース"といえば使うならOSSだしNeo4jかなー、となりがちな印象。
Oracle にも Oracle Labs PGX がありますが、日本では本当にこれから、といった感じです。
Oracle Labs PGX: Parallel Graph Analytics Overview
ちなみにグラフ"分析"ならSparkのGraphXなどなどあります。
Neo4jはいわゆるデータ(ex.会社や社員) をノード、ノードとノードの関係(ex.所属している、上司、部下)をリレーションシップとして保持します。
ノードが"頂点"、リレーションシップが"エッジ"や"枝"と言われるものに相当します。
ノードやリレーションシップにはラベルがありいろいろなタイプの情報をまとめられますし、それぞれプロパティを持つことも可能です。
リレーションシップ自体がRDBで言うところの内部キーのような扱いなので、ノードのプロパティに特別なキーを持たせる必要はありません。
2.活用事例
先日の私のLT資料。
今、こんなことをしていますよー程度の内容ですので、パラ読みで大丈夫です。
あと簡単な最新の自己紹介があるくらい。もう少し真面目な自己紹介はこっち。
3.Neo4jの使いどころ
私がNeo4j(2系)を触っていたり最新版(3.1系)の内容を見て感じた、Neo4jを使おうとした際に是非満たして欲しいポイントがこの3点。
1) ネットワーク構造を持つデータをいずれ分析したい
2) WebIFを使わないのは勿体無い
3) Neo4jはあくまでグラフデータベースでありデータの切り出しまでが担当
以下、それぞれについて解説します。
1) ネットワーク構造を持つデータをいずれ分析したい
ネットワーク構造(あるいはグラフ構造)を持っている情報は、ごく普通に存在しています。
例えば社員や会員情報だって、会社や部署や人との関係性を持つ、ネットワーク構造として表現することができます。
なので、ある意味かなり広く使うことができるのですが、ただ情報をCRUDするだけならRDBでも十分です。
とはいえスキーマが複雑で、内部でキーを持たせてごちゃごちゃとJOINしなきゃいけないようなデータなら、JOINするよりはrelationshipでデータ自体を繋いでしまった方がきっと速いし簡単だし柔軟であるかもしれません。
内部キー持たせなかったけど、あーAとDってhogeで繋がってるわーどうしよーなんて時にも後でクエリー叩けばOK。
あれ?そう考えると内部でキーをぐるんぐるん持ち回りしたりたくさんマッピングテーブル持ってるようなスキーマなら、載せ替えてもいい気がしてきた。
aggregation系のCypherもあり、集計や平均、偏差あたりは十分に可能です。
グラフ構造なので、誰が/何がたくさんのノードから紐付けされてるのかなーなんて分析も一目瞭然だったりします。
なのですが、せっかくグラフ構造なのでこのままグラフ分析をしたいなーと思った場合には少々力不足。
さすがに最短経路くらいはあるので、レコメンド的なものはできそう。
あとは 3) で書きます。
2) WebIFを使わないのは勿体無い
Neo4jはウェブインターフェイスがカッコいい。素敵。最初こればっかり触っていたくらい大好き。
私たちの場合にはReadOnlyなので検索中心ですが、検索して、パッとデータの繋がりが見えるのは非常に嬉しいです。
この論文、なんだかこの人から引用されまくってるなーとか、この人どんだけ仕事してんだよーとか、一目瞭然。
1) にも通ずるところはありますが、グラフデータとしてデータが見えることで、分析の手がかりになります。
このウェブインターフェイスを使うことがイメージできないのであれば、別にRDBでいいのかなーという指標になるかな、と思いました。
3) Neo4jはあくまでグラフデータベースでありデータの切り出しまでが担当
3.1での追加機能などを見ても、スケーリングや耐障害性といったデータベースとしての機能の充実がメインになっているので、現状の使いどころとしてはデータベースとしての使い方に集約すべきだと感じています。
1) にも書きましたが、グラフデータなので、グラフ分析ネットワーク分析の、密度がーとか中心性がーとかやりたくても、Neo4jには術がない。
私たちは、今の所そんなに大きなネットワークの分析をしていないので、サブグラフを切り出してCSVなりに落とし、分析にはRなどを使っています。
Boltを使えばNeo4jから直接データを吸い出せそうなので、今後研究で大規模なグラフを扱うならSparkとか、そもそもPGXを使おうかーなどと話しています。
とはいえCypherクエリーはシンプルですし、SQLを触ったことがあるならば半日ほどでCRUDは簡単に達成できるでしょう。
今後どのような方向に機能を拡充していくのかも期待大、いずれにせよ、楽しくていいですよ。
4. 参考文献
今の所こちらが一番オススメです。
5. <Prev GeekWomenJapan Advent Calendar 2016 4日目
REST必要条件を簡単にさっくりと 超入門編 // Speaker Deck
非常にシンプルかつ分かりやすいREST必要条件! なんとなーくで使っていていざ説明しろと言われてもうまく説明する自信がなかったので、とても助かります。
6. Next> GeekWomenJapan Advent Calendar 2016 6日目
そういえばハードが絡むプログラミングはやったことがなかったので、私も手を出してみようかな。
すぐウェブアプリにしてしまう視野の狭さを反省。。。
最後に
結局時間がなくてNeo4jのことを書いてしまいましたが、ゆとりがあれば私が触れる言語9つ書いて比較ーとかやろうとしていました。
これでも初めてのお仕事言語が Scala という割とレアめな人間なので、ちょっと面白いかなと。
せっかく GeekWomenJapan の Advent Calendar だったのにこんな記事で恐縮ですが、このブログには一人の女性エンジニアとして、また、一人の働く母として得た知見などもまとめています、興味があればお時間のあるときにでも眺めていただければ幸いです。
と、時間が足りなくて急いで書いたので、後でちょいちょい文章修正しているかも。すみません。