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

Post on 07-Jul-2015

4.206 Views

Category:

Technology

5 Downloads

Preview:

Click to see full reader

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ライフを

満喫しよう!

以上、ご清聴ありがとうございました!

top related