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またはその他のタイプのデータと結合できます。

サンプル・データの設定

この例では、グラフの基礎となるデータベース表としてpersonsuniversityfriendshipsおよび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

関連項目: