GRAPH_TABLEの値式

目的

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

プロパティの参照

目的

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

構文

property_reference::=

セマンティクス

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

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

  • ラベル式が指定されていない場合は、要素変数のタイプに応じて、すべての頂点プロパティまたはグラフ内のすべてのエッジ・プロパティを参照できます。

  • それ以外の場合で、ラベル式が指定された場合、参照可能なプロパティ・セットは、ラベル式を満たす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;

個人JohnBobMaryAliceのみに生年月日がありますが、大学(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_TABLEWHERE句およびCOLUMNS句で使用でき、定量化パターン内のWHERE句に集計ファンクションが含まれない可能性があるという制限があります。

構文的には、集計内の値式には、通常の(非グラフの)SQL問合せの場合のように表の列ではなく、グラフ・パターンの頂点およびエッジへの参照が含まれている必要があります。

セマンティクス

集計ファンクションのセマンティクスは、「集計ファンクション」を参照してください。

集計ファンクションの引数すべてで、1つのグループ変数のみが参照されている必要があります。また、それらでシングルトン変数をいくつでも参照できます。なお、要素変数は、定量化されたパス・パターンでその変数が宣言されているが、その定量化されたパス・パターンの外部でその参照が発生するときは、グループ参照度があると考えられています。他方では、その参照が数量詞を超えていない場合、その参照にはシングルトン参照度があります。シングルトン変数は、グラフ・パターンで宣言された要素パターン変数、またはRows句で宣言されたイテレータ変数である可能性があります。グラフ要素参照のコンテキスト解釈の詳細は、「要素変数」も参照してください。

LISTAGGJSON_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) > 10MATCH -[e3]->{1,1} WHERE SUM(e3.prop) > 10は使用できます。これは、変数e2e3には、SUM集計内にグループ参照度があるためです。

  • 変数参照は、プロパティ参照、頂点またはエッジIDファンクション、あるいはJSONドット表記法の式の中に存在する必要があります。たとえば、vertex_equaledge_equalIS 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::=

セマンティクス

プロパティ・グラフ用の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値は返されません。