GRAPH_TABLEの値式
目的
GRAPH_TABLE
内のWHERE
句およびCOLUMNS
句の値式は、GRAPH_TABLE
以外の値式でサポートされているすべての機能を継承します。また、GRAPH_TABLE
内では、次の値式を使用できます:
プロパティの参照
目的
プロパティ参照を使用すると、頂点とエッジのプロパティ値にアクセスできます。
構文
property_reference::=
property_name::=
セマンティクス
構文的には、プロパティ・アクセスは要素変数で、その後にドット(.)とプロパティの名前が続きます。プロパティ名は識別子であるため、二重引用符または引用符なしのどちらかになります。
要素パターンに指定されたラベル式によって、参照できるプロパティが決まります:
-
ラベル式が指定されていない場合は、要素変数のタイプに応じて、すべての頂点プロパティまたはグラフ内のすべてのエッジ・プロパティを参照できます。
-
それ以外の場合で、ラベル式が指定された場合、参照可能なプロパティ・セットは、ラベル式を満たす1つ以上のラベルを持つ頂点(またはエッジ)表に属するラベルのプロパティの結合です。
複数のラベルがラベル式を満たすが、同じプロパティを定義し、データ型が異なる場合は、データ型が論理和互換である場合にのみ、このようなプロパティを参照できます。結果の値は、論理互換データ型になります。
複数のラベルがラベル式を満たし、一部のラベルが、他のラベルが持たない特定のプロパティを持っている場合でも、そのようなプロパティを参照できます。プロパティ参照では、プロパティを持たない頂点またはエッジに対してnull値が生成されます。
また、要素変数がグラフ要素にバインドされていない場合、結果はNULL値になります。なお、要素変数がオプションでバインドされる唯一の状況は、その要素変数が、ONE ROW PER STEP
で宣言されているイテレータ変数である場合です。具体的に述べると、ONE ROW PER STEP
で宣言されたエッジ変数および2番目の頂点変数は、パス・パターンと空のパスが一致するときは(たとえば、数量詞の繰返しがゼロ回であるため)グラフ要素にバインドされません。
例
例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
例2
次の問合せは、すべてのPERSON
頂点に一致し、そのNAME
およびHEIGHT
を返します。
SELECT * FROM GRAPH_TABLE ( students_graph MATCH (n IS person) COLUMNS ( n.name, n.height ) ) ORDER BY height;
結果は次のとおりです。
NAME HEIGHT ---------- ------- Mary 1.65 Alice 1.7 Bob 1.75 John 1.8
ここで、ラベルPERSON
にプロパティHEIGHT
がない場合でも、頂点表PERSONS
にラベルPERSON
およびPERSON_HT
があり、ラベルPERSON
がラベル式と一致するため、参照可能なプロパティのセットは、ラベルPERSON_HT
のプロパティHEIGHT
を含むラベルPERSON
およびPERSON_HT
のプロパティの和集合です。
頂点およびエッジIDファンクション
目的
頂点およびエッジIDファンクションを使用すると、グラフ要素の一意の識別子を取得できます。
構文
element_id_function::=
vertex_id_function::=
edge_id_function::=
element_reference::=
セマンティクス
構文的には、VERTEX_ID
およびEDGE_ID
ファンクションは要素参照を使用します。これは、VERTEX_ID
の場合は頂点参照、EDGE_ID
の場合はエッジ参照である必要があります。2つのファンクションは、データベース内でグローバルに一意であるグラフ要素の識別子を生成します。
内容としては、頂点およびエッジ識別子は、次の情報を含むJSONオブジェクトです:
-
頂点またはエッジが含まれているグラフの所有者。
-
頂点またはエッジが含まれているグラフの名前。
-
頂点またはエッジが定義されている要素表。
-
頂点またはエッジのキー値。
参照されている要素変数がグラフ要素にバインドされていない場合、ファンクションはNULL値を返します。
例
例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つ以上がグラフ要素にバインドされていない場合、述語はNULL値に評価されます。それ以外の場合は、それらはTRUE
またはFALSE
に評価されます。
例
例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
SOURCE述語とDESTINATION述語
目的
SOURCE
述語とDESTINATION
述語を使用すると、頂点がエッジのソースまたは宛先かどうかをテストできます。これは、たとえば、任意の方向エッジ・パターンを介して照合するエッジの方向を決定する場合に便利です。
構文
source_predicate::=
destination_predicate::=
セマンティクス
SOURCE
述語は、頂点とエッジを入力として取得し、頂点がエッジのソースであるかどうかに応じてTRUE
またはFALSE
を返します。
DESTINATION
述語は、頂点とエッジを入力として取得し、頂点がエッジの宛先であるかどうかに応じてTRUE
またはFALSE
を返します。
参照されている要素変数の1つ以上がグラフ要素にバインドされていない場合、述語はNULL値に評価されます。それ以外の場合は、それらはTRUE
またはFALSE
に評価されます。
例
例1
次の問合せは、Maryからの受信または送信のFRIENDS
エッジと一致します。エッジごとに、エッジのソースに対するNAME
プロパティと、エッジの宛先のNAME
プロパティを返します。
SELECT * FROM GRAPH_TABLE ( students_graph MATCH (p1 IS person) -[e IS friends]- (p2 IS person) WHERE p1.name = 'Mary' COLUMNS (e.friendship_id, e.meeting_date, CASE WHEN p1 IS SOURCE OF e THEN p1.name ELSE p2.name END AS from_person, CASE WHEN p1 IS DESTINATION OF e THEN p1.name ELSE p2.name END AS to_person)) ORDER BY friendship_id; FRIENDSHIP_ID MEETING_DATE FROM_PERSON TO_PERSON ------------- ------------ ----------- --------- 2 19-SEP-00 Mary Alice 3 19-SEP-00 Mary John 4 10-JUL-01 Bob Mary
例2
次の問合せでは、2つのFRIENDS
エッジが受信または送信の両方になるように、Johnの友人を検索します。
SELECT * FROM GRAPH_TABLE ( students_graph MATCH (p1 IS person) -[e1 IS friends]- (p2 IS person) -[e2 IS friends]- (p3 IS person) WHERE p1.name = 'John' AND ((p1 IS SOURCE OF e1 AND p2 IS SOURCE OF e2) OR (p1 IS DESTINATION OF e1 AND p2 IS DESTINATION OF e2)) COLUMNS (p1.name AS person_1, CASE WHEN p1 IS SOURCE OF e1 THEN 'Outgoing' ELSE 'Incoming' END AS e1_direction, p2.name AS person_2, CASE WHEN p2 IS SOURCE OF e2 THEN 'Outgoing' ELSE 'Incoming' END AS e2_direction, p3.name AS person_3)) ORDER BY 1, 2, 3; PERSON_1 E1_DIRECTION PERSON_2 E2_DIRECTION PERSON_3 ---------- ------------ ---------- ------------ ---------- John Incoming Mary Incoming Bob John Outgoing Bob Outgoing Mary
JohnからMary経由のAliceへのパスは、受信エッジの後に送信エッジがあり、同じ方向に2つのエッジがないため、結果の一部ではありません。
GRAPH_TABLEでの集計
目的
GRAPH_TABLE
の集計は、可変長パス内の頂点またはエッジのセットに対して1つ以上の値を計算するために使用されます。これは、非グラフ問合せでも使用できる同じ集計ファンクションを使用して行われます。
構文
グラフ以外の問合せで使用可能なすべての集計ファンクション数も、グラフ問合せに使用できます。これらのファンクションの構文については、「集計ファンクション」を参照してください。
集計ファンクションは、GRAPH_TABLE
のWHERE
句およびCOLUMNS
句で使用でき、定量化パターン内のWHERE
句に集計ファンクションが含まれない可能性があるという制限があります。
構文的には、集計内の値式には、通常の(非グラフの)SQL問合せの場合のように表の列ではなく、グラフ・パターンの頂点およびエッジへの参照が含まれている必要があります。
セマンティクス
集計ファンクションのセマンティクスは、「集計ファンクション」を参照してください。
集計ファンクションの引数すべてで、1つのグループ変数のみが参照されている必要があります。また、それらでシングルトン変数をいくつでも参照できます。なお、要素変数は、定量化されたパス・パターンでその変数が宣言されているが、その定量化されたパス・パターンの外部でその参照が発生するときは、グループ参照度があると考えられています。他方では、その参照が数量詞を超えていない場合、その参照にはシングルトン参照度があります。シングルトン変数は、グラフ・パターンで宣言された要素パターン変数、またはRows句で宣言されたイテレータ変数である可能性があります。グラフ要素参照のコンテキスト解釈の詳細は、「要素変数」も参照してください。
LISTAGG
、JSON_ARRAYAGG
およびXMLAGG
の場合に値を集計する順序は、ORDER BY
句を指定しないかぎり非決定論的です。例: LISTAGG(edge1.property1 ORDER BY edge1.property1))
。現在、パス内の頂点またはエッジと同じ順序で要素を並べ替えるような方法で、パス順を明示的に並べる方法はありません。ただし、ORDER BY
句を省略すると、現在の実装はパス順で暗黙的に順序付けされますが、この動作は時間の経過とともに変化する可能性があるため、これに依存しないでください。
制限事項
-
集計を含めることができるのは、定量化パターン内にない
WHERE
句のみです。たとえば、グラフ・パターンのWHERE
句および非定量化要素パターンのWHERE
句には集計を含めることができますが、カッコで囲まれたパス・パターンのWHERE
句には集計が含まれていない場合があります。カッコで囲まれたパス・パターンには、常に定量化する必要があるという制限が現在あるためです。 -
GRAPH_TABLE
における集計ファンクションの引数すべてで、1つのグループ変数のみが参照されている必要があります。また、それらでシングルトン変数をいくつでも参照できます。たとえば、MATCH -[e1]-> WHERE SUM(e1.prop) > 10
は使用できません。これは、変数e1
には、SUM
集計内にシングルトン参照度があるためです。一方、MATCH -[e2]->{1,10} WHERE SUM(e2.prop) > 10
とMATCH -[e3]->{1,1} WHERE SUM(e3.prop) > 10
は使用できます。これは、変数e2
とe3
には、SUM
集計内にグループ参照度があるためです。 -
変数参照は、プロパティ参照、頂点またはエッジIDファンクション、あるいはJSONドット表記法の式の中に存在する必要があります。たとえば、
vertex_equal
、edge_equal
、IS SOURCE OF
およびIS DESTINATION OF
は集計ファンクションで使用できません。たとえば、COUNT(edge1)
は使用できませんが、COUNT(edge_id(edge1))
とCOUNT(edge1.some_property))
は使用できます。 -
GRAPH_TABLE
の集計ファンクションの引数は、GRAPH_TABLE
のグラフ・パターン内で宣言された頂点またはエッジ以外を参照できません。たとえば、外部問合せから渡された列を参照することはできません。 -
LISTAGG
の場合、JSON_ARRAYAGG
およびXMLAGG
では、結果内の要素の順序をパス内の頂点またはエッジの順序で指定する方法はありませんが、現在の実装では暗黙的にパス順序でソートされます。
例
例1
次の問合せは、Aliceという名前の個人から開始し、友人とラベル付けされた受信エッジと送信エッジの両方に続く、エッジが2から5 ({2,5}
)の間の長さのすべてのパスを検索します。パスに沿ったエッジは2回トラバースしないでください(COUNT(edge_id(e) = COUNT(DISTINCT edge_id(e))
)。この問合せでは、パスのすべてのfriendship IDと各パスの長さが戻されます。
SELECT * FROM GRAPH_TABLE ( students_graph MATCH (p IS person) -[e IS friends]-{2,5} (friend IS person) WHERE p.name = 'Alice' AND COUNT(edge_id(e)) = COUNT(DISTINCT edge_id(e)) COLUMNS (LISTAGG(e.friendship_id, ', ') AS friendship_ids, COUNT(edge_id(e)) AS path_length)) ORDER BY path_length, friendship_ids;
上の問合せの要素パターンWHERE
句では、p.nameは単一エッジのプロパティを参照し、COUNT
集計内のedge_id(e)
は、エッジ変数eが数量子{2,5}
で囲まれているため、要素IDのリストにアクセスします。同様に、COLUMNS
句の2つのプロパティ参照は、プロパティ値とエッジID値のリストにアクセスします。
結果は次のとおりです。
FRIENDSHIP_IDS PATH_LENGTH ----------------- ----------- 2, 3 2 2, 4 2 2, 3, 1 3 2, 4, 1 3 2, 3, 1, 4 4 2, 4, 1, 3 4
例2
次の問合せは、パスが最大3つのエッジ({,3}
)の長さになるように、大学ABC
と大学XYZ
の間のすべてのパスを検索します。パスごとにJSON配列が戻されます。この配列には、友人とラベル付けされたエッジのfriendship_id
値、およびstudent_of
とラベル付けされたエッジのサブジェクト値が含まれます。friendship_id
プロパティはVARCHAR(100)
にキャストされ、サブジェクト・プロパティと型互換になります。
SELECT * FROM GRAPH_TABLE ( students_graph MATCH (u1 IS university) -[e]-{,3} (u2 IS university) WHERE u1.name = 'ABC' AND u2.name = 'XYZ' COLUMNS (JSON_ARRAYAGG(CASE WHEN e.subject IS NOT NULL THEN e.subject ELSE CAST(e.friendship_id AS VARCHAR(100)) END) AS path)) ORDER BY path; The result is: PATH ----------------------- ["Arts","3","Math"] ["Music","4","Math"]
例3
例3次の問合せでは、Johnという名前の個人から開始し、friendsとラベルが付けられた送信エッジとpersonと頂点のみに続く、2から3のエッジ({2,3}
)の間の長さを持つすべてのパスを検索します。パス上の頂点は、Johnと同じperson_idを持つことはできません(WHERE p.person_id <> friend.person_id
)。
SELECT * FROM GRAPH_TABLE ( students_graph MATCH (p IS person) ( -[e IS friends]-> (friend IS person) WHERE p.person_id <> friend.person_id){2,3} WHERE p.name = 'John' COLUMNS (COUNT(edge_id(e)) AS path_length, LISTAGG(friend.name, ', ') AS names, LISTAGG(e.meeting_date, ', ') AS meeting_dates )) ORDER BY path_length;
前述のCOLUMNS
句には、3つの集計が含まれ、1つ目は各パスの長さを計算し、2つ目はパスに沿って個人名のカンマ区切りリストを作成し、3つ目はパスに沿って会議日付のカンマ区切りリストを作成します。
問合せの結果は次のとおりです。
PATH_LENGTH NAMES MEETING_DATES ----------- ------------------- ----------------------------------- 2 Bob, Mary 01-SEP-00, 10-JUL-01 3 Bob, Mary, Alice 01-SEP-00, 10-JUL-01, 19-SEP-00
プロパティ・グラフの場合のJSONオブジェクト・アクセス式
目的
プロパティ・グラフのJSONドット表記法を使用すると、頂点またはエッジ・プロパティ値として公開されているJSONデータに、簡単にアクセスできます。これにより、一般的なユースケース用の単純な構文が提供されていますが、JSONデータを含むプロパティ・グラフに対するさらに複雑な問合せには、SQL/JSONファンクションjson_valueおよびjson_queryを使用できます。
構文
json_property_graph_object_access_expr::=
json_prop_graph_obj_access_step::=
array_step::=
セマンティクス
プロパティ・グラフ用のJSONドット表記法では、JSONデータの列の場合のJSONドット表記法と同じ機能がサポートされています。「JSONオブジェクト・アクセス式」を参照してください。
例
次の例では、サンプル・データにあるpersons
表の上に、新しいグラフを作成します。persons表にはJSON型のperson_data
列があるため、このグラフには、JSON型の頂点プロパティperson_data
が含まれます。その後、このグラフに対して、JSONドット表記法を使用するGRAPH_TABLE
問合せが発行されて、HR部門内のすべての人物の役割が取得されます。
CREATE PROPERTY GRAPH persons_graph VERTEX TABLES ( persons );
SELECT * FROM GRAPH_TABLE ( persons_graph MATCH (n) WHERE n.person_data.department = 'HR' COLUMNS (n.name, n.person_data.role.string() AS role) ); The output of above SELECT query is: NAME ROLE --------------- --------------- Mary HR Manager Alice HR Assistant
どのようにCOLUMNS
句でアイテム・メソッドstring()
を使用してVARCHAR2(4000)
が返されるようにしているかに注目してください。このアイテム・メソッドがなければ、JSON文字列が返され、結果が二重引用符で囲まれていました。
関連項目:
『JSON開発者ガイド』の単純なドット表記法によるJSONデータへのアクセス。
MATCHNUM
目的
MATCHNUM
関数は、一致のセット内で一致を一意に識別する数値を返します。
セマンティクス
MATCHNUM
関数は、一致のセット内で一致を一意に識別する数値を返します。数値は必ずしも連続しているとは限りません。たとえば、一致がフィルタで除外された場合などにギャップがあることがあります。GRAPH_TABLE
から返される行には、一意の一致番号が付けられています。ただし、ONE ROW PER VERTEX
またはONE ROW PER STEP
が指定されている場合は、一致内の異なる反復に対して同じ一致番号が返されます。
制限
MATCHNUM
を使用できるのは、COLUMNS
句内のみです。
例
例1
次の問合せでは、すべてのpersonの頂点を照合し、一致ごとに一意の一致番号および個人の名前が返されます。
SELECT * FROM GRAPH_TABLE ( students_graph MATCH (p IS person) COLUMNS (MATCHNUM() AS matchnum, p.name)) ORDER BY matchnum;
結果は、次のとおりです:
MATCHNUM NAME ---------- ------- 1 John 2 Mary 3 Bob 4 Alice
例2
次の問合せでは、共通の友人を介して直接または間接的にJohnとMaryを接続するパスを検索します。各一致について、問合せでは頂点ごとに1行が返されます。これは、交友関係パスに沿って1人につき1行であることを意味します。各結果には、一致番号、person頂点の要素番号および個人の名前が含まれています。
SELECT * FROM GRAPH_TABLE ( students_graph MATCH (p1 IS person) -[IS friends]-{1,2} (p2 IS person) WHERE p1.name = 'John' AND p2.name = 'Mary' ONE ROW PER VERTEX (v) COLUMNS (MATCHNUM() AS matchnum, ELEMENT_NUMBER(v) AS element_number, v.name)) ORDER BY matchnum, element_number;
結果は、次のとおりです:
MATCHNUM ELEMENT_NUMBER NAME --------- -------------- ---------- 1 1 John 1 3 Mary 2 1 John 2 3 Bob 2 5 Mary
ELEMENT_NUMBER
目的
ELEMENT_NUMBER
関数は、イテレータ変数が現在バインドしているグラフ要素の順次要素番号を返します。
セマンティクス
ELEMENT_NUMBER
関数は、ONE ROW PER VERTEX
またはONE ROW PER STEP
が指定されている場合、COLUMNS
句で使用できます。この関数はイテレータ変数を参照し、イテレータ変数が現在バインドしている順次要素番号を返します。パスは常に頂点から始まり、頂点とエッジに交互になるため、最初の要素は要素番号1の頂点、2番目の要素は要素番号2のエッジ、3番目の要素は要素番号3の頂点のようになります。このため、頂点は常に奇数の要素番号になり、エッジは偶数の要素番号になります。パスが空で、単一の頂点のみがあってエッジがなく、ONE ROW PER STEP
が指定されている場合、イテレータ・エッジ変数または2番目のイテレータ頂点変数が参照されると、ELEMENT_NUMBER
はNULLを返します。パスが空の場合、最初のイテレータ(頂点)変数のみがバインドされる単一のステップになります。
制限
-
ELEMENT_NUMBER
を使用できるのは、COLUMNS
句内のみです。 -
ELEMENT_NUMBER
を使用できるのは、ONE ROW PER VERTEX
またはONE ROW PER STEP
が指定されている場合のみです。 -
ELEMENT_NUMBER
では、イテレータ変数以外の型の変数を参照できません。
例
例1
次の問合せでは、共通の友人を介して直接または間接的にJohnとMaryを接続するパスを検索します。各一致について、問合せではステップごとに1行が返されます。各結果には、一致番号、ステップ内の友人のエッジの要素番号、friendship_id
およびステップ内の2人の名前が含まれています。
SELECT * FROM GRAPH_TABLE ( students_graph MATCH (p1 IS person) -[IS friends]-{1,2} (p2 IS person) WHERE p1.name = 'John' AND p2.name = 'Mary' ONE ROW PER STEP (v1, e, v2) COLUMNS (MATCHNUM() AS matchnum, ELEMENT_NUMBER(e) AS element_number, v1.name AS name1, e.friendship_id, v2.name AS name2)) ORDER BY matchnum, element_number;
結果は、次のとおりです:
The results are: MATCHNUM ELEMENT_NUMBER NAME1 FRIENDSHIP_ID NAME2 ---------- -------------- ---------- ------------- ---------- 1 2 John 3 Mary 2 2 John 1 Bob 2 4 Bob 4 Mary
例2
次の問合せは、0人または1人の友人のエッジを介してJohnに接続されているすべての人を検索します。各一致について、問合せではステップごとに1行が返されます。各結果には、一致番号、ステップ内の友人のエッジの要素番号、friendship_id
およびステップ内の2人の名前が含まれています。
SELECT * FROM GRAPH_TABLE ( students_graph MATCH (p1 IS person) -[IS friends]-{0,1} (p2 IS person) WHERE p1.name = 'John' ONE ROW PER STEP (v1, e, v2) COLUMNS (MATCHNUM() AS matchnum, ELEMENT_NUMBER(e) AS element_number, v1.name AS name1, e.friendship_id, v2.name AS name2)) ORDER BY matchnum, element_number;
結果は、次のとおりです:
The results are: MATCHNUM ELEMENT_NUMBER NAME1 FRIENDSHIP_ID NAME2 ---------- -------------- ---------- ------------- --------- 1 John 2 2 John 3 Mary 4 2 John 1 Bob
ここでは、3つのパスが一致しました。一致番号1のパスには、1つの頂点とゼロ個のエッジがあります。このため、イテレータ頂点変数v1がバインドされているが、イテレータ・エッジ変数eおよびイテレータ頂点変数v2がバインドされていない単一のステップがあり、ELEMENT_NUMBER、FRIENDSHIP_IDおよびNAME2列がNULL値になっています。他の2つのパス(一致番号2および4)にも1つのステップがありますが、これらのパスにはエッジと2番目の頂点が含まれているため、3つのイテレータ変数がすべてバインドされ、NULL値は返されません。