SlideShare a Scribd company logo
1 of 65
Neoの世界へ
@shigure_onishi
自己紹介
- AWSエンジニア
- Ruby始めました
- Dockerとか
- 好きなサービス: S3
- 最近社内AWS勉強会始めた
- SecurityGroup大切だよ
アジェンダ
- 前回のおさらい
- 書き方
- アンチパターン
- 実装パターン
前回のおさらい
前回のおさらい
- 前回の状態を見せる
グラフの概念
- グラフ理論の起源
- 一筆書きの証明をすることで不可能を証明した
グラフデータベースとは?
- 情報と情報をつなぐ関係性を表現することができる
- インデックスなし隣接性
データベース内で繋がっているノードが
お互いを指している状態
- RDBでもグラフを表現できる
しかしそれはグラフデータベースではない
グラフデータベース
- Neo4j
- InfiniteGraph
- Sparksee
- AllegroGraph
- OrientDB
- Titan
- FlockDB
他のデータベースと比較
- RDBでさえも繋がりを表現するのは苦手
RDBは表としての繋がりを表現するのは得意
パフォーマンス
- RDB
全体のデータ量と一致件数によって決まる
O(m log n) = 処理速度
- グラフ
一致件数のみで決まる
O(n) = 処理速度
できないこと
- 全体に対して更新できない
UPDATE users SET point = point + 100;
- 集計とかできない(苦手)
SELECT SUM(point) FROM users;
使用例
- 路線図
- レコメンド
- 友達の友達
- ネットワーク構成
Neo4jとCypher
今日はここのお話
書き方
書き方(Node作成)
CREATE句でデータの詳細記述して、RETURN句で返す
CREATE
(onishi:Ningen { # Ningen 識別子、カテゴリみたいなもの
name:"大西",
name_en:"Onishi",
nickname:"Shigu"
})
RETURN onishi;
書き方(Node作成)
もうひとつ作ります。
RETURN句なくても作れる。(RETURN = SELECT句)
CREATE
(:Ningen {
name:"手塚",
name_en:"Tezuka",
nickname:"zuccahn"}
);
書き方(繋がりを作る)
MATCH = 変数定義、CREATEで繋がり形式を表現
MATCH
(ningen1:Ningen { name_en: 'Onishi'}),
(ningen2:Ningen { name_en: 'Tezuka'})
CREATE
(ningen1)-[:SENPAI {name:'senpai'}]->(ningen2)
RETURN
ningen1, ningen2
書き方(繋がりを探す)
MATCHで繋がりのパターンを記述しWHEREで絞る
MATCH
(kouhai) -[:SENPAI]-> (senpai)
WHERE
kouhai.name = ‘大西’
RETURN
kouhai, senpai
書き方(繋がりを探す)
書き方(Nodeを増やす)
CREATE
(kojima:Ningen {
name:"小島",
name_en:"Kojima",
nickname:"Kozyty"}
),
(kagaya:Ningen {
name:"加賀谷",
name_en:"Kagaya",
nickname:"Violetyk"}
);
書き方(繋がりも増やす)
MATCH
(ningen1:Ningen { name_en: 'Tezuka'}),
(ningen2:Ningen { name_en: 'Kojima'}),
(ningen3:Ningen { name_en: 'Kagaya'})
CREATE
(ningen1)-[:SENPAI {name:'senpai'}]->(ningen2),
(ningen2)-[:SENPAI {name:'senpai'}]->(ningen3)
RETURN
ningen1, ningen2, ningen3
書き方(繋がりも増やす)
書き方(検索パターン、距離の指定)
MATCH
(kouhai) -[:SENPAI*2]-> (senpai)
WHERE
kouhai.name = ‘大西’
RETURN
kouhai, senpai
書き方(検索パターン、距離の指定)
書き方(検索パターン、距離の指定)
- [:SENPAI*2] #自分からSENPAIの関係で二つ先の人
- [:SENPAI*1..2] # 自分からSENPAIの関係で1~2先の人
- [:SENPAI*] # いくつでもOK
書き方(検索パターン、関係)
MATCH
(kouhai) -[:SENPAI]-> (senpai1) -[:SENPAI]-> (senpai2)
WHERE
kouhai.name = ‘大西’
RETURN
kouhai, senpai1, senpai2
書き方(検索パターン、関係)
書き方(検索パターン、関係)
- 連結
(kouhai) -[:SENPAI]-> (senpai1) -[:SENPAI]-> (senpai2)
- 関係指定なし、関係を取得するパターン
MATCH
(kouhai) -[r1]-> (senpai1) -[r2]-> (senpai2)
WHERE kouhai.name = ‘大西’
RETURN r1, r2
書き方(検索パターン、関係)
書き方(検索パターン、関係)
- OR
(ningen1) -[:SENPAI | :KOUHAI]-> (ningen2)
- 条件指定
(ningen1) -[:SENPAI {pattern: ‘age’}]-> (ningen2)
- 反対も書ける
(ningen2) <-[:SENPAI]- (ningen1) - [:KOUHAI] -> (ningen3)
書き方(検索パターン、関係も距離も指定なし)
- 全パターンHitする
MATCH
(kouhai) -[r*]-> (senpai)
WHERE
kouhai.name = ‘大西’
RETURN
kouhai, senpai, r
書き方(検索パターン、関係も距離も指定なし)
アンチパターン
アンチパターン
- 双方を全く同じ関係で繋ぐ
- つながりは厳密に言えば双方繋がり方が違う
友達申請した人と、申請された人
電車の上りと下り
- 表現したいものが表現できなくなることがある
アンチパターン
- 何かに使いそうだからとりあえず繋がり作っとこう
- 実行計画がないものは作らない
RDBとかと違って表現したいものだけを必ず作る
パフォーマンスの低下に繋がる
大体本当に表現したかったものではない
アンチパターン
- メールで学ぶ正しい関係
- 登場人物3人
- TOとCCでメール送る
- TOで送られた人が返信する
アンチパターン
- 繋がりは正確に (これはダメなパターン)
アンチパターン
- 繋がりは正確に (正解のパターン)
アンチパターン
- 返信はメールに対して関係を持っている
実装パターン
実装パターン
- emosiというサービスがありました
- ネガティブな投稿をした人に、ポジティブな投稿で他
の人が返すサービス
- その行動でネガティブだった人がポジティブになり、
他のネガティブな人をポジティブにしていく
実装パターン
誰かがネガティブを投稿しました(アクション)
実装パターン
誰かが反応しました(リアクション)
実装パターン
左でアクションしてた人が、今度はリアクションしている
実装パターン
こういった関係がずっと続く
実装パターン
これって幸せにしたことにならない?
実装パターン
もっと言えばこうだよね
実装パターン
リアクション二つもらうこともあるよね
emosiとは?
- これが世界平和、世界はひとつで繋がる
- 円環の理を表現したい
始まりと終わりが永遠と続く運命
設計の問題
- SQL書けない
- JOINのJOINのJOINのJOIN?
それデータ件数増えても同じこと言えんの?
サービスの問題
- 繋がるのは人?
- アクションとリアクション?
サービスの問題
二度繋がる
サービスの問題
永遠に増え続けるし、3日立ってからReactionもらうとか
一番右の黄色の後についた
RDBで実装してみた
左のrelationカラムが今までの経路をJSONで保存
右のrelation_usersが今まで繋がったユーザーの経路
設計の問題
- よくわからない
- 表現するために機能を制限した
- なんとなく表現できたものがこれだったからこの設計
にした
なんか動いてる!
プアマンズ・リレーションエンジン
(貧者の関係エンジン)
Neo4jで実装してみた
Neo4jで実装してみた
Neo4jで実装してみた
アクションのIDを指定して
PositiveかReで繋がってるものを2まで取得
MATCH
(action) -[ r:Positive | :Re*2 ]-> (make)
WHERE
action.id = '2'
RETURN
action, r, make
Neo4jで実装してみた
Neo4jで実装してみた
MATCH
(make_prev)
- [r_prev:Positive|:Re*2] ->
(action)
- [r_next:Positive|:Re*2] ->
(make_next)
WHERE
action.id = '2'
表現できるわけないだろ、jk
無理とか決めつけていて
申し訳ございませんでした。
〜 Fin 〜

More Related Content

Viewers also liked

現実世界から学ぶ効率のいいサーバの使い方
現実世界から学ぶ効率のいいサーバの使い方現実世界から学ぶ効率のいいサーバの使い方
現実世界から学ぶ効率のいいサーバの使い方時雨 大西
 
アルゴリズム研究所 in nanapi
アルゴリズム研究所 in nanapiアルゴリズム研究所 in nanapi
アルゴリズム研究所 in nanapi時雨 大西
 
Pgunconf neo4j fdw
Pgunconf neo4j fdwPgunconf neo4j fdw
Pgunconf neo4j fdwToshi Harada
 
WebGLとvideoを組み合わせるおもしろい
WebGLとvideoを組み合わせるおもしろいWebGLとvideoを組み合わせるおもしろい
WebGLとvideoを組み合わせるおもしろいHiroyuki Anai
 
20150520 lt-neo4j勉強会-neofj fdw
20150520 lt-neo4j勉強会-neofj fdw20150520 lt-neo4j勉強会-neofj fdw
20150520 lt-neo4j勉強会-neofj fdwToshi Harada
 
チョコ溶かす奴
チョコ溶かす奴チョコ溶かす奴
チョコ溶かす奴翔 石井
 
Neo4j発表者募集
Neo4j発表者募集Neo4j発表者募集
Neo4j発表者募集洸平 土岐
 
