こんにちは。 今回は、巷で話題のグラフデータベース Neo4j に超入門してみました。 Mac環境であれば語弊なく15分で検証環境の構築と簡単な検証ができるので是非お試しください!
そもそもグラフデータベースとは?
グラフ構造を持ったデータの保存、探索、集計に最適化されたデータベースです。 RDBでは幾つものも関連テーブルを用意してjoin後集計する必要があった人間関係を示すソーシャルグラフやECサイトにおける購入履歴等で利用されています。
Neo4jは、adidasや、eBay等で実際に運用されている最も人気のあるグラフ型データベースの一つです。
それでは早速動かしてみましょう!
インストール
公式
open http://neo4j.com/download-thanks/?edition=community open ~/Downloads/neo4j-community_macos_2_3_1.dmg open /Applications/Neo4j\ Community\ Edition.app/
brew
brew install neo4j
起動
neo4j start >> Starting Neo4j Server...WARNING: not changing user >> process [47123]... waiting for server to be ready.... OK. >> http://localhost:7474/ is ready.
Macであれば、ハマリポイントもほぼなくインストールできます。
起動と同時に管理ツールが http://localhost:7474
立ち上がります。
初期設定
open http://localhost:7474
初期ユーザー(neo4j/neo4j)でログイン後、パスワードを設定します。
早速データをいれてみる
Neo4jでは、3つのコア要素を元にデータを構築します。
Nodes - graph data records
グラフの基本となる要素。
Relationships - connect nodes
AさんはBさんを知っている
といったグラフ構造における 知っている
の部分。
矢印で表される事が多い。
Properties - named data values
Aさん(所属: 開発部) はBさん(所属: 経理部)を知っている
というグラフ構造における所属: 開発部
の部分。
Node/Relationshipに紐付けられる。
Nodeの追加
Aさん(所属: 開発部) はBさん(所属: 経理部)を知っている
というデータを登録してみます。
まずは、Aさん(所属: 開発部)
とBさん(所属: 経理部)
を登録。
Neo4jではsql likeな Cypher を使用して処理を記述します。
CREATE (a_san:Person { name: "Aさん", 所属: "開発部" }), (b_san:Person { name: "Bさん", 所属: "経理部" }) RETURN a_san, b_san;
続いて、AさんはBさんを知っている
という関係性を追加します
MATCH (a_san: Person), (b_san: Person) WHERE a_san.name = "Aさん" AND b_san.name = "Bさん" CREATE (a_san)-[r:知っている]->(b_san) RETURN r;
とても簡単ですね!
12.1. Create - - The Neo4j Manual v2.3.1
検索
全nodeの検索
MATCH (n) RETURN n;
Aさんが知っている人(Bさん)
MATCH (a_san: Person { name: "Aさん" })-[r:知っている]->(Aさんが知っている人:Person) RETURN a_san, Aさんが知っている人;
Aさんを知っている人(該当なし)
MATCH (Aさんを知っている人:Person)-[r:知っている]->(a_san: Person { name: "Aさん" }) RETURN Aさんを知っている人, a_san;
11.1. Match - - The Neo4j Manual v2.3.1
もう少し大きなグラフで遊んでみる
:play movie graph
上記コマンドを実行後、表示されるチュートリアルにそってデータをインポートすると、映画に関するグラフが作られれます。
このグラフから、キアヌ・リーブスさんに関連する情報をいくつか抽出してみます。
1999年に公開されたマトリックスに出演していた俳優はこちら。
MATCH (matrix: Movie { released: 1999, title: "The Matrix" })<-[:ACTED_IN]-(actors) RETURN actors, matrix;
続いて、 キアヌ・リーブス(Keanu Reeves) さんが出演している映画とその映画に出演している俳優はこちら。
MATCH (keanu:Person { name: "Keanu Reeves"}) -[:ACTED_IN]->(movies)<-[:ACTED_IN]-(actors) RETURN keanu, movies, actors;
マトリックスシリーズや、北野武さんも出演しているJohnny Mnemonic
などが見つかりました。
複雑なクエリになっても直感的に記述できるcypher
最高ですね!!
最後に、キアヌ・リーブスさんと、過去共演経験のないトム・ハンクスさんの最短経路を調べます。全てのものごとは6ステップ以内に繋がっているという仮説(参考: 六次の隔たり)とも言われますが、映画界ではどうなっているでしょうか。
match (keanu: Person { name: "Keanu Reeves" }), (tom: Person {name: "Tom Hanks" }), path=allShortestPaths((keanu)-[*]-(tom)) return keanu, tom, path;
4次の隔たりで、5通りの経路があることがわかりました。
終わりに
今回は簡単なソーシャルグラフの例でしたが、購入履歴を元にしたこちらの商品を購入したユーザーはこんな商品を買っています
といったレコメンドや、不正購入のあぶりだし、複数ユーザー共通動作のあぶり出し、パターン化など夢が広がりますね!
何より、Neo4jの管理ツール上のチュートリアルやドキュメントが開発者向けに最適化されていて、楽しく学習することができました。 日本語の書籍も出版されてきている ので、国内での動向にも注目です。
最後に
マネーフォワードでは、気になったものはすぐに試してしまう、フットワークの軽いエンジニアを募集しています。 ご応募お待ちしています。
【採用サイト】 ■『マネーフォワード採用サイト』 https://recruit.moneyforward.com/ ■『Wantedly』 https://www.wantedly.com/companies/moneyforward
【公開カレンダー】 ■マネーフォワード公開カレンダー
【プロダクト一覧】 ■家計簿アプリ・クラウド家計簿ソフト『マネーフォワード』 https://moneyforward.com/ ■家計簿アプリ・クラウド家計簿ソフト『マネーフォワード』 iPhone,iPad ■家計簿アプリ・クラウド家計簿ソフト『マネーフォワード』 Android ■クラウド型会計ソフト『MFクラウド会計』 https://biz.moneyforward.com/ ■クラウド型請求書管理ソフト『MFクラウド請求書』 https://invoice.moneyforward.com/ ■クラウド型給与計算ソフト『MFクラウド給与』 https://biz.moneyforward.com/payroll ■消込ソフト・システム『MFクラウド消込』 https://biz.moneyforward.com/reconciliation/ ■マイナンバー対応『MFクラウドマイナンバー』 https://biz.moneyforward.com/mynumber