Upgrade to Pro — share decks privately, control downloads, hide ads and more …

introduction neo4j

introduction neo4j

Kanazawa.rb #71 LT

Kunihiko Ito

July 21, 2018
Tweet

More Decks by Kunihiko Ito

Other Decks in Programming

Transcript

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

    View Slide

  2. はじめ
    まして

    View Slide

  3. Kanazawa.rb
    初参加です

    View Slide

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

    View Slide

  5. @kunitoo GitHub とか

    View Slide

  6. @kunitoo Twitter

    View Slide

  7. Neo4j
    の紹介

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  11. イメージ

    View Slide

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

    View Slide

  13. クエリ言語
    Cypher

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  20. 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:

    View Slide

  21. Neo4j Browser

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  25. 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

    View Slide

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

    View Slide

  27. 迷路の作成
    (?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

    View Slide

  28. 迷路グラフ

    View Slide

  29. 探索と距離
    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

    View Slide

  30. Enjoy
    Neo4j

    View Slide