neo4jを使ったブロックチェーンデータの解析
neo4jを使ったブロックチェーンデータの解析neo4jを使ったブロックチェーンデータの解析
neo4jを使ったブロックチェーンデータの解析shigeyuki azuchi
 
実務で役立つデータベースの活用法
実務で役立つデータベースの活用法実務で役立つデータベースの活用法
実務で役立つデータベースの活用法Soudai Sone
 
[db tech showcase Tokyo 2015] E27: Neo4jグラフデータベース by クリエーションライン株式会社 李昌桓
[db tech showcase Tokyo 2015] E27: Neo4jグラフデータベース by クリエーションライン株式会社 李昌桓[db tech showcase Tokyo 2015] E27: Neo4jグラフデータベース by クリエーションライン株式会社 李昌桓
[db tech showcase Tokyo 2015] E27: Neo4jグラフデータベース by クリエーションライン株式会社 李昌桓Insight Technology, Inc.
 
Neo4j の「データ操作プログラミング」から 「ビジュアライズ」まで
Neo4j の「データ操作プログラミング」から 「ビジュアライズ」までNeo4j の「データ操作プログラミング」から 「ビジュアライズ」まで
Neo4j の「データ操作プログラミング」から 「ビジュアライズ」までKeiichiro Seida
 
Scala Warrior and type-safe front-end development with Scala.js
Scala Warrior and type-safe front-end development with Scala.jsScala Warrior and type-safe front-end development with Scala.js
Scala Warrior and type-safe front-end development with Scala.jstakezoe
 

Viewers also liked (12)

現実世界から学ぶ効率のいいサーバの使い方
現実世界から学ぶ効率のいいサーバの使い方現実世界から学ぶ効率のいいサーバの使い方
現実世界から学ぶ効率のいいサーバの使い方
 
アルゴリズム研究所 in nanapi
アルゴリズム研究所 in nanapiアルゴリズム研究所 in nanapi
アルゴリズム研究所 in nanapi
 
Pgunconf neo4j fdw
Pgunconf neo4j fdwPgunconf neo4j fdw
Pgunconf neo4j fdw
 
WebGLとvideoを組み合わせるおもしろい
WebGLとvideoを組み合わせるおもしろいWebGLとvideoを組み合わせるおもしろい
WebGLとvideoを組み合わせるおもしろい
 
20150520 lt-neo4j勉強会-neofj fdw
20150520 lt-neo4j勉強会-neofj fdw20150520 lt-neo4j勉強会-neofj fdw
20150520 lt-neo4j勉強会-neofj fdw
 
チョコ溶かす奴
チョコ溶かす奴チョコ溶かす奴
チョコ溶かす奴
 
Neo4j発表者募集
Neo4j発表者募集Neo4j発表者募集
Neo4j発表者募集
 
neo4jを使ったブロックチェーンデータの解析
neo4jを使ったブロックチェーンデータの解析neo4jを使ったブロックチェーンデータの解析
neo4jを使ったブロックチェーンデータの解析
 
実務で役立つデータベースの活用法
実務で役立つデータベースの活用法実務で役立つデータベースの活用法
実務で役立つデータベースの活用法
 
