すべてのプロダクト
Search
ドキュメントセンター

PolarDB:グラフのロード

最終更新日:Jun 04, 2025

リレーションシップテーブルから頂点とエッジをロードすることで、グラフをロードできます。

前提条件

  • 特権アカウントを使用して、ganos_graph 拡張機能を作成します。

    説明
    • この拡張機能は AGE 関連の機能に依存しています。この拡張機能をインストールする前に、AGE 拡張機能を作成する必要があります。

    • 拡張機能の作成時に ERROR: invalid extension name: "ganos_graph" のようなエラーが発生した場合は、お問い合わせください

    CREATE EXTENSION IF NOT EXISTS ganos_graph; -- ganos_graph拡張機能が存在しない場合、作成します
  • グラフとラベルが作成されている。

  • 頂点は一度だけロードできます。頂点を複数回ロードすると、id 値が競合する可能性があります。

グラフのロード

対応するリレーションシップテーブルからグラフをロードするには、次の 2 つの関数を使用して頂点とエッジをロードする必要があります。

load_labels_from_table

この関数は、頂点リレーションシップテーブルから頂点をロードするために使用されます。

構文

load_labels_from_table('<graph_name>', -- グラフ名
                      '<label_name>', -- ラベル名
                      '<table_name>', -- テーブル名
                      '<node_id>' default 'id') -- ノードID、デフォルトは'id'

頂点リレーションシップテーブルでは、一意の node_id フィールドを除くすべてのフィールドが頂点プロパティとしてロードされます。

load_edges_from_table

この関数は、エッジリレーションシップテーブルからエッジをロードするために使用されます。

構文

load_edges_from_table('<graph_name>', -- グラフ名
                    '<label_name>', -- ラベル名
                    '<table_name>', -- テーブル名
                    '<start_node_label_name>', -- 開始ノードのラベル名
                    '<end_node_label_name>', -- 終了ノードのラベル名
                    '<start_node_id>' default 'from_id', -- 開始ノードID、デフォルトは'from_id'
                    '<end_node_id>' default 'to_id'); -- 終了ノードID、デフォルトは'to_id'

エッジリレーションシップテーブルに、エッジの接続関係を示す start_node_idend_node_id 値が含まれていることを確認してください。start_node_id および end_node_id 値は、頂点リレーションシップテーブルの node_id 値と一致している必要があります。エッジリレーションシップテーブルでは、start_node_idend_node_id を除くすべてのフィールドが頂点プロパティとしてロードされます。

