Money Forward Developers Blog

株式会社マネーフォワード公式開発者向けブログです。技術や開発手法、イベント登壇などを発信します。サービスに関するご質問は、各サービス窓口までご連絡ください。

20230215130734

グラフデータベースNeo4jに超入門してみた

こんにちは。 今回は、巷で話題のグラフデータベース 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;

neo4j_1 Aさん/Bさん、2つのnodeが追加されました。

続いて、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;

neo4j_2

とても簡単ですね!

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

上記コマンドを実行後、表示されるチュートリアルにそってデータをインポートすると、映画に関するグラフが作られれます。

このグラフから、キアヌ・リーブスさんに関連する情報をいくつか抽出してみます。

neo4j_3

1999年に公開されたマトリックスに出演していた俳優はこちら。

MATCH (matrix: Movie { released: 1999, title: "The Matrix" })<-[:ACTED_IN]-(actors)
RETURN actors, matrix;

neo4j_4

続いて、 キアヌ・リーブス(Keanu Reeves) さんが出演している映画とその映画に出演している俳優はこちら。

MATCH (keanu:Person { name: "Keanu Reeves"}) -[:ACTED_IN]->(movies)<-[:ACTED_IN]-(actors)
RETURN keanu, movies, actors;

neo4j_5

マトリックスシリーズや、北野武さんも出演しているJohnny Mnemonicなどが見つかりました。 複雑なクエリになっても直感的に記述できるcypher 最高ですね!!

最後に、キアヌ・リーブスさんと、過去共演経験のないトム・ハンクスさんの最短経路を調べます。全てのものごとは6ステップ以内に繋がっているという仮説(参考: 六次の隔たり)とも言われますが、映画界ではどうなっているでしょうか。

match (keanu: Person { name: "Keanu Reeves" }), (tom: Person {name: "Tom Hanks" }),
path=allShortestPaths((keanu)-[*]-(tom))
return keanu, tom, path;

neo4j_6

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  

参考