グラフデータベース「neo4j」の 導入の導入(続き)-cypherの基本のキ-
TRANSCRIPT
グラフデータベース「Neo4j」の導入の導入(続き)
@who_you_me第4回 「はじめてのパターン認識」 読書会
2013/07/30
クエリ言語「Cypher」の基本のキ
お前誰よ
Twitter: @who_you_me
職業: 某ISPではたらくネットワークエンジニア
好きな言語: Python
趣味: アニメを観ること
はじパタの前身の前身(?)「TokyoSNA」主催
告知
http://www.cross-party.com/2014/
CROSSってなに
「ITに関わる」だけを共通点に、
技術も、年代も、所属もバラバラの人たちが集まって
語り合ったら面白いことが起こるんじゃね?
CROSSってなに
「ITに関わる」だけを共通点に、
技術も、年代も、所属もバラバラの人たちが集まって
語り合ったら面白いことが起こるんじゃね?
1,000人のエンジニアで集まって、語り合おう!
今回のテーマ
クロスでススム、クロスで変わる
ボランティアスタッフ募集
今度のCROSSでは新たに、ボランティアスタッフを募
集することになりました
・会場責任者
・場内スタッフ
・会場受付
スタッフ特典
・チケット(前回は3,000円)無料!
・スタッフTシャツ配布予定!
・パーティセッションではもちろん飲食自由!
申し込みはこちらからhttp://www.cross-party.com/2014/
本題
前回のおさらい詳しくは前回の資料を見てね
http://www.slideshare.net/who_you_me/neo4j-24294061
GraphDBとは?
データを頂点(node)と辺(relation)のモデルで保存するDB
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: はじパタ第三回
user_id: 120155nickname: Prunus1350
参加status: 1
node(vertex)(entity)
relation(edge)(link)
property
・node
・node間の関係を表すrelation
・node, relationそれぞれにkey-valueで属性を付与するproperty
GraphDBの三要素
モデルは分かったけど、実際のDB操作はどうやるのさ?
CreateReadUpdateDelete
ナウでヤングなクエリ言語 Cypher
いろいろ用意されていますが、(たぶん)最も推奨されいるのは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
直観的でしょ?
という訳で、Cypherについて
もうちょっと詳しく見ていきたいと思います
時間の都合で、
今回はCRUDのうちReadだけです
他も詳しく知りたい人は、ここやここを見てね
CypherのReadクエリの基本要素
・START
・MATCH
・WHERE
・RETURNSTART 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
START
グラフ探索の始点となる頂点/辺を特定して、
識別子(変数)に束縛
START who_you_me = node:users(user_id="104457")
頂点/辺の特定にはインデックスか、
自動で振られたIDを用いる
MATCH
アスキーアートでグラフを探索
必要な頂点/辺はパターンマッチで
変数に束縛できる
辺の向きを指定: (n) --> (m)
辺の向きを考慮しない: (n) --- (m)
深さを指定: (n) -[*1..6]-> (m)
MATCH (who_you_me) -[:ATTENDS]-> (event)
WHERE
検索条件を指定
SQLのWHEREとほとんど同じイメージ
WHERE event.title =~ '.*はじ.*パタ.*'
HAS(user.twitter_id)
event.capacity = 50
event.capacity <> 50
event.capacity <= 50 etc...
RETURN
結果として何を返せばいいか指定する
RETURN event
WHERE句とRETURN句では
関数も使えるよ!
Cypherで使える関数(一部)
・COUNT
・SUM
・AVG
・MAX
・MIN
・LENGTH
・TIMESTAMP
・ABS
・ROUND
・SQRT
・SIGN
・REPLACE
・UPPER
・LOWER
言い忘れてましたが、
MATCH句で変数に束縛されるのは
単一の頂点や辺ではなくて
それらの配列です
一般に、パターンにマッチする頂点や辺は複数あるからね
なので、Cypherには配列操作系の
関数も数多く用意されています
まあ、さっき出てきた関数も大半は「配列を引数に取る関数」だから配列操作系なんだけどねw
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なんだろう、、、?
実践
こうやってデータが保存されてるとして
「この勉強会に参加した人は
この勉強会にも参加しています」
をCypherで求めてみよう!
答え
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;
という訳で、
みんなもCypherで
素敵なGraphDBライフを
満喫しよう!
以上、ご清聴ありがとうございました!