Slide 1

Slide 1 text

Neo4j の紹介 Kunihiko Ito Kanazawa.rb Meetup #71 2018-07-21

Slide 2

Slide 2 text

はじめ まして

Slide 3

Slide 3 text

Kanazawa.rb 初参加です

Slide 4

Slide 4 text

p self 名前: 伊藤 邦彦 出身: 富山 在住: 2017年から富山 所属: ESM アジャイル事業部 仕事: [Rails, Neo4j, WebRTC]

Slide 5

Slide 5 text

@kunitoo GitHub とか

Slide 6

Slide 6 text

@kunitoo Twitter

Slide 7

Slide 7 text

Neo4j の紹介

Slide 8

Slide 8 text

Neo4j とは Neo4jはJavaで実装された、 オープンソースの最も人気の あるグラフデータベースであ る。 [cited from `wikipedia Neo4j']

Slide 9

Slide 9 text

グラフデータベースとは グラフ構造を扱うことのできる データベース

Slide 10

Slide 10 text

グラフ構造 ノードとノード間の連結関係を表 すエッジで構成されるデータ型

Slide 11

Slide 11 text

イメージ

Slide 12

Slide 12 text

どこで使える? ソーシャルグラフの構築 レコメンドエンジン

Slide 13

Slide 13 text

クエリ言語 Cypher

Slide 14

Slide 14 text

フォローしているユーザーの 取得 MATCH (me)-[follow:Follow]->(user) RETURN user

Slide 15

Slide 15 text

フォローユーザーのフォロー ユーザーまで取得 MATCH (me)-[:Follow]->(user)->[:Follow]->(user2) RETURN user2

Slide 16

Slide 16 text

フォローユーザーのフォロー ユーザーまで取得 MATCH (me)-[follow:Follow*..2]->(user) RETURN user

Slide 17

Slide 17 text

アスキーアートみたいにクエ リが書ける MATCH ()-[]->()->[]->()

Slide 18

Slide 18 text

使ってみ たくなり ました?

Slide 19

Slide 19 text

今すぐダウンロード https://neo4j.com/download/

Slide 20

Slide 20 text

docker-compose.yml docker-compose up して、 localhost:7474 にアクセス version: '3' services: neo4j: image: neo4j ports: - "7474:7474" - "7687:7687" environment: NEO4J_AUTH: "none" volumes: - neo4j:/data volumes: neo4j:

Slide 21

Slide 21 text

Neo4j Browser

Slide 22

Slide 22 text

Ruby で利用するには Neo4jrb https://github.com/neo4jrb/ neo4j

Slide 23

Slide 23 text

Neo4jrb require 'neo4j' Neo4j::Session.open(:server_db, 'http://localhost:7474') session = Neo4j::Session.current session.query.match('(me)-[:Follow]->(user)').return('user')

Slide 24

Slide 24 text

問題を解いてみる http://nabetani.sakura.ne.jp/hena/ orde20maze/

Slide 25

Slide 25 text

Neo4j を使った答え Neo4j::Session.open(:server_db, 'http://localhost:7474') conn = Neo4j::Session.current conn.query('MATCH (n) DETACH DELETE n') nodes = {} (?0..?9).each {|n| nodes[n] = Neo4j::Node.create({name: n}, :Pos) } (?A..?Z).each {|n| nodes[n] = Neo4j::Node.create({name: n}, :Pos) } [ [?0, ?1], [?2, ?3], [?3, ?4], [?4, ?5], [?7, ?8], [?8, ?9], [?9, ?A], [?C, ?D], [?F, ?G], [?J, ?K], [?K, ?L], [?L, ?M], [?P, ?Q], [?Q, ?R], [?S, ?T], [?U, ?V], [?V, ?W], [?Y, ?Z], [?0, ?6], [?6, ?C], [?C, ?I], [?I, ?O], [?1, ?7], [?J, ?P], [?P, ?V], [?E, ?K], [?3, ?9], [?9, ?F], [?R, ?X], [?G, ?M], [?M, ?S], [?S, ?Y], [?5, ?B], [?H, ?N], [?N, ?T] ].each do |l1, l2| n1 = nodes[l1] n2 = nodes[l2] Neo4j::Relationship.create(:line, n1, n2) end s, g = input.chars conn.query("MATCH (s:Pos{ name: '#{s}' }), (g:Pos{ name: '#{g}' }), p = shortestPath((s)-[:line*]-(g)) RETURN length(p) AS len").to_a.first.len.to_s

Slide 26

Slide 26 text

初期化 Neo4j::Session.open(:server_db, 'http://localhost:7474') conn = Neo4j::Session.current conn.query('MATCH (n) DETACH DELETE n')

Slide 27

Slide 27 text

迷路の作成 (?0..?9).each {|n| nodes[n] = Neo4j::Node.create({name: n}, :Pos) } (?A..?Z).each {|n| nodes[n] = Neo4j::Node.create({name: n}, :Pos) } [ [?0, ?1], [?2, ?3], [?3, ?4], [?4, ?5], [?7, ?8], [?8, ?9], [?9, ?A], [?C, ?D], [?F, ?G], [?J, ?K], [?K, ?L], [?L, ?M], [?P, ?Q], [?Q, ?R], [?S, ?T], [?U, ?V], [?V, ?W], [?Y, ?Z], [?0, ?6], [?6, ?C], [?C, ?I], [?I, ?O], [?1, ?7], [?J, ?P], [?P, ?V], [?E, ?K], [?3, ?9], [?9, ?F], [?R, ?X], [?G, ?M], [?M, ?S], [?S, ?Y], [?5, ?B], [?H, ?N], [?N, ?T] ].each do |l1, l2| n1 = nodes[l1] n2 = nodes[l2] Neo4j::Relationship.create(:line, n1, n2) end

Slide 28

Slide 28 text

迷路グラフ

Slide 29

Slide 29 text

探索と距離 s, g = input.chars conn.query(" MATCH (s:Pos{ name: '#{s}' }), (g:Pos{ name: '#{g}' }), p = shortestPath((s)-[:line*]-(g)) RETURN length(p) AS len" ).to_a.first.len.to_s

Slide 30

Slide 30 text

Enjoy Neo4j