リレーションシップテーブルから頂点とエッジをロードすることで、グラフをロードできます。
前提条件
特権アカウントを使用して、
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_id と end_node_id 値が含まれていることを確認してください。start_node_id および end_node_id 値は、頂点リレーションシップテーブルの node_id 値と一致している必要があります。エッジリレーションシップテーブルでは、start_node_id と end_node_id を除くすべてのフィールドが頂点プロパティとしてロードされます。
例
次の例は、SQL 文を実行してリレーションシップテーブルから単純なグラフをロードする方法を示しています。
基本データを準備します。
対応するリレーションシップテーブルを作成し、テストデータを挿入します。
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');グラフとラベルを作成します。
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'というエッジラベルを作成
リレーションシップテーブルからグラフをロードします。
頂点をロードします。
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)エッジをロードします。
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)