SlideShare a Scribd company logo
グラフデータベース「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: 41119
title: はじパタ第三回
event_id: 29767
title: TokyoSNA #1
こうやって、イベントがあって
event_id: 41119
title: はじパタ第三回
event_id: 29767
title: TokyoSNA #1
user_id: 120155
nickname: Prunus1350
user_id: 104457
nickname: who_you_me
user_id: 75357
nickname: millionsmile
ユーザーがいて
event_id: 41119
title: はじパタ第三回
event_id: 29767
title: TokyoSNA #1
user_id: 120155
nickname: Prunus1350
user_id: 104457
nickname: who_you_me
user_id: 75357
nickname: millionsmile
参加
status: 1 参加
status: 1
参加
status: 1 参加
status: 1 参加
status: 1
参加してるイベントには、
線を引っ張る
event_id: 41119
title: はじパタ第三回
event_id: 29767
title: TokyoSNA #1
user_id: 120155
nickname: Prunus1350
user_id: 104457
nickname: who_you_me
user_id: 75357
nickname: millionsmile
参加
status: 1 参加
status: 1
参加
status: 1 参加
status: 1 参加
status: 1
この方が直観的で
理解しやすいですよね?
そうです!
データをこうやって、
頂点(node)と辺(relation)で
モデル化するのが
GraphDBです!
event_id: 41119
title: はじパタ第三回
user_id: 120155
nickname: 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』
以上、
ご清聴ありがとうございました!

More Related Content

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