[db tech showcase Tokyo 2015] E27: Neo4jグラフデータベース by クリエーションライン株式会社 李昌桓
[db tech showcase Tokyo 2015] E27: Neo4jグラフデータベース by クリエーションライン株式会社 李昌桓[db tech showcase Tokyo 2015] E27: Neo4jグラフデータベース by クリエーションライン株式会社 李昌桓
[db tech showcase Tokyo 2015] E27: Neo4jグラフデータベース by クリエーションライン株式会社 李昌桓
 
Neo4j の「データ操作プログラミング」から 「ビジュアライズ」まで
Neo4j の「データ操作プログラミング」から 「ビジュアライズ」までNeo4j の「データ操作プログラミング」から 「ビジュアライズ」まで
Neo4j の「データ操作プログラミング」から 「ビジュアライズ」まで
 
Scala Warrior and type-safe front-end development with Scala.js
Scala Warrior and type-safe front-end development with Scala.jsScala Warrior and type-safe front-end development with Scala.js
Scala Warrior and type-safe front-end development with Scala.js
 

Similar to Neoの世界へ

[Deep Dive]Infra寄りのDevがお送りするRDS for Aurora徹底検証
[Deep Dive]Infra寄りのDevがお送りするRDS for Aurora徹底検証[Deep Dive]Infra寄りのDevがお送りするRDS for Aurora徹底検証
[Deep Dive]Infra寄りのDevがお送りするRDS for Aurora徹底検証Terui Masashi
 
RDBってなに?
RDBってなに?RDBってなに?
RDBってなに?Soudai Sone
 
BPStudy32 CouchDB 再入門
BPStudy32 CouchDB 再入門BPStudy32 CouchDB 再入門
BPStudy32 CouchDB 再入門Yohei Sasaki
 
第51回NDS PostgreSQLのデータ型 #nds51
第51回NDS PostgreSQLのデータ型 #nds51第51回NDS PostgreSQLのデータ型 #nds51
第51回NDS PostgreSQLのデータ型 #nds51civicpg
 
セマンテックウェブとRDFDB
セマンテックウェブとRDFDBセマンテックウェブとRDFDB
セマンテックウェブとRDFDBHirosuke Asano
 
Dot net+sql server tips
Dot net+sql server tipsDot net+sql server tips
Dot net+sql server tipsOda Shinsuke
 
Node-RED TIPS:functionノード間で関数を共有する方法
Node-RED TIPS:functionノード間で関数を共有する方法Node-RED TIPS:functionノード間で関数を共有する方法
Node-RED TIPS:functionノード間で関数を共有する方法Kazuki Saito
 
【2017早めの夏休み自由研究】SPAとサーバーレスについて
【2017早めの夏休み自由研究】SPAとサーバーレスについて【2017早めの夏休み自由研究】SPAとサーバーレスについて
【2017早めの夏休み自由研究】SPAとサーバーレスについてkazuki matsumura
 
Accelerating AdTech on AWS #AWSAdTechJP
Accelerating AdTech on AWS #AWSAdTechJPAccelerating AdTech on AWS #AWSAdTechJP
Accelerating AdTech on AWS #AWSAdTechJPEiji Shinohara
 
Cassandraとh baseの比較して入門するno sql
Cassandraとh baseの比較して入門するno sqlCassandraとh baseの比較して入門するno sql
Cassandraとh baseの比較して入門するno sqlYutuki r
 
インフラ系自主トレするならAWS
インフラ系自主トレするならAWSインフラ系自主トレするならAWS
インフラ系自主トレするならAWSYasuhiro Araki, Ph.D
 
Ruby で扱う LDAP のススメ
Ruby で扱う LDAP のススメRuby で扱う LDAP のススメ
Ruby で扱う LDAP のススメKazuaki Takase
 
Elasticsearch入門 pyfes 201207
Elasticsearch入門 pyfes 201207Elasticsearch入門 pyfes 201207
Elasticsearch入門 pyfes 201207Jun Ohtani
 
20110305_Code4Lib2011参加報告会:田辺浩介参加報告
20110305_Code4Lib2011参加報告会:田辺浩介参加報告20110305_Code4Lib2011参加報告会:田辺浩介参加報告
20110305_Code4Lib2011参加報告会:田辺浩介参加報告Code4Lib JAPAN
 