次の例は、SQL 文を実行してリレーションシップテーブルから単純なグラフをロードする方法を示しています。

  1. 基本データを準備します。

    1. 対応するリレーションシップテーブルを作成し、テストデータを挿入します。

      CREATE TABLE public.v_user_raw(id integer, type text, uid text, name text, age integer); -- ユーザーデータのテーブルを作成
      INSERT INTO v_user_raw VALUES -- テストデータを挿入
      (1, 'A','U1', 'Alice', '33'),
      (2, 'B','U1', 'Bob', '21');
      
      CREATE TABLE public.v_product_raw(id integer, product_id text, price double precision); -- 商品データのテーブルを作成
      INSERT INTO v_product_raw VALUES -- テストデータを挿入
      (1, 'INAKLIDAS', '50'),
      (2, 'ENKUCLKSD', '80'),
      (3, 'IIUIHAKLS', '320'),
      (4, 'SDVDSUHEE', '340');
      
      CREATE TABLE public.e_own_raw(from_id integer, to_id integer, product_id text, buy_price text); -- 所有関係のテーブルを作成
      INSERT INTO e_own_raw VALUES -- テストデータを挿入
      (1, 1, 'INAKLIDAS', '45'),
      (2, 1, 'ENKUCLKSD', '70'),
      (2, 3, 'INAKLIDAS', '50'),
      (1, 4, 'SDVDSUHEE', '330');
    2. グラフとラベルを作成します。

      SELECT create_graph('toys'); -- 'toys'というグラフを作成
      SELECT create_vlabel('toys','v_user'); -- 'toys'グラフに'v_user'という頂点ラベルを作成
      SELECT create_vlabel('toys','v_product'); -- 'toys'グラフに'v_product'という頂点ラベルを作成
      SELECT create_elabel('toys','e_own'); -- 'toys'グラフに'e_own'というエッジラベルを作成
  2. リレーションシップテーブルからグラフをロードします。

    1. 頂点をロードします。

      SELECT load_labels_from_table('toys', 'v_user', 'v_user_raw', 'id'); -- 'v_user_raw'テーブルから'toys'グラフの'v_user'ラベルに頂点をロード
      SELECT load_labels_from_table('toys', 'v_product', 'v_product_raw', 'id'); -- 'v_product_raw'テーブルから'toys'グラフの'v_product'ラベルに頂点をロード

      次の文を実行して、グラフ内のすべての頂点をクエリします。

      SELECT * FROM cypher('toys', $$ -- 'toys'グラフに対してCypherクエリを実行
        MATCH (n) -- すべてのノード(n)にマッチ
        RETURN n -- ノード(n)を返す
      $$) AS (n agtype);

      出力例:

                                                                   n                                                              
      ----------------------------------------------------------------------------------------------------------------------------
       {"id": 844424930131969, "label": ["v_user"], "properties": {"age": 33, "uid": "U1", "name": "Alice", "type": "A"}}::vertex
       {"id": 844424930131970, "label": ["v_user"], "properties": {"age": 21, "uid": "U1", "name": "Bob", "type": "B"}}::vertex
       {"id": 1125899906842625, "label": ["v_product"], "properties": {"price": 50, "product_id": "INAKLIDAS"}}::vertex
       {"id": 1125899906842626, "label": ["v_product"], "properties": {"price": 80, "product_id": "ENKUCLKSD"}}::vertex
       {"id": 1125899906842627, "label": ["v_product"], "properties": {"price": 320, "product_id": "IIUIHAKLS"}}::vertex
       {"id": 1125899906842628, "label": ["v_product"], "properties": {"price": 340, "product_id": "SDVDSUHEE"}}::vertex
      (6 rows)
    2. エッジをロードします。

      SELECT load_edges_from_table('toys', 'e_own', 'e_own_raw', 'v_user', 'v_product'); -- 'e_own_raw'テーブルから'toys'グラフの'e_own'ラベルにエッジをロード。'v_user'と'v_product'は開始ノードと終了ノードのラベル

      次の文を実行して、グラフ内のすべてのエッジをクエリします。

      SELECT * FROM cypher('toys', $$ -- 'toys'グラフに対してCypherクエリを実行
        MATCH ()-[e:e_own]->() -- 'e_own'ラベルを持つすべてのエッジ(e)にマッチ
        RETURN e -- エッジ(e)を返す
      $$) AS (e agtype);

      出力例:

                                                                                          e                                                                                     
      --------------------------------------------------------------------------------------------------------------------------------------------------------------------------
       {"id": 1407374883553281, "label": "e_own", "end_id": 1125899906842625, "start_id": 844424930131969, "properties": {"buy_price": "45", "product_id": "INAKLIDAS"}}::edge
       {"id": 1407374883553282, "label": "e_own", "end_id": 1125899906842625, "start_id": 844424930131970, "properties": {"buy_price": "70", "product_id": "ENKUCLKSD"}}::edge
       {"id": 1407374883553283, "label": "e_own", "end_id": 1125899906842627, "start_id": 844424930131970, "properties": {"buy_price": "50", "product_id": "INAKLIDAS"}}::edge
       {"id": 1407374883553284, "label": "e_own", "end_id": 1125899906842628, "start_id": 844424930131969, "properties": {"buy_price": "330", "product_id": "SDVDSUHEE"}}::edge
      (4 rows)