グラフデータベース「neo4j」の 導入の導入

Post on 12-Jun-2015

11.967 Views

Category:

Technology

4 Downloads

Preview:

Click to see full reader

TRANSCRIPT

グラフデータベース「Neo4j」の導入の導入

@who_you_me第3回 「はじめてのパターン認識」 読書会

2013/07/16

An Introductory Introduction to a Graph Database - Neo4j

お前誰よ

Twitter: @who_you_me

職業: 某ISPではたらくネットワークエンジニア

好きな言語: Python

最近好きになってきた言語: Ruby

興味がある言語: Haskell

はじパタの前身の前身(?)「TokyoSNA」主催

お前誰よ

Twitter: @who_you_me

職業: 某ISPではたらくネットワークエンジニア

好きな言語: Python

最近好きになってきた言語: Ruby

興味がある言語: Haskell

はじパタの前身の前身(?)「TokyoSNA」主催

(すべての元凶!?)

前提

・グラフDBというものがこの世に存在すること

・グラフDBってざっくりこんな感じだよ、ってこと

以上2点を知ってもらうことが目的です。

高度な話はしません(というか、できません)。

はじめに

はじパタは、ATNDを使っています

2013年7月現在

12,000イベント90,000ユーザー

270,000の「参加データ」(一人平均3イベントに参加)

はじパタ参加者なら、

「このデータ使って、何か面白いことできそう」

って思うよね?

幸いにして、

ATNDはAPIを提供しているので、

ガシガシ叩きまくれば全データ取ってこれます(リクルートさんごめんなさい、、、)

みなさん

取ってきたデータ、

どうやって保存しますか?

DBに入れますよね?

どのDB使いますか?

DBの選択肢

・信頼と実績のRDB

・新進気鋭のNoSQL

DBの選択肢

・信頼と実績のRDB

・新進気鋭のNoSQL

・第三の選択肢、GraphDB

1. GraphDBってなに?

・リレーショナル

・ドキュメント指向

・列指向

・KVS (Key-Value Store)

・グラフ

これらの違いってなに?

「現実をどうやってモデル化するか」

その方法に各DBの違いがあります

RDBならこうやってモデル化

あってるよね、、、?

ドキュメント指向ならこうやってモデル化

{ "title": "第3回 「はじめてのパターン認識」 読書会", "accepted": 36, "limit": 50, "waiting": 0, "event_id": 41119, "event_url": "http://atnd.org/events/41119", "users": [ { "nickname": "Prunus1350", "status": 1, "user_id": 120155, "twitter_id": "Prunus1350" }, { "nickname": "millionsmile", "status": 1, "user_id": 75357, "twitter_id": "millionsmile" }, { "nickname": "kmiyachi1024", "status": 1, "user_id": 35283, "twitter_id": "kmiyachi1024" }, ......},

{ "title": "日本Androidの会秋葉原支部ロボット部 第16回勉強会", "accepted": 10, "limit": 15, "waiting": 0, "event_id": 41118, ......},

......

うーん、、、

これって、

既に訓練されてしまっている

我々ならともかく

おばあちゃんが見て

理解できるかな?

コンピューターおばあちゃんなら別ですが、、、

event_id: 41119title: はじパタ第三回

event_id: 29767title: TokyoSNA #1

こうやって、イベントがあって

event_id: 41119title: はじパタ第三回

event_id: 29767title: TokyoSNA #1

user_id: 120155nickname: Prunus1350

user_id: 104457nickname: who_you_me

user_id: 75357nickname: millionsmile

ユーザーがいて

event_id: 41119title: はじパタ第三回

event_id: 29767title: TokyoSNA #1

user_id: 120155nickname: Prunus1350

user_id: 104457nickname: who_you_me

user_id: 75357nickname: millionsmile

参加status: 1 参加

status: 1

参加status: 1 参加

status: 1 参加status: 1

参加してるイベントには、

線を引っ張る

event_id: 41119title: はじパタ第三回

event_id: 29767title: TokyoSNA #1

user_id: 120155nickname: Prunus1350

user_id: 104457nickname: who_you_me

user_id: 75357nickname: millionsmile

参加status: 1 参加

status: 1

参加status: 1 参加

status: 1 参加status: 1

この方が直観的で理解しやすいですよね?

そうです!

データをこうやって、

頂点(node)と辺(relation)で

モデル化するのが

GraphDBです!

event_id: 41119title: はじパタ第三回

user_id: 120155nickname: Prunus1350

参加status: 1

node(vertex)(entity)

relation(edge)(link)

property

・node

・node間の関係を表すrelation

・node, relationそれぞれにkey-valueで属性を付与するproperty

GraphDBの三要素

2. それって何がうれしいの?

データの表現が直観的(まあ、何が直観的かは人によるけどね、、、)

グラフのtraverseが

直観的に書ける&早い

traverseって何

http://www.alc.co.jp/

要は、グラフを走りまわって

何かを見つけること

例1 六次の隔たり

「友達の友達」を6回たどると、

世界中の誰にでも届くらしい!

・スモールワールド実験

・エルデシュ数

・ケビン・ベーコン数

・etc...

例2 乗り換え案内

新宿駅から押上駅へはどう行けばいい?http://www.tokyometro.jp/station/common/pdf/network1.pdf

どちらも、最短経路を求める問題

RDBやNoSQLの場合、

SQLやMapReduceだけで解くのは

困難なため、

アルゴリズムはプログラムに任せる

ことになると思います

Rならigraph

PythonならNetworkX

メモリに載り切らないぐらい

大量のデータだったらどうする、、、?

Giraphっていうフレームワークが

Hadoop上で使えるらしい!

一方で、Neo4jはDBの機能で

最短経路を求めることができます

ベンチマークした方がいました

http://tech-sketch.jp/2013/02/neo4j.html

圧倒的じゃないか、我が軍は

もひとつおまけ

「友達の友達」、「友達の友達の友達」、、、

をひたすら求める処理をRDBと比較

あえて言おう、カ○であると!

早いのはわかったけど

「直観的に書ける」のは本当かよ

本当です

そう、Cypherならね

クエリ言語Cypher

アスキーアートとパターンマッチによりグラフ

を探索できるクエリ言語

例えば、自分(who_you_me)とPrunus1350さん

が共通に出席した勉強会を探したければ、、、

START who_you_me = node:users(user_id="104457"), prunus = node:users(user_id="120155")MATCH (who_you_me) -[:ATTENDS]-> (event), (prunus) -[:ATTENDS]-> (event)RETURN event

なかなかよさげじゃないですか?

デモ

PCにNeo4jインストールして、

ATNDの全データ入れてみたので、

実際に見てみましょう

参考文献

『7つのデータベース 7つの世界』

『Graph Databases』

『Neo4j in Action』

以上、ご清聴ありがとうございました!

top related