GRAPH_TABLE演算子
目的
GRAPH_TABLE
演算子は、FROM
句で表式として使用できます。指定されたグラフ・パターンに一致するグラフを入力として取得します。次に、一連のソリューションを表形式で出力します。
このトピックは、次のサブトピックで構成されています:
構文
セマンティクス
GRAPH_TABLE
演算子は、キーワードGRAPH_TABLE
で始まり、カッコの間に配置される次の3つの部分で構成されます:
-
graph_reference
: パターン一致を実行するグラフへの参照。グラフをGRAPH_TABLE
で参照するには、まずCREATE PROPERTY GRAPH
文を使用して作成する必要があります。 -
graph_pattern
: 頂点およびエッジ・パターンと検索条件で構成されるグラフ・パターン。パターンはグラフと照合され、一連のソリューションが取得されます。 -
graph_table_shape
: ソリューションを表形式で投影するCOLUMNS
句。
SQLのFROM
句には、任意の数のGRAPH_TABLE
演算子およびその他のタイプの表式を含めることができます。これにより、複数のグラフのデータを結合したり、グラフ・データを表形式、JSON、XMLまたはその他のタイプのデータと結合できます。
例
サンプル・データの設定
この例では、グラフの基礎となるデータベース表としてpersons
、university
、friendships
およびstudents
を使用して、プロパティ・グラフstudents_graph
を作成します。
次の文では、最初に必要な表を作成し、サンプル・データを入力します:
CREATE TABLE university ( id NUMBER GENERATED ALWAYS AS IDENTITY (START WITH 1 INCREMENT BY 1), name VARCHAR2(10), CONSTRAINT u_pk PRIMARY KEY (id)); INSERT INTO university (name) VALUES ('ABC'); INSERT INTO university (name) VALUES ('XYZ');
CREATE TABLE persons ( person_id NUMBER GENERATED ALWAYS AS IDENTITY (START WITH 1 INCREMENT BY 1), name VARCHAR2(10), birthdate DATE, height FLOAT DEFAULT ON NULL 0, person_data JSON, CONSTRAINT person_pk PRIMARY KEY (person_id) ); INSERT INTO persons (name, height, birthdate, person_data) VALUES ('John', 1.80, to_date('13/06/1963', 'DD/MM/YYYY'), '{"department":"IT","role":"Software Developer"}'); INSERT INTO persons (name, height, birthdate, person_data) VALUES ('Mary', 1.65, to_date('25/09/1982', 'DD/MM/YYYY'), '{"department":"HR","role":"HR Manager"}'); INSERT INTO persons (name, height, birthdate, person_data) VALUES ('Bob', 1.75, to_date('11/03/1966', 'DD/MM/YYYY'), '{"department":"IT","role":"Technical Consultant"}'); INSERT INTO persons (name, height, birthdate, person_data) VALUES ('Alice', 1.70, to_date('01/02/1987', 'DD/MM/YYYY'), '{"department":"HR","role":"HR Assistant"}');
CREATE TABLE students ( s_id NUMBER GENERATED ALWAYS AS IDENTITY (START WITH 1 INCREMENT BY 1), s_univ_id NUMBER, s_person_id NUMBER, subject VARCHAR2(10), height BINARY_DOUBLE, CONSTRAINT stud_pk PRIMARY KEY (s_id), CONSTRAINT stud_fk_person FOREIGN KEY (s_person_id) REFERENCES persons(person_id), CONSTRAINT stud_fk_univ FOREIGN KEY (s_univ_id) REFERENCES university(id) ); INSERT INTO students(s_univ_id, s_person_id,subject, height) VALUES (1,1,'Arts',1.80); INSERT INTO students(s_univ_id, s_person_id,subject, height) VALUES (1,3,'Music',1.65); INSERT INTO students(s_univ_id, s_person_id,subject, height) VALUES (2,2,'Math',1.75); INSERT INTO students(s_univ_id, s_person_id,subject, height) VALUES (2,4,'Science',1.70);
CREATE TABLE friendships ( friendship_id NUMBER GENERATED ALWAYS AS IDENTITY (START WITH 1 INCREMENT BY 1), person_a NUMBER, person_b NUMBER, meeting_date DATE, CONSTRAINT fk_person_a_id FOREIGN KEY (person_a) REFERENCES persons(person_id), CONSTRAINT fk_person_b_id FOREIGN KEY (person_b) REFERENCES persons(person_id), CONSTRAINT fs_pk PRIMARY KEY (friendship_id) ); INSERT INTO friendships (person_a, person_b, meeting_date) VALUES (1, 3, to_date('01/09/2000', 'DD/MM/YYYY')); INSERT INTO friendships (person_a, person_b, meeting_date) VALUES (2, 4, to_date('19/09/2000', 'DD/MM/YYYY')); INSERT INTO friendships (person_a, person_b, meeting_date) VALUES (2, 1, to_date('19/09/2000', 'DD/MM/YYYY')); INSERT INTO friendships (person_a, person_b, meeting_date) VALUES (3, 2, to_date('10/07/2001', 'DD/MM/YYYY'));
次の文は、表の上にグラフを作成します:
CREATE PROPERTY GRAPH students_graph VERTEX TABLES ( persons KEY (person_id) LABEL person PROPERTIES (person_id, name, birthdate AS dob) LABEL person_ht PROPERTIES (height), university KEY (id) ) EDGE TABLES ( friendships AS friends KEY (friendship_id) SOURCE KEY (person_a) REFERENCES persons(person_id) DESTINATION KEY (person_b) REFERENCES persons(person_id) PROPERTIES (friendship_id, meeting_date), students AS student_of SOURCE KEY (s_person_id) REFERENCES persons(person_id) DESTINATION KEY (s_univ_id) REFERENCES university(id) PROPERTIES (subject) );
次のグラフが作成されます:
例: GRAPH_TABLE問合せ
次の問合せは、グラフstudents_graph
のパターンを照合し、Johnという名前の個人の友人を検索します:
SELECT * FROM GRAPH_TABLE ( students_graph MATCH (a IS person) -[e IS friends]- (b IS person) WHERE a.name = 'John' COLUMNS (b.name) );
問合せでは次のようになります:
-
(a IS person)
は、personというラベルの頂点を照合し、ソリューションを変数a
にバインドする頂点パターンです。 -
-[e IS friends]-
は、friendsというラベルの受信エッジまたは送信エッジを照合し、ソリューションを変数e
にバインドするエッジ・パターンです。 -
(b IS person)
は、personというラベルの頂点を照合し、ソリューションを変数b
にバインドする別の頂点パターンです。 -
WHERE a.name = 'John'
は、変数aにバインドされた頂点からプロパティname
にアクセスし、値John
と比較する検索条件です。 -
COLUMNS (b.name)
は、出力表の一部として頂点b
のプロパティname
を戻すように指定します。
出力は次のとおりです:
NAME ---------- Mary Bob
関連項目:
-
プロパティ・グラフの定義および用語については、「CREATE PROPERTY GRAPH」を参照してください。