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

42
グラフデータベース「Neo4j」の 導入の導入(続き) @who_you_me 第4回 「はじめてのパターン認識」 読書会 2013/07/30 クエリ言語「Cypher」の基本のキ

Upload: hisao-soyama

Post on 07-Jul-2015

4.206 views

Category:

Technology


5 download

TRANSCRIPT

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

グラフデータベース「Neo4j」の導入の導入(続き)

@who_you_me第4回 「はじめてのパターン認識」 読書会

2013/07/30

クエリ言語「Cypher」の基本のキ

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

お前誰よ

Twitter: @who_you_me

職業: 某ISPではたらくネットワークエンジニア

好きな言語: Python

趣味: アニメを観ること

はじパタの前身の前身(?)「TokyoSNA」主催

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

告知

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

http://www.cross-party.com/2014/

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

CROSSってなに

「ITに関わる」だけを共通点に、

技術も、年代も、所属もバラバラの人たちが集まって

語り合ったら面白いことが起こるんじゃね?

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

CROSSってなに

「ITに関わる」だけを共通点に、

技術も、年代も、所属もバラバラの人たちが集まって

語り合ったら面白いことが起こるんじゃね?

1,000人のエンジニアで集まって、語り合おう!

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

今回のテーマ

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

クロスでススム、クロスで変わる

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

ボランティアスタッフ募集

今度のCROSSでは新たに、ボランティアスタッフを募

集することになりました

・会場責任者

・場内スタッフ

・会場受付

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

スタッフ特典

・チケット(前回は3,000円)無料!

・スタッフTシャツ配布予定!

・パーティセッションではもちろん飲食自由!

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

申し込みはこちらからhttp://www.cross-party.com/2014/

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

本題

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

前回のおさらい詳しくは前回の資料を見てね

http://www.slideshare.net/who_you_me/neo4j-24294061

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

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

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

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の三要素

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

モデルは分かったけど、実際のDB操作はどうやるのさ?

CreateReadUpdateDelete

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

ナウでヤングなクエリ言語 Cypher

いろいろ用意されていますが、(たぶん)最も推奨されいるのはCypherです

特にロゴとかはないみたい、、、残念(ここに貼りたかった)

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

Cypherとは

アスキーアートとパターンマッチによりグラフ

を探索できるクエリ言語

関数型の影響を割と受けてるような気がします

(でも恐れないで!)

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

例えば、こうやってデータを保存してたとして

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

自分(who_you_me)とPrunus1350さんが

共通に出席した勉強会を探したければ、、、

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

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

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

直観的でしょ?

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

という訳で、Cypherについて

もうちょっと詳しく見ていきたいと思います

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

時間の都合で、

今回はCRUDのうちReadだけです

他も詳しく知りたい人は、ここやここを見てね

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

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

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

START

グラフ探索の始点となる頂点/辺を特定して、

識別子(変数)に束縛

START who_you_me = node:users(user_id="104457")

頂点/辺の特定にはインデックスか、

自動で振られたIDを用いる

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

MATCH

アスキーアートでグラフを探索

必要な頂点/辺はパターンマッチで

変数に束縛できる

辺の向きを指定: (n) --> (m)

辺の向きを考慮しない: (n) --- (m)

深さを指定: (n) -[*1..6]-> (m)

MATCH (who_you_me) -[:ATTENDS]-> (event)

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

WHERE

検索条件を指定

SQLのWHEREとほとんど同じイメージ

WHERE event.title =~ '.*はじ.*パタ.*'

HAS(user.twitter_id)

event.capacity = 50

event.capacity <> 50

event.capacity <= 50 etc...

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

RETURN

結果として何を返せばいいか指定する

RETURN event

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

WHERE句とRETURN句では

関数も使えるよ!

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

Cypherで使える関数(一部)

・COUNT

・SUM

・AVG

・MAX

・MIN

・LENGTH

・TIMESTAMP

・ABS

・ROUND

・SQRT

・SIGN

・REPLACE

・UPPER

・LOWER

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

言い忘れてましたが、

MATCH句で変数に束縛されるのは

単一の頂点や辺ではなくて

それらの配列です

一般に、パターンにマッチする頂点や辺は複数あるからね

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

なので、Cypherには配列操作系の

関数も数多く用意されています

まあ、さっき出てきた関数も大半は「配列を引数に取る関数」だから配列操作系なんだけどねw

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

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なんだろう、、、?

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

実践

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

こうやってデータが保存されてるとして

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

「この勉強会に参加した人は

この勉強会にも参加しています」

をCypherで求めてみよう!

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

答え

Page 39: グラフデータベース「Neo4j」の 導入の導入(続き)-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;

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

解説はここを見てね!

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

という訳で、

みんなもCypherで

素敵なGraphDBライフを

満喫しよう!

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

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