4.5 SQLプロパティ・グラフでのJSONのサポート

SQLプロパティ・グラフを作成する場合は、簡易ドット表記法を使用して、JSONデータ型列に対してラベル・プロパティを定義できます。後でSQLグラフ問合せ内でこのプロパティにアクセスできます。

JSONデータ型列に対して定義されたラベル・プロパティは、次のような一般的なSQLスカラー・データ型です:
  • VARCHAR
  • NUMBER
  • BINARY_FLOAT
  • BINARY_DOUBLE
  • DATE
  • TIMESTAMP
  • .string().number().float().double().date().timestamp().binary()またはJSON_VALUE演算子を使用してSQLデータ型に変換された未加工のJSONデータ

したがって、JSONドット表記法またはJSON_VALUE演算子を使用して、JSONデータ内のスカラー値を選択し、SQLプロパティ・グラフ・ラベル・プロパティを定義できます。これは、SQLグラフ問合せ内のJSONデータ型列に対して定義されたラベル・プロパティにアクセスする場合にも適用されます。

例4-5 ラベル・プロパティのJSONドット表記法およびJSON式を使用したSQLプロパティ・グラフの定義

次の例では、JSONデータ型列に対して定義されたラベル・プロパティを含むSQLプロパティ・グラフを作成します。グラフは、「データベースでのサンプル・データの設定」で定義されているサンプル・データベース表(personsおよびfriendships)を使用して作成されます。この例では、JSONドット表記法とJSON_VALUE式の両方を使用して、ラベル・プロパティを定義します。

CREATE PROPERTY GRAPH friends_graph
  VERTEX TABLES (
      persons AS p KEY (person_id)
        LABEL person
          PROPERTIES (name, birthdate AS dob,
               p.hr_data.department.string() AS "works_in",
               JSON_VALUE(person_data, '$.role') AS "works_as")
  )
  EDGE TABLES (
      friends
        KEY (friendship_id)
        SOURCE KEY (person_a) REFERENCES p(person_id)
        DESTINATION KEY (person_b) REFERENCES p(person_id)
        PROPERTIES (meeting_date)
  );

グラフが正常に作成され、次の例に示すようにグラフを問い合せることができます:

例4-6 SQLプロパティ・グラフの問合せおよびSQL/JSON式として定義されたラベル・プロパティへのアクセス

次の例では、前の例で作成したSQLプロパティ・グラフを問い合せて、JSONデータ型列に対して作成されたラベル・プロパティにアクセスします。

SELECT * FROM GRAPH_TABLE (friends_graph
  MATCH
   (a IS person) -[e IS friends]-> (b IS person)
   COLUMNS (a.name AS a,
            a."works_in" AS "a_works_in",
            e.meeting_date,
            b.name AS b)
);

問合せの出力は次のようになります。

A     a_works_in MEETING_D B
----- ---------- --------- -----
John  IT         01-SEP-00 Bob
Mary  HR         19-SEP-00 Alice
Mary  HR         19-SEP-00 John
Bob   IT         10-JUL-01 Mary

例4-7 JSONデータ型のラベル・プロパティを使用したSQLプロパティ・グラフの作成および問合せ

次の例では、JSONデータ型のラベル・プロパティを使用してSQLプロパティ・グラフを作成します:

CREATE PROPERTY GRAPH friends_graph_new
  VERTEX TABLES (
      persons AS p KEY (person_id)
        LABEL person
          PROPERTIES (name, birthdate AS dob, p.hr_data AS "p_data")
  )
  EDGE TABLES (
      friends
        KEY (friendship_id)
        SOURCE KEY (person_a) REFERENCES p(person_id)
        DESTINATION KEY (person_b) REFERENCES p(person_id)
        PROPERTIES (meeting_date)
  );

その後、次のようにJSON_VALUE式を使用してグラフを問い合せることができます:

SELECT * FROM GRAPH_TABLE (friends_graph_new
  MATCH
   (a IS person WHERE JSON_VALUE(a."p_data", '$.department') = 'IT') -[e]-> (b)
   COLUMNS (a.name AS a, 
           a."p_data".department.string() AS "a_works_in",
           a."p_data".role.string() AS "a_works_as",
           e.meeting_date,
           b.name AS b)
  );
A     a_works_in a_works_as           MEETING_D B
----- ---------- -------------------- --------- -----
John  IT         Software Developer   01-SEP-00 Bob
Bob   IT         Technical Consultant 10-JUL-01 Mary