Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

グラフデータベース「Neo4j」の 導入の導入(続き)-Cypherの基本のキ-

7,686 views

Published on

Published in: Technology
  • Be the first to comment

グラフデータベース「Neo4j」の 導入の導入(続き)-Cypherの基本のキ-

  1. 1. グラフデータベース「Neo4j」の 導入の導入(続き) @who_you_me 第4回 「はじめてのパターン認識」 読書会 2013/07/30 クエリ言語「Cypher」の基本のキ
  2. 2. お前誰よ Twitter: @who_you_me 職業: 某ISPではたらくネットワークエンジニア 好きな言語: Python 趣味: アニメを観ること はじパタの前身の前身(?)「TokyoSNA」主催
  3. 3. 告知
  4. 4. http://www.cross-party.com/2014/
  5. 5. CROSSってなに 「ITに関わる」だけを共通点に、 技術も、年代も、所属もバラバラの人たちが集まって 語り合ったら面白いことが起こるんじゃね?
  6. 6. CROSSってなに 「ITに関わる」だけを共通点に、 技術も、年代も、所属もバラバラの人たちが集まって 語り合ったら面白いことが起こるんじゃね? 1,000人のエンジニアで集まって、語り合おう!
  7. 7. 今回のテーマ
  8. 8. クロスでススム、 クロスで変わる
  9. 9. ボランティアスタッフ募集 今度のCROSSでは新たに、ボランティアスタッフを募 集することになりました ・会場責任者 ・場内スタッフ ・会場受付
  10. 10. スタッフ特典 ・チケット(前回は3,000円)無料! ・スタッフTシャツ配布予定! ・パーティセッションではもちろん飲食自由!
  11. 11. 申し込みはこちらから http://www.cross-party.com/2014/
  12. 12. 本題
  13. 13. 前回のおさらい 詳しくは前回の資料を見てね http://www.slideshare.net/who_you_me/neo4j-24294061
  14. 14. GraphDBとは? データを頂点(node)と辺(relation)のモデルで保存するDB 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
  15. 15. 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の三要素
  16. 16. モデルは分かったけど、 実際のDB操作はどうやるのさ? Create Read Update Delete
  17. 17. ナウでヤングなクエリ言語 Cypher いろいろ用意されていますが、 (たぶん)最も推奨されいるのはCypherです 特にロゴとかはないみたい、、、残念 (ここに貼りたかった)
  18. 18. Cypherとは アスキーアートとパターンマッチによりグラフ を探索できるクエリ言語 関数型の影響を割と受けてるような気がします (でも恐れないで!)
  19. 19. 例えば、こうやってデータを保存してたとして
  20. 20. 自分(who_you_me)とPrunus1350さんが 共通に出席した勉強会を探したければ、、、
  21. 21. 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
  22. 22. 直観的でしょ?
  23. 23. という訳で、Cypherについて もうちょっと詳しく見ていきたいと思います
  24. 24. 時間の都合で、 今回はCRUDのうちReadだけです 他も詳しく知りたい人は、ここやここを見てね
  25. 25. CypherのReadクエリの基本要素 ・START ・MATCH ・WHERE ・RETURN START who_you_me = node:users(user_id="104457"), prunus = node:users(user_id="120155") MATCH (who_you_me) -[:ATTENDS]-> (event), (prunus) -[:ATTENDS]-> (event) WHERE event.title =~ '.*はじ.*パタ.*' RETURN event
  26. 26. START グラフ探索の始点となる頂点/辺を特定して、 識別子(変数)に束縛 START who_you_me = node:users(user_id="104457") 頂点/辺の特定にはインデックスか、 自動で振られたIDを用いる
  27. 27. MATCH アスキーアートでグラフを探索 必要な頂点/辺はパターンマッチで 変数に束縛できる 辺の向きを指定: (n) --> (m) 辺の向きを考慮しない: (n) --- (m) 深さを指定: (n) -[*1..6]-> (m) MATCH (who_you_me) -[:ATTENDS]-> (event)
  28. 28. WHERE 検索条件を指定 SQLのWHEREとほとんど同じイメージ WHERE event.title =~ '.*はじ.*パタ.*' HAS(user.twitter_id) event.capacity = 50 event.capacity <> 50 event.capacity <= 50 etc...
  29. 29. RETURN 結果として何を返せばいいか指定する RETURN event
  30. 30. WHERE句とRETURN句では 関数も使えるよ!
  31. 31. Cypherで使える関数(一部) ・COUNT ・SUM ・AVG ・MAX ・MIN ・LENGTH ・TIMESTAMP ・ABS ・ROUND ・SQRT ・SIGN ・REPLACE ・UPPER ・LOWER
  32. 32. 言い忘れてましたが、 MATCH句で変数に束縛されるのは 単一の頂点や辺ではなくて それらの配列です 一般に、パターンにマッチする頂点や辺は複数あるからね
  33. 33. なので、Cypherには配列操作系の 関数も数多く用意されています まあ、さっき出てきた関数も大半は「配列を引数に取る関数」だから配列操作系なんだけどねw
  34. 34. Cypherで使える配列関数(一部) ・HEAD(coll) ・TAIL(coll) ・ALL(x IN coll WHERE HAS(x.prop)) ・ANY(x IN coll WHERE HAS(x.prop)) ・EXTRACT(x IN coll: x.prop) ・FILTER(x IN coll: x.prop <> {value}) ・REDUCE(x IN coll: x.prop <> {value}) なんでMAPじゃなくてEXTRACTなんだろう、、、?
  35. 35. 実践
  36. 36. こうやってデータが保存されてるとして
  37. 37. 「この勉強会に参加した人は この勉強会にも参加しています」 をCypherで求めてみよう!
  38. 38. 答え
  39. 39. START pajipata3 = node:events(event_id="41119") MATCH (user) -[:ATTENDS]-> (pajipata3), (user) -[:ATTENDS]-> (event) RETURN event.event_id, event.title, COUNT(event.event_id) ORDER BY COUNT(event.event_id) DESC;
  40. 40. 解説はここを見てね!
  41. 41. という訳で、 みんなもCypherで 素敵なGraphDBライフを 満喫しよう!
  42. 42. 以上、 ご清聴ありがとうございました!

×