グラフデータベース「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: 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: はじパタ第三回
user_id: 120155
nickname: Prunus1350
参加
status: 1
node
(vertex)
(entity)
relation
(edge)
(link)
property
・node
・node間の関係を表すrelation
・node, relationそれぞれにkey-valueで属性を付与するproperty
GraphDBの三要素
モデルは分かったけど、
実際のDB操作はどうやるのさ?
Create
Read
Update
Delete
ナウでヤングなクエリ言語 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
・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
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ライフを
満喫しよう!
以上、
ご清聴ありがとうございました!

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