Rails SQL Injection Examplesの紹介
Rails SQL Injection Examplesの紹介Rails SQL Injection Examplesの紹介
Rails SQL Injection Examplesの紹介Hiroshi Tokumaru
 
Morning Session - AWS Serverless Ways
Morning Session - AWS Serverless WaysMorning Session - AWS Serverless Ways
Morning Session - AWS Serverless Waysakitsukada
 

Similar to Neoの世界へ (20)

[Deep Dive]Infra寄りのDevがお送りするRDS for Aurora徹底検証
[Deep Dive]Infra寄りのDevがお送りするRDS for Aurora徹底検証[Deep Dive]Infra寄りのDevがお送りするRDS for Aurora徹底検証
[Deep Dive]Infra寄りのDevがお送りするRDS for Aurora徹底検証
 
AWS re:Invent2017で見た AWSの強さとは
AWS re:Invent2017で見た AWSの強さとは AWS re:Invent2017で見た AWSの強さとは
AWS re:Invent2017で見た AWSの強さとは
 
RDBってなに?
RDBってなに?RDBってなに?
RDBってなに?
 
MongoDB
MongoDBMongoDB
MongoDB
 
BPStudy32 CouchDB 再入門
BPStudy32 CouchDB 再入門BPStudy32 CouchDB 再入門
BPStudy32 CouchDB 再入門
 
第51回NDS PostgreSQLのデータ型 #nds51
第51回NDS PostgreSQLのデータ型 #nds51第51回NDS PostgreSQLのデータ型 #nds51
第51回NDS PostgreSQLのデータ型 #nds51
 
セマンテックウェブとRDFDB
セマンテックウェブとRDFDBセマンテックウェブとRDFDB
セマンテックウェブとRDFDB
 
Dot net+sql server tips
Dot net+sql server tipsDot net+sql server tips
Dot net+sql server tips
 
Node-RED TIPS:functionノード間で関数を共有する方法
Node-RED TIPS:functionノード間で関数を共有する方法Node-RED TIPS:functionノード間で関数を共有する方法
Node-RED TIPS:functionノード間で関数を共有する方法
 
【2017早めの夏休み自由研究】SPAとサーバーレスについて
【2017早めの夏休み自由研究】SPAとサーバーレスについて【2017早めの夏休み自由研究】SPAとサーバーレスについて
【2017早めの夏休み自由研究】SPAとサーバーレスについて
 
Accelerating AdTech on AWS #AWSAdTechJP
Accelerating AdTech on AWS #AWSAdTechJPAccelerating AdTech on AWS #AWSAdTechJP
Accelerating AdTech on AWS #AWSAdTechJP
 
Cassandraとh baseの比較して入門するno sql
Cassandraとh baseの比較して入門するno sqlCassandraとh baseの比較して入門するno sql
Cassandraとh baseの比較して入門するno sql
 
About NoSQL
About NoSQLAbout NoSQL
About NoSQL
 
インフラ系自主トレするならAWS
インフラ系自主トレするならAWSインフラ系自主トレするならAWS
インフラ系自主トレするならAWS
 
Ruby で扱う LDAP のススメ
Ruby で扱う LDAP のススメRuby で扱う LDAP のススメ
Ruby で扱う LDAP のススメ
 
Elasticsearch入門 pyfes 201207
Elasticsearch入門 pyfes 201207Elasticsearch入門 pyfes 201207
Elasticsearch入門 pyfes 201207
 
20110305_Code4Lib2011参加報告会:田辺浩介参加報告
20110305_Code4Lib2011参加報告会:田辺浩介参加報告20110305_Code4Lib2011参加報告会:田辺浩介参加報告
20110305_Code4Lib2011参加報告会:田辺浩介参加報告
 
Rails SQL Injection Examplesの紹介
Rails SQL Injection Examplesの紹介Rails SQL Injection Examplesの紹介
Rails SQL Injection Examplesの紹介
 
Linked Open Dataとは
Linked Open DataとはLinked Open Dataとは
Linked Open Dataとは
 
Morning Session - AWS Serverless Ways
Morning Session - AWS Serverless WaysMorning Session - AWS Serverless Ways
Morning Session - AWS Serverless Ways
 

Neoの世界へ