グラフ・パターン
目的
グラフ・パターンは、頂点およびエッジ・パターンのセットと検索条件で構成されます。グラフ・パターンは、パターン内の各頂点およびエッジ変数のバインディングを含むソリューションのセットを取得するためにグラフと照合されます。
このトピックには、次のサブトピックが記載されています:
構文
graph_pattern::=
path_pattern_list::=
セマンティクス
グラフ・パターンには次の部分が含まれています:
-
MATCHキーワード。 -
path_pattern_list: カンマ区切りの1つ以上のパス・パターンを含むリスト。 -
graph_pattern_where_clause: パターンから頂点およびエッジを参照できる検索条件を定義するオプションのWHERE句。
同じGRAPH_TABLE内の2つのパス・パターンで、より複雑な非線形パターンを作成できるように、頂点変数とエッジ変数を共有できます。変数は、1つのパス・パターン内で繰り返して循環パターンを作成することもできます。複数の頂点パターンまたはエッジ・パターンが変数を共有している場合、発生する要素変数にバインドするために、それらのパターンのすべてのラベル式および要素パターンWHERE句が満たされる必要があります。
2つのパス・パターン間に共有の変数がない場合、ソリューション・セットは個別のパス・パターンのソリューションのクロス積になります。
制限事項
頂点変数は、エッジ変数と同じ名前にできません。
例
例1
次の問合せは、他の2人のユーザーを介してMaryからMaryに循環パスを検索します。受信エッジのみが一致します(<-[..]-)。
SELECT *
FROM GRAPH_TABLE ( students_graph
MATCH (a IS person) <-[e1 IS friends]- (b IS person)
<-[e2 IS friends]- (c IS person)
<-[e3 is friends]- (a IS person)
WHERE a.name= 'Mary'
COLUMNS (a.name AS person_a, b.name AS person_b, c.name AS person_c)
);ここで、グラフ・パターンは、4つの頂点パターンと3つのエッジ・パターンを持つ単一のパス・パターンで構成されます。最初の頂点パターンは、パターンが循環パスと一致するように、変数aを最後の頂点パターンと共有します。
単一のパスのみがパターンに一致します:
PERSON_A PERSON_B PERSON_C ---------- ---------- ---------- Mary Bob John
この出力は、Maryで開始するパスとBobへの受信エッジ、続いてJohnへの受信エッジ、続いてMaryへの受信エッジが一致したことを示しています。
次のように単一パス・パターンを複数のパス・パターンに分割することによって、同じ問合せを表現することもできます:
SELECT *
FROM GRAPH_TABLE ( students_graph
MATCH (a IS person) <-[e1 IS friends]- (b IS person),
(b) <-[e2 IS friends]- (c IS person),
(c) <-[e3 is friends]- (a IS person)
WHERE a.name= 'Mary'
COLUMNS (a.name AS person_a, b.name AS person_b, c.name AS person_c)
);ここでは、最初のパス・パターンは変数bを2番目のパス・パターンと共有し、2番目のパス・パターンは変数cを3番目のパス・パターンと共有し、3番目のパス・パターンは変数aを最初のパス・パターンと共有します。
パス・パターン
目的
パス・パターンは、頂点とエッジの文字列を照合する線形パターンを指定します。パス・パターンは、1つまたは複数の頂点とエッジ・パターンの連結で構成されます。頂点パターンとエッジ・パターンは、カッコ付きで定量化できます。
構文
path_pattern::=
path_variable_declaration::=
path_variable::=
path_pattern_expression::=
path_term::=
path_factor::=
path_concatenation::=
path_primary::=
セマンティクス
構文的には、オプションのパス変数宣言で始まるパス・パターンの後に、頂点パターンまたはエッジ・パターンのどちらかである要素パターンが1つ以上続きます。
パス・パターンの要素パターンは、頂点とエッジ・パターンを交互に交換する必要はありません。連続する2つのエッジ・パターンまたは連続する2つの頂点パターンが存在する場合があります。これらのトポロジに一貫性のないパターンは、パターン一致の実行中に次のように認識されます:
-
2つの連続した頂点パターンが同じ頂点にバインドされます。
-
概念的に、2つの連続するエッジ・パターンにはその間に暗黙的な頂点パターンがあります。
制限事項
パス・パターンの制限は次のとおりです:
-
パス・パターンは、頂点パターンの1つがカッコで囲まれたパス・パターンに含まれているが、もう1つがカッコで囲まれていない場合、連続する2つの頂点パターンのみを含むことができます。
-
カッコで囲まれたパス・パターンは定量化する必要があります。
-
パス変数は、多数重ねて宣言できません。つまり、パス変数は、要素変数、イテレータ変数または別のパス変数と同じ名前で宣言することはできません。
例
例1
次の問合せは、グラフ内の頂点の数をカウントします:
SELECT COUNT(*) FROM GRAPH_TABLE ( students_graph MATCH (v) COLUMNS (1 AS dummy) );
COLUMNS句には少なくとも1つの式を含める必要があるため、ダミー値は提示されますが、問合せからは戻されません。
結果は次のとおりです。
COUNT(*)
----------
6例2
次の問合せは、グラフのエッジ数をカウントします:
SELECT COUNT(*) FROM GRAPH_TABLE ( students_graph MATCH -[e]-> COLUMNS (1 AS dummy) );
結果は次のとおりです。
COUNT(*)
----------
8例3
次の問合せでは、Maryから2つのホップの友人である個人を検索し、受信または送信の友人エッジに続きます:
SELECT * FROM GRAPH_TABLE ( students_graph MATCH (n IS person) -[IS friends]- () -[IS friends]- (m IS person) WHERE n.name = 'Mary' AND m.name <> n.name COLUMNS (m.name AS fof) );
前述のパス・パターンでは次のようになります:
-
(
n IS person)は、変数nおよびラベル式IS personを持つ頂点パターンです。 -
-[IS friends]-は、暗黙的な変数およびラベル式IS friendsを持つ任意の方向のエッジ・パターンです。 -
()は、暗黙的な変数を持ち、ラベル式がない頂点パターンで、ラベルを持つ頂点を照合します。 -
-[IS friends]-は、暗黙的な変数およびラベル式IS friendsを持つ任意の方向のエッジ・パターンです。 -
(
n IS person)は、変数nおよびラベル式IS personを持つ頂点パターンです。
結果は次のとおりです。
FOF ---------- Bob John
前述の問合せは、次のように表すこともできます:
SELECT * FROM GRAPH_TABLE ( students_graph MATCH (n IS person) -[IS friends]- -[IS friends]- (m IS person) WHERE n.name = 'Mary' AND m.name <> n.name COLUMNS (m.name AS fof) );
ここでは、2つのエッジ・パターンの間の頂点パターンは暗黙的です。
同じエッジ・パターンの繰返し指定を回避するために、数量子を使用して同じ問合せを表現できます:
SELECT *
FROM GRAPH_TABLE ( students_graph
MATCH (n IS person) -[IS friends]-{2}(m IS person)
WHERE n.name = 'Mary' AND m.name <> n.name
COLUMNS (m.name AS fof)
);
定量化されたパス・パターンはカッコで囲むことができます:
SELECT *
FROM GRAPH_TABLE ( students_graph
MATCH (n IS person) (-[IS friends]-){2}(m IS person)
WHERE n.name = 'Mary' AND m.name <> n.name
COLUMNS (m.name AS fof)
);前述の構文のバリエーションはそれぞれ同じ結果になることに注意してください:
FOF ---------- Bob John
要素パターン
目的
要素パターンは、頂点パターンまたはエッジ・パターンのいずれかです。要素パターンを照合した結果、要素パターンの暗黙的または明示的に宣言された変数に頂点またはエッジがバインドされます。
この項は、次の項で構成されています:
構文
element_pattern::=
頂点パターン
目的
頂点パターンは、グラフ内の頂点を照合するパターンです。このような照合の結果、頂点パターンの暗黙的または明示的に宣言された変数に一連の頂点がバインドされます。
構文
vertex_pattern::=
セマンティクス
頂点パターンには円と似ている2つのカッコ( )があります。これは、通常、頂点はグラフのビジュアライゼーションの円で表されるためです。
例
例1
次の問合せは、グラフ内の頂点の数をカウントします:
SELECT COUNT(*) FROM GRAPH_TABLE ( students_graph MATCH (v) COLUMNS (1 AS dummy) );
COLUMNS句には少なくとも1つの式を含める必要があるため、ダミー値は提示されますが、問合せからは戻されません。
結果は次のとおりです。
COUNT(*)
----------
6例2
次の問合せは、生年月日が1980年1月1日以降のすべての個人を照合します:
SELECT name, birthday FROM GRAPH_TABLE ( students_graph MATCH (p IS person WHERE p.dob > DATE '1980-01-01') COLUMNS (p.name, p.dob AS birthday) ) ORDER BY birthday;
結果は次のとおりです。
NAME BIRTHDAY ---------- --------- Mary 25-SEP-82 Alice 01-FEB-87
エッジ・パターン
目的
エッジ・パターンは、グラフのエッジと照合するパターンです。このような照合の結果、エッジ・パターンの暗黙的または明示的に宣言された変数に一連のエッジがバインドされます。
構文
edge_pattern::=
full_edge_pattern::=
full_edge_pointing_right::=
full_edge_pointing_left::=
full_edge_any_direction::=
abbreviated_edge_pattern::=
セマンティクス
視覚的には、エッジ・パターンは矢印に似ています。これは、通常、エッジがグラフのビジュアライゼーションに矢印で表されるためです。たとえば、<-[]-または<-は受信矢印のように見えるため受信エッジ・パターンであり、-[]->または->は送信矢印のように見えるため、送信エッジ・パターンです。
edge_patternは、full_edge_patternまたはabbreviated_edge_patternです。完全なエッジ・パターンには、オプションの要素パターン変数、ラベル式および要素パターンWHERE句を含むelement_pattern_fillerがありますが、省略されたエッジ・パターンは、3つのオプションのフィラー部分が必要ない場合に糖衣構文を提供します。
次の表は、オプションの概要を示しています:
表4-6 エッジ・パターンの概要
| 方向性 | 完全なエッジ・パターン | 省略されたエッジ・パターン |
|---|---|---|
|
右方向 |
-[ ] -> |
-> |
|
左方向 |
<-[ ]- |
<- |
|
任意の方向: 右方向または左方向を指す |
-[ ]-または<-[ ]-> |
- |
省略された構文では変数名、ラベル式または要素パターンWHERE句を指定できないため、省略されたエッジ・パターンは、指定した方向を持つグラフ内のすべてのエッジを照合することに注意してください。
例
例1
次の問合せは、グラフのエッジ数をカウントします:
SELECT COUNT(*) FROM GRAPH_TABLE ( students_graph MATCH -> COLUMNS (1 AS dummy) );
結果は次のとおりです。
COUNT(*)
----------
8
例2
次の問合せは、DATE '2000-01-01'より大きい値のプロパティmeeting_dateを持つすべてのfriendsエッジを照合します:
SELECT * FROM GRAPH_TABLE ( students_graph MATCH -[e IS friends WHERE e.meeting_date > DATE '2001-01-01']-> COLUMNS (e.meeting_date) );
結果は次のとおりです。
MEETING_D --------- 10-JUL-01
要素パターン・フィラー
目的
頂点パターンおよび完全エッジ・パターンには、オプションの変数宣言、オプションのラベル式およびオプションのWHERE句を指定するためのフィラーがあります。
構文
element_pattern_filler::=
セマンティクス
頂点パターンと完全なエッジ・パターンには、次の部分を含むフィラーがあります:
-
WHERE句やCOLUMNS句などで要素を参照できるように、要素パターンの変数名を指定するためのオプションのelement_variable_declaration。変数名が指定されていない場合、変数は暗黙的であり、参照できません。 -
ラベル式を定義するためのオプションの
is_label_expression。頂点とエッジは、指定したラベル式を満たす場合にのみ一致します。 -
インライン検索条件を定義するためのオプションの
element_pattern_where_clause。頂点とエッジは、指定した検索条件を満たす場合にのみ一致します。
例
例1
次の問合せでは、Maryから2つのホップの友人である個人を検索し、受信または送信の友人エッジに続きます:
SELECT *
FROM GRAPH_TABLE ( students_graph
MATCH (n IS person WHERE n.name = 'Mary')
-[e IS friends WHERE e.meeting_date > DATE '2001-01-01']-
() -[IS friends]- (m IS person)
WHERE m.name <> n.name
COLUMNS (m.name, e.meeting_date)
);前述のパス・パターンでは次のようになります:
-
(
n IS person WHERE n.name = 'Mary')は、変数n、ラベル式IS personおよび要素パターンWHERE句WHERE n.name = 'Mary'を持つ頂点パターンです。 -
-[e IS friends WHERE e.meeting_date > DATE '2001-01-01']-は、変数e、ラベル式IS friendsおよび要素パターンWHERE句WHERE e.meeting_date > DATE '2001-01-01'を持つ任意の方向のエッジ・パターンです。 -
()は、暗黙的な変数を持つが、ラベル式も要素パターンWHERE句も持たない頂点パターンです。 -
-[IS friends]-は、暗黙的な変数、ラベル式IS friendsを持つが、要素パターンWHERE句は持たない任意の方向のエッジ・パターンです。 -
(
n IS person)は、変数n、ラベル式IS personを持つが、要素パターンWHERE句を持たない頂点パターンです。
結果は次のとおりです。
NAME MEETING_D ---------- --------- John 10-JUL-01
要素変数
目的
要素変数は、頂点変数またはエッジ変数です。パターン一致時に、変数はグラフ内の頂点またはエッジのセットにバインドされます。要素変数は、問合せの他の場所から参照して、プロパティ値などの頂点およびエッジのデータにアクセスできます。
構文
element_variable_declaration::=
element_variable::=
セマンティクス
構文的には、element_variable_declarationは識別子であるため、二重引用符または引用符なしのどちらかになります。要素変数の宣言はオプションであり、要素変数が宣言されていない場合、要素パターンには(暗黙的な)一意の名前を持つ暗黙的な変数があります。暗黙的な変数は、問合せの他の場所では参照できません。
複数の頂点パターンで同じ要素変数を宣言でき、複数のエッジ・パターンで同じ要素変数を宣言することもできます。このような場合、複数の変数はありませんが、異なる頂点またはエッジ・パターンで共有される単一の変数があります。
宣言された変数は、宣言されているGRAPH_TABLE内で参照できます。これらは、同じGRAPH_TABLEで定義されたWHERE句およびCOLUMNS句で参照できます。
要素変数が定量化されたパス・パターンで宣言されている場合、パターンに対する単一のソリューション内の複数の頂点またはエッジにバインドできます。参照はコンテキストで解釈されます。参照が定量化されたパス・パターンの外側に存在する場合、参照は要素変数にバインドされているグラフ要素の完全なリストに対するものです。この場合、要素変数はグループの参照度を持つと言われます。ただし、参照が数量子を超えない場合、参照にはシングルトン参照度があります。
たとえば、(X) -[E WHERE E.P > 1]->{1,10} (Y) WHERE SUM(E.P) < 100では、エッジ変数Eが2回参照されます(エッジ・パターンで1回、エッジ・パターン外で1回)。エッジ・パターン内では、Eはシングルトン参照度を持ち、プロパティ参照E.Pは単一エッジのプロパティを参照します。一方、SUM集計内の参照はグループ参照度を持ち(数量子{1,10}のため)、Eにバインドされているエッジのリストを参照します。
制限事項
-
頂点パターンでは、エッジ・パターンと同じ名前の変数を宣言できません。
-
定量化されたパス・パターンでは、定量化されたパス・パターンの外で宣言された要素変数と同じ名前の変数を宣言することはできません。
例
例1
次の問合せは、DATE '2000-09-015'より大きい値を持つプロパティ meeting_dateを持つ受信エッジまたは送信エッジに続くJohnの友人の友人を検索します:
SELECT DISTINCT name
FROM GRAPH_TABLE ( students_graph
MATCH (a IS person) -[e IS friends WHERE e.meeting_date > DATE '2000-09-15']-{2} ("b" IS person)
WHERE a.name = 'John' AND a.name <> "b".name
COLUMNS ("b".name)
);前述の問合せで、aおよび"b"は頂点変数で、eはエッジ変数で、e.meeting_date、a.nameおよび"b".nameは、参照される頂点またはエッジのプロパティ値にアクセスするプロパティ参照です。
結果には、次のように、Johnには友人の友人が2人いることが示されます:
NAME ---------- Bob Alice
例2
次の問合せでは、Maryの友人、およびMaryと彼女の友人が通った大学を見つけます:
SELECT *
FROM GRAPH_TABLE ( students_graph
MATCH (p1 IS person) -[e1 IS friends]- (p2 IS person)
, (p1) -[IS student_of]-> (u1 IS university)
, (p2) -[IS student_of]-> (u2 IS university)
WHERE p1.name = 'Mary'
COLUMNS (p1.name, p2.name AS friend, e1.meeting_date, u1.name AS univ_1, u2.name AS univ_2)
);前述の問合せでは、p1、p2、u1およびu2は頂点変数で、e1はエッジ変数です。パターン-[IS student_of]->は2回表示され、参照できない2つの一意変数を暗黙的に宣言します。さらに、変数p1を共有する2つの頂点パターンがあり、変数p2を共有する2つの頂点パターンがあります。頂点は、両方の頂点パターンが一致する場合にのみ、このような変数にバインドされます。
結果には、Maryに3人の友人があり、そのうちの1人は同じ大学XYZに通い、他の2人の友達は異なる大学ABCに通うことが示されています:
NAME FRIEND MEETING_D UNIV_1 UNIV_2 ---------- ---------- --------- ---------- ---------- Mary John 19-SEP-00 XYZ ABC Mary Bob 10-JUL-01 XYZ ABC Mary Alice 19-SEP-00 XYZ XYZ
例3
次の問合せは、Aliceという名前の個人から開始し、friendsというラベルの付いた受信エッジと送信エッジの両方に続く、エッジが2から5 ({2,5})の間の長さのすべてのパスを検索します。パス上のエッジは2回トラバースしないでください(COUNT(e.friendship_id) = COUNT(DISTINCT e.friendship_id))。この問合せでは、パスのすべての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(e.friendship_id) = COUNT(DISTINCT e.friendship_id)
COLUMNS (LISTAGG(e.friendship_id, ', ') AS friendship_ids,
COUNT(e.friendship_id) AS path_length));
前述の問合せの要素パターンWHERE句では、p.nameは単一エッジのプロパティを参照し、COUNT集計内の e.friendship_idは、エッジ変数eが数量子{2,5}で囲まれているため、プロパティ値のリストにアクセスします。同様に、COLUMNS句の2つのプロパティ参照は、両方ともプロパティ値のリストにアクセスします。
結果は次のとおりです。
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
ラベル式
目的
ラベル式は、検索を特定のタイプの頂点またはエッジのみに制限するために使用されます。
構文
is_label_declaration::=
label_expression::=
label_disjunction::=
label::=
セマンティクス
構文的には、is_label_declarationはキーワードISで始まり、その後にlabel_expressionが続きます。これは、縦棒|で示されるlabelまたはlabel_disjunctionです。ラベル自体は識別子であるため、二重引用符または引用符なしになります。
要素パターンは、ラベル式を満たす頂点とエッジのみを照合します。ラベル式を省略すると、ラベルに関係なくすべての頂点とエッジが照合されます。
例
例1
次の問合せは、personまたはuniversityというラベルの付いたすべての頂点を照合し、その名前および生年月日プロパティを取得します:
SELECT * FROM GRAPH_TABLE ( students_graph MATCH (x IS person|university) COLUMNS (x.name, x.dob) ) ORDER BY name;
結果は次のとおりです。
NAME DOB ---------- --------- ABC Alice 01-FEB-87 Bob 11-MAR-66 John 13-JUN-63 Mary 25-SEP-82 XYZ
前述のとおり、大学には生年月日がないため、null値が戻され、DOB列に空の文字列として表示されます。
例2
次の問合せは、Maryという名前の個人からのstudent_ofまたはfriendsというラベルの送信エッジを、universityまたは"PERSON"というラベルの頂点mと照合します:
SELECT * FROM GRAPH_TABLE ( students_graph MATCH (n IS person) -[e IS student_of|friends]-> (m IS university|"PERSON") WHERE n.name = 'Mary' COLUMNS (e.subject, e.meeting_date, m.name) ) ORDER BY subject, meeting_date, name;
結果は次のとおりです。
SUBJECT MEETING_D NAME
---------- --------- ----------
Math XYZ
19-SEP-00 Alice
19-SEP-00 John要素パターンWHERE句
目的
要素パターンWHERE句は、構文的に頂点またはエッジ・パターン内に配置され、パターンが一致するように頂点またはエッジで満たす必要がある検索条件を指定します。
構文
element_pattern_where_clause::=
セマンティクス
構文的には、element_pattern_where_clauseはキーワードWHEREで始まり、その後に任意のブール値式であるsearch_conditionが続きます。
要素パターンWHERE句は、グラフ・パターンの任意のグラフ要素変数を参照できます。変数にグループ参照の度合いがある場合、参照は集計関数の引数の内側にある必要があります。GRAPH_TABLEの集計を参照してください。検索条件が要素パターン自体の変数を参照している必要はありませんが、問合せの読みやすさを向上させるには、通常、要素変数を参照しない検索条件がかわりにグラフ・パターンWHERE句に配置されるようにすることをお薦めします。
例
例1
次の問合せは、15 September 2000の後に出会ったJohnのすべての友人を検索します:
SELECT Gt.name
FROM GRAPH_TABLE ( students_graph
MATCH (a IS person WHERE a.name = 'John')
-[e IS friends WHERE e.meeting_date > DATE '2000-09-15']-
(b IS person)
COLUMNS (b.name)
) GT;前述の例には、2つの要素パターンWHERE句が含まれています:
-
WHERE a.name='John' -
WHERE e.meeting_date > DATE '2000-09-15'.
結果は次のとおりです。
NAME ---------- Mary
定量化されたパス・パターン
目的
定量化されたパス・パターンを使用すると、通常は可変長パスを照合する目的で、パス・パターンを繰り返し照合できます。指定した数量子は、パス・パターンを照合する回数の最小値と最大値を決定します。
構文
quantified_path_primary::=
graph_pattern_quantifier::=
fixed_quantifier::=
general_quantifier::=
lower_bound::=
upper_bound::=
セマンティクス
quantified_path_primaryは、数量子のあるpath_primaryです。ここでは、パス・プライマリはエッジ・パターンまたはカッコで囲まれたパス・パターンのいずれかである必要があります。
graph_pattern_quantifierは次のいずれかです:
-
fixed_quantifier。中カッコの間に配置された符号なし整数です。整数値では、パターンが照合される正確な回数を指定します。つまり、パターンを照合する回数の下限は上限と同じです。 -
general_quantifier。オプションのlower_bound、カンマ(、)および必須のupper_boundがあり、これらはすべて中カッコの間に配置されます。下限と上限は符号なしの整数で、パス・パターンを照合する最小回数と最大回数を指定します。下限が指定されていない場合、下限はゼロ(0)です。
次の表は、オプションの概要を示しています:
表4-7 数量子表
| 数量子 | 意味 |
|---|---|
|
|
|
|
|
|
|
|
ゼロ(0)から |
制限事項
定量化されたパス・パターンには、次の制限が適用されます:
-
定量化されたパス・プライマリは、エッジ・パターンまたはカッコで囲まれたパス・パターンのいずれかである必要があります。たとえば、頂点パターンは、カッコで囲まれたパス・パターン内に少なくとも1つのエッジ・パターンとともに表示される場合を除き、定量化できません。
-
下限は0以上、上限は1以上かつ下限以上である必要があります。
-
ネストされた数量子は使用できません。
例
例1
次の問合せは、DATE '2000-090-15'より大きい値を持つプロパティmeeting_dateを持つ受信エッジまたは送信エッジに続くJohnの友人の友人を検索します:
SELECT DISTINCT name
FROM GRAPH_TABLE ( students_graph
MATCH (a IS person)
-[e IS friends WHERE e.meeting_date > DATE '2000-09-15']-{2}
(b IS person)
WHERE a.name = 'John' AND a.name <> b.name
COLUMNS (b.name)
);前述の問合せでは、パス・パターン-[e IS friends WHERE e.meeting_date > DATE '2000-09-15']-は固定量子{2}で定量化され、エッジ・パターンが正確に2回照合することを示します。
結果は次のとおりです。
NAME ---------- Bob Alice
同じ問合せをカッコで囲まれたパス・パターンを使用して記述することもできます。構文上のすべての選択肢を次に示します。後者の2つはカッコで囲まれたパス・パターンを使用します:
-
-[e IS friends WHERE e.meeting_date > DATE '2000-09-15']-{2} -
(-[e IS friends WHERE e.meeting_date > DATE '2000-09-15']-){2} -
(-[e IS friends]- WHERE e.meeting_date > DATE '2000-09-15'){2}
例2
次の問合せでは、Maryより背が高い人を検索した後に、3ホップ以内にMaryから到達できる個人を検索します。
SELECT DISTINCT name, height
FROM GRAPH_TABLE ( students_graph
MATCH (a IS person|person_ht)
(-[e IS friends]- (x IS person_ht) WHERE x.height > a.height) {,3}
(b IS person|person_ht)
WHERE a.name = 'Mary'
COLUMNS (b.name, b.height)
)
ORDER BY height;
The result is:
NAME HEIGHT
---------- ----------
Mary 1.65
Alice 1.7
Bob 1.75
John 1.8結果にMaryが含まれる理由は、指定された数量子{,3}の下限がゼロであるので、定量化されたパターンをゼロ回照合することが許可され、この場合、変数aおよびbがMaryに対応する同じ頂点にバインドされるためです。
例3
次の問合せは、パスが最大3つのエッジ({,3})の長さになるように、大学ABCと大学XYZの間のすべてのパスを検索します。パスごとに、friendsというラベルの付いたエッジのfriendship_id値およびstudent_ofというラベルの付いたエッジの科目の値が配列に含まれるように、JSON配列が戻されます。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));結果は次のとおりです。
PATH ----------------------- ["Arts","3","Math"] ["Music","4","Math"]
カッコで囲まれたパス・パターン
目的
カッコで囲まれたパス・パターンを使用すると、より複雑な定量化されたパス・パターン式を定義できます。
構文
parenthesized_path_pattern_expression::=
parenthesized_path_pattern_where_clause::=
セマンティクス
parenthesized_path_pattern_expressionは、オプションのparenthesized_path_pattern_where_clauseのあるpath_pattern_expressionで、カッコの間に配置します。
カッコで囲まれたパス・パターンでは、少なくとも1つのエッジ・パターンを含むパス・パターン式の定量化が可能です。カッコがない場合、1つのエッジ・パターンのみを定量化できます。
カッコで囲まれたパス・パターンWHERE句は、カッコで囲まれたパス・パターン自体で宣言された頂点およびエッジ変数、カッコで囲まれたパス・パターンの外で宣言された頂点およびエッジ変数を参照できます。変数にグループ参照の度合いがある場合、参照は集計関数の引数の内側にある必要があります。GRAPH_TABLEの集計を参照してください。
制限事項
カッコで囲まれたパス・パターン式には、次の制限が適用されます:
-
カッコで囲まれた各パス・パターンを定量化する必要があります。
-
カッコのレベルは1つのみです。カッコで囲まれたパス・パターンのネストは許可されていません。
例
例1
次の問合せでは、1から3ホップ({1,3})内でBobから到達できる個人を検出します。これにより、パスに沿った個人の連続するペアごとに、最初の個人の生年月日が2番目の個人の生年月日より小さくなります。
SELECT DISTINCT name, birthday
FROM GRAPH_TABLE ( students_graph
MATCH
(a IS person)
( (x) -[e IS friends]- (y IS person)
WHERE x.dob < y.dob ){1,3}
(b IS person)
WHERE a.name = 'Bob'
COLUMNS (b.name, b.dob AS birthday)
)
ORDER BY birthday;
結果は次のとおりです。
NAME BIRTHDAY ---------- --------- Mary 25-SEP-82 Alice 01-FEB-87
例2
次の問合せでは、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(e.friendship_id) AS path_length,
LISTAGG(friend.name, ', ') AS names,
LISTAGG(e.meeting_date, ', ') AS meeting_dates ));
前述の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グラフ・パターンWHERE句
目的
グラフ・パターンWHERE句は、構文的にグラフ・パターンの末尾に配置され、グラフ・パターンが一致するように完全なグラフ・パターンで満たす必要がある検索条件を指定します。
構文
graph_pattern_where_clause::=
セマンティクス
構文的には、グラフ・パターンWHERE句はキーワードWHEREで始まり、その後に任意のブール値式であるsearch_conditionが続きます。
グラフ・パターンWHERE句は、グラフ・パターンの任意の要素変数を参照できます。変数にグループ参照の度合いがある場合、参照は集計関数の引数の内側にある必要があります。GRAPH_TABLEの集計を参照してください。
例
例1
次の問合せは、2000年9月15日以降に出会ったJohnのすべての友人を検索します:
SELECT Gt.name FROM GRAPH_TABLE ( students_graph MATCH (a IS person) -[e IS friends]- (b IS person) WHERE a.name = 'John' AND e.meeting_date > DATE '2000-09-15' COLUMNS (b.name) ) GT;
2つの条件をグラフ・パターンWHERE句に指定すると、パターンWHERE a.name = 'John' AND e.meeting_date > DATE '2000-09-15'で満たす必要がある単一の検索が生成されることに注意してください。
結果は次のとおりです。
NAME ---------- Mary


































