グラフ・パターン
目的
グラフ・パターンは、頂点およびエッジ・パターンのセットと検索条件で構成されます。グラフ・パターンは、パターン内の各頂点およびエッジ変数のバインディングを含むソリューションのセットを取得するためにグラフと照合されます。
このトピックには、次のサブトピックが記載されています:
構文
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_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
句と同様に、要素パターンWHERE
句は、すべての参照にシングルトン参照度があるかぎり、グラフ・パターンの任意のグラフ要素変数を参照できます。検索条件が要素パターン自体の変数を参照している必要はありませんが、問合せの読みやすさを向上させるには、通常、要素変数を参照しない検索条件がかわりにグラフ・パターン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から10の間(両端を含む)にし、上限は1から10の間(両端を含む)にし、下限以上にする必要があります。
-
ネストされた数量子は使用できません。
例
例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
句は、すべての参照にシングルトン参照度があるかぎり、カッコで囲まれたパス・パターン自体で宣言された頂点およびエッジ変数、カッコで囲まれたパス・パターンの外で宣言された頂点およびエッジ変数を参照できます。
制限事項
カッコで囲まれたパス・パターン式には、次の制限が適用されます:
-
カッコで囲まれた各パス・パターンを定量化する必要があります。
-
カッコのレベルは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
句と同様に、グラフ・パターンWHERE
句は、すべての参照にシングルトン参照度があるかぎり、グラフ・パターンの任意の要素変数を参照できます。
制限事項
検索条件には集計が含まれず、グループ参照度は許可されていないため、数量子で囲まれた変数を参照できません。
例
例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