GRAPH_TABLEの値式

目的

GRAPH_TABLE内のWHERE句およびCOLUMNS句の値式は、GRAPH_TABLE以外の値式でサポートされているすべての機能を継承します。また、GRAPH_TABLE内では、次の値式を使用できます:

プロパティの参照

目的

プロパティ参照を使用すると、頂点とエッジのプロパティ値にアクセスできます。

構文

property_reference::=

セマンティクス

構文的には、プロパティ・アクセスは要素変数で、その後にドット(.)とプロパティの名前が続きます。プロパティ名は識別子であるため、二重引用符または引用符なしのどちらかになります。

要素パターンに指定されたラベル式によって、参照できるプロパティが決まります:

  • ラベル式が指定されていない場合は、グラフ内のすべてのプロパティを参照できます。

  • それ以外の場合で、ラベル式が指定された場合、ラベル式を満たすラベルに属するプロパティのみを参照できます。

複数のラベルがラベル式を満たすが、同じプロパティを定義し、データ型が異なる場合は、データ型が論理和互換である場合にのみ、このようなプロパティを参照できます。結果の値は、論理互換データ型になります。

複数のラベルがラベル式を満たし、一部のラベルが、他のラベルが持たない特定のプロパティを持っている場合でも、そのようなプロパティを参照できます。プロパティ参照では、プロパティを持たない頂点またはエッジに対してnull値が生成されます。

例1

次の問合せは、グラフ内のすべての個人の生年月日および大学をリストします:

SELECT GT.name, GT.birthday
FROM GRAPH_TABLE ( students_graph
  MATCH (p IS person|university)
  COLUMNS (p.name, p.dob AS birthday)
) GT
ORDER BY GT.birthday, GT.name;

個人JohnBobMaryAliceのみに生年月日がありますが、大学(ABCおよびXYZ)には生年月日がないため、大学に対してnull値が戻されます。出力には空の文字列として表示されます:

NAME       BIRTHDAY
---------- ---------
John       13-JUN-63
Bob        11-MAR-66
Mary       25-SEP-82
Alice      01-FEB-87
ABC
XYZ

頂点およびエッジIDファンクション

目的

頂点およびエッジIDファンクションを使用すると、グラフ要素の一意の識別子を取得できます。

構文

element_id_function::=

vertex_id_function::=

edge_id_function::=

element_reference::=

セマンティクス

構文的には、VERTEX_IDおよびEDGE_IDファンクションは要素参照を使用します。これは、VERTEX_IDの場合は頂点参照、EDGE_IDの場合はエッジ参照である必要があります。2つのファンクションは、データベース内でグローバルに一意であるグラフ要素の識別子を生成します。

内容としては、頂点およびエッジ識別子は、次の情報を含むJSONオブジェクトです:

  • 頂点またはエッジが含まれているグラフの所有者。

  • 頂点またはエッジが含まれているグラフの名前。

  • 頂点またはエッジが定義されている要素表。

  • 頂点またはエッジのキー値。

例1

次の問合せは、Maryの友人の頂点識別子をリストします:

SELECT CAST(p2_id AS VARCHAR2(200)) AS p2_id
FROM GRAPH_TABLE ( students_graph
  MATCH (p1 IS person) -[e1 IS friends]- (p2 IS person)
  WHERE p1.name = 'Mary'
  COLUMNS (vertex_id(p2) AS p2_id)
)
ORDER BY p2_id;

結果は次のとおりです。

P2_ID
--------------------------------------------------------------------------------------------------------
{"GRAPH_OWNER":"SCOTT","GRAPH_NAME":"STUDENTS_GRAPH","ELEM_TABLE":"PERSONS","KEY_VALUE":{"PERSON_ID":1}}
{"GRAPH_OWNER":"SCOTT","GRAPH_NAME":"STUDENTS_GRAPH","ELEM_TABLE":"PERSONS","KEY_VALUE":{"PERSON_ID":3}}
{"GRAPH_OWNER":"SCOTT","GRAPH_NAME":"STUDENTS_GRAPH","ELEM_TABLE":"PERSONS","KEY_VALUE":{"PERSON_ID":4}}

例2

次の問合せでは、JSONドット表記法構文を使用して、Maryの友人に対応する頂点の頂点キーを表すJSONオブジェクトのセットを取得します:

SELECT GT.p2_id.KEY_VALUE
FROM GRAPH_TABLE ( students_graph
  MATCH (p1 IS person) -[e1 IS friends]- (p2 IS person)
  WHERE p1.name = 'Mary'
  COLUMNS (vertex_id(p2) AS p2_id)
) GT
ORDER BY key_value;

結果は次のとおりです。

KEY_VALUE
----------------------------------------
{"PERSON_ID":1}
{"PERSON_ID":3}
{"PERSON_ID":4}

例3

次の問合せでは、JSON_VALUEファンクションを使用して、グラフのエッジのすべての要素表名を取得します:

SELECT DISTINCT json_value(e_id, '$.ELEM_TABLE') AS elem_table
FROM GRAPH_TABLE ( students_graph
  MATCH -[e]-
  COLUMNS (edge_id(e) AS e_id)
)
ORDER BY elem_table;

結果は次のとおりです。

ELEM_TABLE
----------------------------------------
FRIENDS
STUDENT_OF

頂点とエッジの等価述語

目的

頂点とエッジの等価述語では、2つの頂点変数(または2つのエッジ変数)を同じ頂点(またはエッジ)にバインドするかどうかを指定できます。

構文

element_equal_predicate::=

vertex_equal_predicate::=

edge_equal_predicate::=

例1

次の問合せは、Maryの友人を検索します。ここでは、vertex_equal predicateを使用して、Mary自身が結果に含まれないようにします。

SELECT name
FROM GRAPH_TABLE ( students_graph
  MATCH (p IS person)
          -[IS friends]- (friend IS person)
            -[IS friends]- (friend_of_friend IS person)
  WHERE p.name = 'Mary' AND NOT vertex_equal(p, friend_of_friend)
  COLUMNS (friend_of_friend.name)
)
ORDER BY name;

結果は次のとおりです。

NAME
----------
Bob
John