GRAPH_TABLEの値式
目的
GRAPH_TABLE
内のWHERE
句およびCOLUMNS
句の値式は、GRAPH_TABLE
以外の値式でサポートされているすべての機能を継承します。また、GRAPH_TABLE
内では、次の値式を使用できます:
プロパティの参照
目的
プロパティ参照を使用すると、頂点とエッジのプロパティ値にアクセスできます。
構文
property_reference::=
property_name::=
セマンティクス
構文的には、プロパティ・アクセスは要素変数で、その後にドット(.)とプロパティの名前が続きます。プロパティ名は識別子であるため、二重引用符または引用符なしのどちらかになります。
要素パターンに指定されたラベル式によって、参照できるプロパティが決まります:
-
ラベル式が指定されていない場合は、グラフ内のすべてのプロパティを参照できます。
-
それ以外の場合で、ラベル式が指定された場合、ラベル式を満たすラベルに属するプロパティのみを参照できます。
複数のラベルがラベル式を満たすが、同じプロパティを定義し、データ型が異なる場合は、データ型が論理和互換である場合にのみ、このようなプロパティを参照できます。結果の値は、論理互換データ型になります。
複数のラベルがラベル式を満たし、一部のラベルが、他のラベルが持たない特定のプロパティを持っている場合でも、そのようなプロパティを参照できます。プロパティ参照では、プロパティを持たない頂点またはエッジに対して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;
個人John
、Bob
、Mary
、Alice
のみに生年月日がありますが、大学(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