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

15,256 views
15,012 views

Published on

Published in: Technology

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

  1. 1. グラフデータベース「Neo4j」の 導入の導入 @who_you_me 第3回 「はじめてのパターン認識」 読書会 2013/07/16 An Introductory Introduction to a Graph Database - Neo4j
  2. 2. お前誰よ Twitter: @who_you_me 職業: 某ISPではたらくネットワークエンジニア 好きな言語: Python 最近好きになってきた言語: Ruby 興味がある言語: Haskell はじパタの前身の前身(?)「TokyoSNA」主催
  3. 3. お前誰よ Twitter: @who_you_me 職業: 某ISPではたらくネットワークエンジニア 好きな言語: Python 最近好きになってきた言語: Ruby 興味がある言語: Haskell はじパタの前身の前身(?)「TokyoSNA」主催 (すべての元凶!?)
  4. 4. 前提 ・グラフDBというものがこの世に存在すること ・グラフDBってざっくりこんな感じだよ、ってこと 以上2点を知ってもらうことが目的です。 高度な話はしません(というか、できません)。
  5. 5. はじめに
  6. 6. はじパタは、ATNDを使っています
  7. 7. 2013年7月現在 12,000イベント 90,000ユーザー 270,000の「参加データ」 (一人平均3イベントに参加)
  8. 8. はじパタ参加者なら、 「このデータ使って、何か面白いことできそう」 って思うよね?
  9. 9. 幸いにして、 ATNDはAPIを提供しているので、 ガシガシ叩きまくれば全データ取ってこれます (リクルートさんごめんなさい、、、)
  10. 10.
  11. 11. みなさん
  12. 12. 取ってきたデータ、 どうやって保存しますか?
  13. 13. DBに入れますよね?
  14. 14. どのDB使いますか?
  15. 15. DBの選択肢 ・信頼と実績のRDB ・新進気鋭のNoSQL
  16. 16. DBの選択肢 ・信頼と実績のRDB ・新進気鋭のNoSQL ・第三の選択肢、GraphDB
  17. 17. 1. GraphDBってなに?
  18. 18. ・リレーショナル ・ドキュメント指向 ・列指向 ・KVS (Key-Value Store) ・グラフ これらの違いってなに?
  19. 19. 「現実をどうやってモデル化するか」 その方法に各DBの違いがあります
  20. 20. RDBならこうやってモデル化 あってるよね、、、?
  21. 21. ドキュメント指向ならこうやってモデル化 { "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, ...... }, ......
  22. 22. うーん、、、
  23. 23. これって、 既に訓練されてしまっている 我々ならともかく
  24. 24. おばあちゃんが見て 理解できるかな?
  25. 25. コンピューターおばあちゃんなら別ですが、、、
  26. 26. event_id: 41119 title: はじパタ第三回 event_id: 29767 title: TokyoSNA #1 こうやって、イベントがあって
  27. 27. 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 ユーザーがいて
  28. 28. 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 参加してるイベントには、 線を引っ張る
  29. 29. 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 この方が直観的で 理解しやすいですよね?
  30. 30. そうです!
  31. 31. データをこうやって、 頂点(node)と辺(relation)で モデル化するのが
  32. 32. GraphDBです!
  33. 33. 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の三要素
  34. 34. 2. それって何がうれしいの?
  35. 35. データの表現が直観的 (まあ、何が直観的かは人によるけどね、、、)
  36. 36. グラフのtraverseが 直観的に書ける&早い
  37. 37. traverseって何
  38. 38. http://www.alc.co.jp/
  39. 39. 要は、グラフを走りまわって 何かを見つけること
  40. 40. 例1 六次の隔たり 「友達の友達」を6回たどると、 世界中の誰にでも届くらしい! ・スモールワールド実験 ・エルデシュ数 ・ケビン・ベーコン数 ・etc...
  41. 41. 例2 乗り換え案内 新宿駅から押上駅へはどう行けばいい? http://www.tokyometro.jp/station/common/pdf/network1.pdf
  42. 42. どちらも、最短経路を求める問題
  43. 43. RDBやNoSQLの場合、 SQLやMapReduceだけで解くのは 困難なため、
  44. 44. アルゴリズムはプログラムに任せる ことになると思います Rならigraph PythonならNetworkX
  45. 45. メモリに載り切らないぐらい 大量のデータだったらどうする、、、?
  46. 46. Giraphっていうフレームワークが Hadoop上で使えるらしい!
  47. 47. 一方で、Neo4jはDBの機能で 最短経路を求めることができます
  48. 48. ベンチマークした方がいました
  49. 49. http://tech-sketch.jp/2013/02/neo4j.html
  50. 50. 圧倒的じゃないか、我が軍は
  51. 51. もひとつおまけ
  52. 52. 「友達の友達」、「友達の友達の友達」、、、 をひたすら求める処理をRDBと比較
  53. 53. あえて言おう、カ○であると!
  54. 54. 早いのはわかったけど 「直観的に書ける」のは本当かよ
  55. 55. 本当です
  56. 56. そう、Cypherならね
  57. 57. クエリ言語Cypher アスキーアートとパターンマッチによりグラフ を探索できるクエリ言語 例えば、自分(who_you_me)とPrunus1350さん が共通に出席した勉強会を探したければ、、、
  58. 58. 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
  59. 59. なかなかよさげじゃないですか?
  60. 60. デモ
  61. 61. PCにNeo4jインストールして、 ATNDの全データ入れてみたので、 実際に見てみましょう
  62. 62. 参考文献
  63. 63. 『7つのデータベース 7つの世界』
  64. 64. 『Graph Databases』
  65. 65. 『Neo4j in Action』
  66. 66. 以上、 ご清聴ありがとうございました!

×