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

N:Nツリー構造データにおけるグラフDB活用

 N:Nツリー構造データにおけるグラフDB活用

Yasuhiro Murata

July 21, 2022
Tweet

More Decks by Yasuhiro Murata

Other Decks in Technology

Transcript

  1. Copyright ©2022 by Future Corporation
    Future Con 2022
    N:Nツリー構造データにおける
    グラフDB活用

    View full-size slide

  2. Copyright ©2022 by Future Corporation
    はじめまして
    村田 靖拓 (むらた やすひろ)
    ● 新卒でFutureへ入社
    ● Future Value Group 所属
    ● フロントエンド畑で育ち、以後クラウドインフラベースでIoT案件に
    関わる
    ● CCoE : Google Cloud パートナーアライアンスリード
    ● テクマーケ : Future Tech Castパーソナリティ
    @famipapamart

    View full-size slide

  3. Copyright ©2022 by Future Corporation
    本日のお題は、

    View full-size slide

  4. Copyright ©2022 by Future Corporation
    N:Nなツリー構造データ
    の扱い方

    View full-size slide

  5. Copyright ©2022 by Future Corporation
    N:Nなツリー構造データ
    n 親、子がそれぞれN個・N階層に連なるデータを扱いたい。

    View full-size slide

  6. Copyright ©2022 by Future Corporation
    なぜ?

    View full-size slide

  7. Copyright ©2022 by Future Corporation
    N:Nなツリー構造データを扱いたいケース
    n 工場IoTにて、部品の繋がりを可視化する際など。
    部品
    F
    G
    E
    A
    B
    D
    H
    I
    K
    L
    M
    J
    C
    親部品 子部品

    View full-size slide

  8. Copyright ©2022 by Future Corporation
    よくあるアプローチ例

    View full-size slide

  9. Copyright ©2022 by Future Corporation
    よくあるアプローチ例
    n 隣接リスト
    n 閉包テーブル

    View full-size slide

  10. Copyright ©2022 by Future Corporation
    よくあるアプローチ – 隣接リスト
    n 「自身の親(あるいは子)は誰か」の情報をそれぞれ保有する。
    部品ID 親ID ・・・
    A - ・・・
    B - ・・・
    C A ・・・
    C B ・・・
    D - ・・・
    E D ・・・
    F C ・・・
    F E ・・・
    場合により
    パフォーマンス懸念あり?!

    View full-size slide

  11. Copyright ©2022 by Future Corporation
    よくあるアプローチ – 閉包テーブル
    n 「先祖 – 子孫」の関係性情報を別途保有する。
    先祖ID 子孫ID
    A C
    A F
    A G
    ・・・ ・・・
    E F
    E G
    E H
    ・・・ ・・・
    E M
    “経路”が取得できるわけじゃない

    View full-size slide

  12. Copyright ©2022 by Future Corporation
    グラフDB

    View full-size slide

  13. Copyright ©2022 by Future Corporation

    View full-size slide

  14. Copyright ©2022 by Future Corporation
    なぜ?

    View full-size slide

  15. Copyright ©2022 by Future Corporation
    部品間の関係性
    を表現したい

    View full-size slide

  16. Copyright ©2022 by Future Corporation
    実際にやってみた

    View full-size slide

  17. Copyright ©2022 by Future Corporation
    まずはグラフDBの準備

    View full-size slide

  18. Copyright ©2022 by Future Corporation
    グラフDBの準備
    n 情報量の多いNeo4jを選択。

    View full-size slide

  19. Copyright ©2022 by Future Corporation
    グラフDBの準備
    n AuraDB = Neo4jをマネージドで使える & 無料利用も可。

    View full-size slide

  20. Copyright ©2022 by Future Corporation
    グラフDBの準備
    n GUIからポチポチでインスタンスが作成される。

    View full-size slide

  21. Copyright ©2022 by Future Corporation
    グラフDBの準備
    n 作成したFreeインスタンスは以下のデータ量をサポート。
    – ノード:20万個
    – リレーション:40万個

    View full-size slide

  22. Copyright ©2022 by Future Corporation
    次にデータモデリング

    View full-size slide

  23. Copyright ©2022 by Future Corporation
    データモデリング
    n 表現したいのはこれ。

    View full-size slide

  24. Copyright ©2022 by Future Corporation
    データモデリング
    n ノードを「Product」、リレーションを「made_from」と定義。

    View full-size slide

  25. Copyright ©2022 by Future Corporation
    データモデリング
    n 「A → made_from → C」といった形で表現される。

    View full-size slide

  26. Copyright ©2022 by Future Corporation
    データの投入

    View full-size slide

  27. Copyright ©2022 by Future Corporation
    データの投入
    n Data Importerが用意されており、GUIから簡単にデータ投入可能。

    View full-size slide

  28. Copyright ©2022 by Future Corporation
    データの投入
    n リレーションも同様にマッピング定義を行い、『Run Import』。

    View full-size slide

  29. Copyright ©2022 by Future Corporation
    データの投入
    n 今回はとあるサンプルデータを投入。
    – ノード:約3.4万個
    – リレーション:20万個

    View full-size slide

  30. Copyright ©2022 by Future Corporation
    Cypherクエリによる検索

    View full-size slide

  31. Copyright ©2022 by Future Corporation
    Cypherクエリによる検索
    n さて、データは入った。(ビジュアルはカオス)

    View full-size slide

  32. Copyright ©2022 by Future Corporation
    Cypherクエリによる検索
    n 今回の目的は、「関連する先祖〜子孫までを一気に取得」すること。

    View full-size slide

  33. Copyright ©2022 by Future Corporation
    Cypherクエリによる検索
    n 経由地も含めた情報が欲しい = パス検索
    MATCH path=()-[:made_from*0..]->(p:Product)-[:made_from*0..]->()
    WHERE p.product_id = ”${target_id}"
    RETURN path;
    n 以下のpathを取得
    – A〜B
    – A〜B〜C
    – A〜B〜D
    – A〜B〜D〜E
    – B〜B
    – B〜C
    – B〜D
    – B〜D〜E
    経由地がとれた!けど...

    View full-size slide

  34. Copyright ©2022 by Future Corporation
    Cypherクエリによる検索
    n 本来欲しいのは、2つの経路だけ。
    n 欲しい経路
    – A〜B
    – A〜B〜C
    – A〜B〜D
    – A〜B〜D〜E
    – B〜B
    – B〜C
    – B〜D
    – B〜D〜E
    A B C
    D E

    View full-size slide

  35. Copyright ©2022 by Future Corporation
    Cypherクエリによる検索
    n それぞれが「末端」であることを担保できればよいはず。
    MATCH path=(x)-[:made_from*0..]->(p:Product)-[:made_from*0..]->(y)
    WHERE
    p.product_id = ”${target_id}"
    AND NOT EXISTS(()-[:made_from]->(x))
    AND NOT EXISTS((y)-[:made_from]->())
    RETURN path

    View full-size slide

  36. Copyright ©2022 by Future Corporation
    Cypherクエリによる検索
    n 無事に2つの経路のみ取得することに成功。
    n 取得できた経路
    – A〜B
    – A〜B〜C
    – A〜B〜D
    – A〜B〜D〜E
    – B〜B
    – B〜C
    – B〜D
    – B〜D〜E
    A B C
    D E

    View full-size slide

  37. Copyright ©2022 by Future Corporation
    Cypherクエリによる検索
    n 最大深度7のこんなデータ(54ノード、57リレーション)であっても...
    416の経路を1.7secで発見

    View full-size slide

  38. Copyright ©2022 by Future Corporation
    たのしい
    便利

    View full-size slide

  39. Copyright ©2022 by Future Corporation
    まとめ

    View full-size slide

  40. Copyright ©2022 by Future Corporation
    まとめ
    n N:Nのツリー構造データに対してグラフDBは有用
    n 経由地も含めた経路を簡単かつ素早く検索できる
    n たのしい 便利

    View full-size slide

  41. Copyright ©2022 by Future Corporation
    Fin.

    View full-size slide