🌐

GraphDB のデータを RDB のデータに変換する

2024/01/08に公開

概要

GraphDB のデータを RDB のデータに変換するスクリプトを開発し、 OSS として GraphDB2RDB に公開致しました。
本稿では、 GraphDB2RDB の紹介を通じて GraphDB への取り組みの展望を紹介致します。

対象読者

以下のような方を想定しています。

  • GraphDB を用いた開発を行っている方
  • GraphDB に格納しているデータを RDB で表現したり解析したい方

デモ

demo

開発の動機

開発の動機は、 GraphDB を理解するための手段を増やしたいためです。

システム開発を行う上で RDB を採用するケースは多く、関連して RDB での開発に慣れ親しんだ開発者は多いと思います。
そのような方々が初めて GraphDB での開発に取り組む際、 RDB で同等に表現されたものがあればキャッチアップが捗るだろうと考え、 GraphDB2RDB を開発するに至りました。

機能

GraphDB のデータを解析し、 SQL を発行します。

SQL の発行機能

GraphDB2RDB を実行すると、4つの SQL が発行されます。

  1. "vertex" テーブルを作成する DDL
  2. "edge" テーブルを作成する DDL
  3. 全 vertex を "vertex" テーブルに格納する DML
  4. 全 edge を "edge" テーブルに格納する DML

1. "vertex" テーブルを作成する DDL

  • 全ての vertex を格納するためのテーブルを定義します。
  • カラムは以下が定義されます。
    • id
      • vertex を一意に特定する id です。
    • 全てのプロパティのキー
      • vertex に1つでも存在するプロパティがあれば、それをカラムとして表現します。

2. "edge" テーブルを作成する DDL

  • 全ての edge を格納するためのテーブルを定義します。
  • カラムは以下が定義されます。
    • in_v_id
      • vertex を一意に特定する id で、 vertex との関係を示します。
    • out_v_id
      • vertex を一意に特定する id で、 vertex との関係を示します。
    • 全てのプロパティのキー
      • edge に1つでも存在するプロパティがあれば、それをカラムとして表現します。

3. 全 vertex を "vertex" テーブルに格納する DML

  • 以下のようなデータ構造を例に考えます。
    • v[1] -a-> v[2] という関係があります。
    • v[1] には name, address の2つのプロパティが存在します。
    • v[2] には name, age の2つのプロパティが存在します。
  • このとき、下記のようなレコードを生成する DML が発行されます。
    • id が 1 で name, address が格納されるレコード
    • id が 2 で name, age が格納されるレコード

4. 全 edge を "edge" テーブルに格納する DML

  • 以下のようなデータ構造を例に考えます。
    • v[1] -e[1]-> v[2] という関係があります。
    • v[1] -e[2]-> v[3] という関係があります。
    • e[1], e[2] にはそれぞれ weight というプロパティが存在します。
  • このとき、下記のようなレコードを生成する DML が発行されます。
    • in_v_id が 2, out_v_id が 1 で、 weight が格納されるレコード
    • in_v_id が 3, out_v_id が 1 で、 weight が格納されるレコード

今後の展望

本稿の最後に、今後の展望として2点の目標を持っています。

  1. GraphDB2RDB の機能を充実させること
  2. GraphDB を理解するための手段を増やすこと

1. GraphDB2RDB の機能を充実させる

GraphDB2RDB のファーストリリース時、発行される SQL の情報量は最低限になっております。
例えば、下記のような要件は Future works として issues に記録し、 MVP には含めませんでした。

  • vertex/edge が持つ label ごとにテーブルを生成する
  • 全 vertex/edge に存在するプロパティは NOT NULL 属性を付与する

今後は発行される SQL の情報量の充実化を中心に、 issues に列挙されている課題解消を目指す所存です。

2. GraphDB を理解するための手段を増やす

今回は RDB での開発に慣れ親しんだ開発者に焦点を当てたスクリプトを開発しました。
今回のツール以外にも、別のアプローチで GraphDB への理解を容易にするスクリプトやシステムを開発したいと考えています。

終わりに

本稿では、 GraphDB2RDB の紹介を通じて GraphDB への取り組みの展望を紹介致しました。
GraphDB2RDB に不具合があったり追加要望がございましたら、 issues を投稿いただいたり、 Pull Request を提出いただけますと幸甚に存じます。

Discussion