neo4jさわってみた


グラフ・データベースとは

「ノード」「リレーション」「プロパティ」の三要素を用いて、ノード間の関係性をあらわすデータベース

ノード

ひとつひとつのエンティティ。人だったり物だったり、とにかくエンティティ。

リレーション

エッジとも呼ばれる。どのノードがどのノードにどんな関係をもっているかをあらわす

プロパティ

ノードやリレーションの属性をあらわす。

世界は表構造であらわすことは不可能ではないが、関係性をあらわすことに関してRDBは不向き
グラフ構造であらわすと、それぞれがどのようなもので、どれとどのような関係をもっているのかが明確に

二つの処理

参照系処理

あるノードとその周辺のノードの参照
プロパティパスによる参照
などなど演算系処理

演算系処理

スコアリングやランキング
コミュニティの検出
経路検索
レコメンド(User2Itemもitem2itemも)

neo4j試してみました。

CREATE (A:Person { name: "Aさん", 出身:"福岡" })

一番オーソドックスなクエリです。これで

name: "Aさん", 出身:"福岡"
というプロパティを持つAというノードができました。

東京出身のBさんもつくります。

CREATE (B:Person { name: "Bさん", 出身:"東京" })

つぎにリレーションを追加します。

MATCH (A: Person), (B: Person)
WHERE A.name = "Aさん" AND B.name = "Bさん"
CREATE (a_san)-[r:知っている]->(b_san)
RETURN r;

AさんがBさんを知っているというリレーションが追加されました。

ノードが多くなればなるほどUIはぐちゃぐちゃになりますが、RDBよりも表現できる幅は広くなります。

例としてスレンジャーシングスの登場人物の相関図です。

まとめ

関係性が重視されるデータを扱う際にはRDBよりも優れている。(時刻表アプリやマッチングアプリなど)
思ったより参照処理(JOINとかがないから?)
UIがかっこいいので使っていておもしろい