Oracle CQL の MATCH_RECOGNIZE 構成体およびその下位の句によって、Oracle CQL クエリのパターン認識が実行されます。
Oracle CQL では、MATCH_RECOGNIZE 構成体を使用したパターン認識機能が提供されます。
入力ストリームの連続するイベントまたはタプルのシーケンスが特定の条件を満たす場合は、パターンが構成されます。Oracle CQL のパターン認識機能では、着信イベントまたはタプルの属性に条件を定義し、相関変数と呼ばれる String 名を使用してこれらの条件を識別できます (節 15.3「DEFINE 句」)。照合されるパターンは、これらの相関変数に対する正規表現として指定され、さまざまな着信タプルが有効な一致として見なされるために満たす必要のある条件のシーケンスまたは順序を決定します (節 15.7「PATTERN 句」を参照)。正規表現の使用によって、認識されるパターンを指定する際の表現が向上します。パターンの指定に一致するタプルの属性に対して計算を実行し、MATCH_RECOGNIZE を含むクエリの SELECT 句でそれらを使用できます (節 15.5「MEASURES 句」を参照)。ALL MATCHES、PARTITION BY、DURATION などの追加の句を使用すると、入力ストリームに対するパターン認識の実行方法をより詳細に制御できます。
MATCH_RECOGNIZE クエリの出力は常にストリームです。

(pattern_partition_clause::=、pattern_measures_clause::=、pattern_def_dur_clause::=)

(pattern_clause::=、pattern_skip_match_clause::=、pattern_definition_clause::=、duration_clause::=、subset_clause::=)
例 15-1 は、クエリの一般的な MATCH_RECOGNIZE 条件を示します。クエリでは、PATTERN 句で制限された DEFINE 句の条件が満たされた場合に、select 文の MEASURES 句の値が返されます。
例 15-1 パターン マッチングの条件
<query id="detectPerish"><![CDATA[ select its.itemId from tkrfid_ItemTempStream MATCH_RECOGNIZE ( PARTITION BY itemId MEASURES A.itemId as itemId PATTERN (A B* C) DEFINE A AS (A.temp >= 25), B AS ((B.temp >= 25) and (to_timestamp(B.element_time) - to_timestamp(A.element_time) < INTERVAL "0 00:00:05.00" DAY TO SECOND)), C AS (to_timestamp(C.element_time) - to_timestamp(A.element_time) >= INTERVAL "0 00:00:05.00" DAY TO SECOND) ) as its ]]></query>
MATCH_RECOGNIZE 構成体では、以下の下位の句が提供されます。
その他の例については、節 15.9「例」を参照してください。
Oracle CEP で重複するパターンの一致をコンフィグレーションするには、この省略可能な句を使用します。ALL MATCHES 句を省略すると、1 つのパターンのみが一致するように Oracle CEP がコンフィグレーションされます。

ALL MATCHES を使用する例 15-2 のクエリ tkpattern_q41 と例 15-3 のデータ ストリーム tkpattern_S11 があるとします。ストリーム tkpattern_S11 のスキーマは (c1 integer, c2 integer) です。例 15-4 は、クエリで返されるストリームを示します。
例 15-2 のクエリ tkpattern_q41 では、入力ストリーム値のプロットが英字 W の形になる場合に一致が報告されます。例 15-4 のリレーションは、この W パターン一致の重複するインスタンスの例を示します。
重複するパターンのインスタンスには 2 つの種類があります。
全体 : 全体的な重複の例 : 入力に含まれる時間 3000-9000 および 4000-9000 の行は両方とも指定されたパターン式に一致します。ALL MATCHES 句がない場合は、長い方 (3000-9000) が使用されます。
部分 : 部分的な重複の例 : 入力に含まれる時間 12000-21000 および 16000-23000 の行は両方とも指定されたパターン式に一致します。ALL MATCHES 句がない場合は、先に出現した方が使用されます。これは、ALL MATCHES 句を省略した場合は、以前に一致したパターン インスタンスの最後のタプルの次のタプルから、パターンに一致する次のインスタンスの検索が開始されるためです。
例 15-2 ALL MATCHES 句のクエリ
<query id="tkpattern_q41"><![CDATA[ select T.firstW, T.lastZ from tkpattern_S11 MATCH_RECOGNIZE ( MEASURES A.c1 as firstW, last(Z.c1) as lastZ ALL MATCHES PATTERN(A W+ X+ Y+ Z+) DEFINE W as W.c2 < prev(W.c2), X as X.c2 > prev(X.c2), Y as Y.c2 < prev(Y.c2), Z as Z.c2 > prev(Z.c2) ) as T ]]></query>
例 15-3 ALL MATCHES 句のストリーム入力
Timestamp Tuple 1000 1,8 2000 2,8 3000 3,8 4000 4,6 5000 5,3 6000 6,7 7000 7,6 8000 8,2 9000 9,6 10000 10,2 11000 11,9 12000 12,9 13000 13,8 14000 14,5 15000 15,0 16000 16,9 17000 17,2 18000 18,0 19000 19,2 20000 20,3 21000 21,8 22000 22,5 23000 23,9 24000 24,9 25000 25,4 26000 26,7 27000 27,2 28000 28,8 29000 29,0 30000 30,4 31000 31,4 32000 32,7 33000 33,8 34000 34,6 35000 35,4 36000 36,5 37000 37,1 38000 38,7 39000 39,5 40000 40,8 41000 41,6 42000 42,6 43000 43,0 44000 44,6 45000 45,8 46000 46,4 47000 47,3 48000 48,8 49000 49,2 50000 50,5 51000 51,3 52000 52,3 53000 53,9 54000 54,8 55000 55,5 56000 56,5 57000 57,9 58000 58,7 59000 59,3 60000 60,3
例 15-4 ALL MATCHES 句のストリーム出力
Timestamp Tuple Kind Tuple 9000: + 3,9 9000: + 4,9 11000: + 6,11 11000: + 7,11 19000: + 12,19 19000: + 13,19 19000: + 14,19 20000: + 12,20 20000: + 13,20 20000: + 14,20 21000: + 12,21 21000: + 13,21 21000: + 14,21 23000: + 16,23 23000: + 17,23 28000: + 24,28 30000: + 26,30 38000: + 33,38 38000: + 34,38 40000: + 36,40 48000: + 42,48 50000: + 45,50 50000: + 46,50
例 15-4 に示すように、ALL MATCHES 句では特定の入力が受信されると、一致するすべてのパターン インスタンスが報告されます。たとえば、時間 20000 では {12,20}、{13,20}、および {14,20} のすべてのタプルが出力されます。
基になる基本ストリームのタプルに対する 1 つ以上の条件を定義するには、この句を使用します。例 15-1 の A、B、C のように、相関名と変数を使用して条件を参照します。MATCH_RECOGNIZE 条件の PATTERN 句では、これらの相関変数に対して認識されるパターンを正規表現として指定します (節 15.7「PATTERN 句」)。
基本ストリームからの新しいタプルが受信されると、その時点で関連している相関変数の条件が評価されます。その定義の条件を満たしている場合、タプルは相関変数に一致したと見なされます。特定の入力が 0 個、1 個、または複数の相関変数に一致するかを確認するのは簡単です。入力の受信時に評価される関連条件は、PATTERN 句の正規表現で管理されるロジックと、これまでの入力を処理した後のパターン認識処理の状態によって決定されます。
条件では、MATCH_RECOGNIZE 句が適用されるストリームまたはストリームに評価されるビューのスキーマの任意の属性を参照できます。
基本ストリームの属性は、c1 < 20 のように直接参照するか、または相関変数 (条件) を定義している場合は、A.c1 < 20 のように相関変数を使用して参照できます。
属性を直接参照する場合は、いずれかの相関変数に最後に一致したタプルが評価のために調査されます。DEFINE A as c1 < 20 および DEFINE A as A.c1 < 20 の定義では両方とも、最新の入力タプルである同一のタプルの c1 を参照しています。これは、入力の受信時に最新の入力が相関変数に一致すると仮定して、その相関変数の条件が評価されるためです。
A のように、相関変数を使用して属性を参照する場合は、最後に A に一致したタプルが評価のために調査されます。
DEFINE B as A.c1 > 20 のように、ある相関変数の定義で別の相関変数を参照できます。この A.c1 は、最後に A に一致したタプルの c1 の値を参照します。PREV 関数を使用すると、以前に同一の相関変数に一致したタプルを参照できます。詳細については、「PREV」を参照してください。
相関変数の定義では関数も使用できます。

(non_mt_corrname_definition_list::=)
non_mt_corrname_definition_list::=

(correlation_name_definition::=)
correlation_name_definition::=

(correlation_name::=、non_mt_cond_list::=)
例 15-1 の pattern_definition_clause は、以下のとおりです。
DEFINE A AS (A.temp >= 25), B AS ((B.temp >= 25) and (to_timestamp(B.element_time) - to_timestamp(A.element_time) < INTERVAL "0 00:00:05.00" DAY TO SECOND)), C AS (to_timestamp(C.element_time) - to_timestamp(A.element_time) >= INTERVAL "0 00:00:05.00" DAY TO SECOND)
DEFINE 句に定義されていない相関名を指定すると、すべての入力で true と見なされます。例 15-5 に示すように、相関名 A は各入力で true であるため、DEFINE 句に定義されていません。PATTERN 句で使用されていない相関名を定義するとエラーになります。
例 15-5 未定義の相関名
<query id="q"><![CDATA[ SELECT T.firstW, T.lastZ FROM S2 MATCH_RECOGNIZE ( MEASURES A.c1 as firstW, last(Z) as lastZ PATTERN(A W+ X+ Y+ Z+) DEFINE W as W.c2 < prev(W.c2), X as X.c2 > prev(X.c2), Y as Y.c2 < prev(Y.c2), Z as Z.c2 > prev(Z.c2) ) as T ]]></query>
詳細については、節 15.7「PATTERN 句」を参照してください。
DURATION 句は、イベントの欠落を検出するクエリを作成する場合にのみ使用する必要のある省略可能な句です。イベントの欠落の検出では、特定の制限時間内に発生するはずの特定のイベントが時間内に発生しない状況が検出されます。例については、「イベントの欠落の検出」を参照してください。

(arith_expr::=、time_unit::=、time_spec::=)
この句を使用すると、PATTERN 句の正規表現が完全に一致し、DURATION 句に指定された期間が期限切れになっても他のイベントまたは入力が到着しない場合にのみ、一致が報告されます。期間は、パターンの一致の最初のイベントが到着した時点から計測されます。期間は、10 のように定数値として指定するか、DURATION c1+4 のように基になるストリームの属性との算術式によって変数値として指定できます。オプションで、秒や分などの時間単位も指定できます (time_spec::= を参照)。デフォルトの時間単位は秒です。MULTIPLES OF 句を指定した場合は、反復的なイベント欠落の検出が示されます。この場合、パターンが完全に一致した後にイベントが発生しない限り、期間値の倍数の時点で出力が送信されます。詳細については、「DURATION MULTIPLES OF」を参照してください。
DURATION
DURATION 10 を使用して 10 秒 (10000 ms) の遅延を指定する例 15-6 のクエリ tkpattern_q59 と、例 15-7 のデータ ストリーム tkpattern_S19 があるとします。ストリーム tkpattern_S19 のスキーマは (c1 integer) です。例 15-8 は、クエリで返されるストリームを示します。
例 15-6 DURATION 句を使用した MATCH_RECOGNIZE のクエリ
<query id="BBAQuery"><![CDATA[ select T.p1, T.p2 from tkpattern_S19 MATCH_RECOGNIZE ( MEASURES A.c1 as p1, B.c1 as p2 include timer events PATTERN(A B*) duration 10 DEFINE A as A.c1 = 10, B as B.c1 != A.c1 ) as T ]]></query>
例 15-7 DURATION 句を使用した MATCH_RECOGNIZE のストリーム入力
Timestamp Tuple 1000 10 4000 22 6000 444 7000 83 9000 88 11000 12 11000 22 11000 15 12000 13 15000 10 27000 11 28000 10 30000 18 40000 10 44000 19 52000 10 h 100000
例 15-8 DURATION 句を使用した MATCH_RECOGNIZE のストリーム出力
Timestamp Tuple Kind Tuple 11000: + 10,15 25000: + 10, 38000: + 10,18 50000: + 10,19 62000: + 10,
時間 1000 のタプルは A に一致します。
11000 までに到着するそれ以降のタプルはすべて B に一致します。期間は 10 であるため、1000+10000=11000 の時点で一致が出力されます。パターンの正規表現 AB* では最も広範囲な量指定子 * によって可能な限り多くの B との一致を行う必要があるため、B に一致する最後のタプル (値 15 のタプル) が選択されます。1000 から 11000 までのタプルのシーケンスはパターン AB* に一致するため、11000 の時点で一致が報告されます。
次の一致は、その時点で A に一致するタプルのある 15000 の時点で開始されます。次のタプルの到着は時間 27000 です。ここでもまた、パターン AB* を満たすタプルがあるため、15000+10000=25000 の時点で一致が報告されます。同様のロジックに従って、以降の出力が生成されます。
DURATION MULTIPLES OF
DURATION MULTIPLES OF 10 を使用して 10 秒 (10000 ms) の遅延を指定する例 15-9 のクエリ tkpattern_q75 と、例 15-10 のデータ ストリーム tkpattern_S23 があるとします。ストリーム tkpattern_S23 のスキーマは (c1 integer) です。例 15-11 は、クエリで返されるストリームを示します。
例 15-9 DURATION MULTIPLES OF 句を使用した MATCH_RECOGNIZE のクエリ
<query id="tkpattern_q75"><![CDATA[ select T.p1, T.p2, T.p3 from tkpattern_S23 MATCH_RECOGNIZE ( MEASURES A.c1 as p1, B.c1 as p2, sum(B.c1) as p3 ALL MATCHES include timer events PATTERN(A B*) duration multiples of 10 DEFINE A as A.c1 = 10, B as B.c1 != A.c1 ) as T ]]></query>
例 15-10 DURATION MULTIPLES OF 句を使用した MATCH_RECOGNIZE のストリーム入力
Timestamp Tuple 1000 10 4000 22 6000 444 7000 83 9000 88 11000 12 11000 22 11000 15 12000 13 15000 10 27000 11 28000 10 30000 18 44000 19 62000 20 72000 10 h 120000
例 15-11 DURATION MULTIPLES OF 句を使用した MATCH_RECOGNIZE のストリーム出力
Timestamp Tuple Kind Tuple 11000: + 10,88,637 11000: + 10,12,649 11000: + 10,22,671 11000: + 10,15,686 25000: + 10,, 38000: + 10,18,18 48000: + 10,19,37 58000: + 10,19,37 68000: + 10,20,57 82000: + 10,, 92000: + 10,, 102000: + 10,, 112000: + 10,,
この実行は、上の DURATION 句の例と同様のロジックに従います (「DURATION」を参照)。異なる点は、後の方の出力です。72000 のタプルは A に一致しますが、それ以降は入力がありません。パターン AB* とは一致するため、82000 の時点で出力が行われます。MULTIPLES OF 句で遅延 10 が指定されているため、92000、102000、およびそれ以降は同様に出力が行われます。
DEFINE 句の条件 (相関変数) に一致する基本ストリーム内のタプルの属性に対する式を定義し、この MATCH_RECOGNIZE 条件を含むメイン クエリの SELECT 句でそれらの式を適切に使用できるよう、式のエリアスを指定するには、この句を使用します。基本ストリームの属性は、直接参照するか、または相関変数によって参照できます。
任意の Oracle CQL 組み込み関数またはユーザ定義関数を使用できます (節 1.1.9「関数」を参照)。



例 15-1 で、pattern_measures_clause は以下のとおりです。
MEASURES A.itemId as itemId
A.c1 のように、基になるストリームまたはストリームに評価されるビューの属性を相関変数を使用して参照した場合、c1 の値は相関変数 A に対応する条件に最後に一致したタプルの値になります。DEFINE 句で A が定義されていない場合は、常に TRUE と見なされます。そのため、入力のすべてのタプルは効率的に A と一致します。A.c1 の値は、最後に処理されたタプルの c1 の値になります。
MATCH_RECOGNIZE 句の結果を分割するためのストリームの属性を指定するには、この省略可能な句を使用します。

例 15-1 で、pattern_partition_clause は以下のとおりです。
PARTITION BY itemId
パターン内の partition by 句は、partition リスト内の属性に基づいて入力ストリームが論理的に分割され、その分割内でパターン マッチングが行われることを意味します。
例 15-12 のようなスキーマ (c1 integer, c2 integer) を持つストリーム S があるとします。
例 15-13 のような MATCH_RECOGNIZE のクエリがあるとします。
例 15-13 入力ストリーム S1 を使用する MATCH_RECOGNIZE のクエリ
select T.p1, T.p2, T.p3 from S MATCH_RECOGNIZE( MEASURES A.ELEMENT_TIME as p1, B.ELEMENT_TIME as p2 B.c2 as p3 PATTERN (A B) DEFINE A as A.c1 = 10, B as B.c1 = 20 ) as T
このクエリの出力は、以下のとおりです。
3000:+ 2000, 3000, 2
例 15-13 のクエリに PARTITION BY c2 を追加すると、出力は以下のように変わります。
3000:+ 2000, 3000, 2 4000:+ 1000, 4000, 1
これは、PARTITION BY 句の追加により、一致が分割内でのみ行われるようになったためです。c2 属性の値によって、1000 と 4000 のタプルはある分割に属し、2000 と 3000 のタプルは別の分割に属します。最初の分割で、A は 1000 のタプルと一致し、B は 4000 のタプルと一致します。3000 のタプルも B の定義と一致しますが、タプルが別の分割に属しているため、最初の分割では一致として提示されません。
DEFINE 句に定義された相関変数に対して一致させるパターンを正規表現として指定するには、この句を使用します (節 15.3「DEFINE 句」を参照)。これらの正規表現では DEFINE 句で定義されていない相関変数も使用できますが、それらは常に TRUE と見なされるため、各入力に一致します。


(correlation_name::=、pattern_quantifier::=)


表 15-1 は、Oracle CQL でサポートされるパターン量指定子 (pattern_quantifier::=) を示しています。パターン量指定子を使用して、パターン一致の動作を指定します。1 文字のパターン量指定子は、最大または最も広範囲に一致します。正規表現の可能な最大インスタンス数との一致が試みられます。2 文字のパターン数量子は、最小または最も限定的に一致します。正規表現の可能な最小インスタンス数との一致が試みられます。
量指定のないパターン (A など) は厳密に 1 つの一致を必要とする量指定子を持つものと想定されます。
例 15-1 で、pattern_clause は以下のとおりです。
PATTERN (A B* C)
このパターン句では、連続する入力タプルによって以下の条件が満たされた場合に、パターンの一致が認識され、報告されます。
1 つのタプルが相関変数 A を定義する条件と一致する
0 個以上のタプルが相関変数 B と一致する
1 つのタプルが相関変数 C と一致する
2 で、相関変数 B と C の両方に一致するタプル (これらの定義条件を両方とも満たしているため) が到着した場合、B の量指定子 * は最も広範囲に一致するため、このタプルは C ではなく B に一致するものと見なされます。最も広範囲なプロパティによって B が C よりも優先され、B との一致がより多くなります。または、パターン式が A B*? C であるとすると、B には最も限定的な量指定子が使用されるため、B と C の両方に一致するタプルは C とのみ一致するものとして処理されます。このように、C が B よりも優先され、B との一致はより少なくなります。
この句を使用すると、DEFINE 句に定義された 1 つ以上の相関変数をグループにまとめることができます。MEASURES (節 15.5「MEASURES 句」を参照) と DEFINE (節 15.3「DEFINE 句」) では、他の任意の相関変数と同様にこの名前付きサブセットを使用できます。

(non_mt_subset_definition_list::=)
non_mt_subset_definition_list::=


(subset_name::=、non_mt_corr_list::=)


例 15-14 のクエリ q55 と例 15-15 のデータ ストリーム S11 があるとします。ストリーム S11 のスキーマは (c1 integer, c2 integer) です。この例では、S1 から S6 までのサブセットを定義します。このクエリでは、入力ストリームの c2 属性の値が英字 W の形になる場合に一致が出力されます。ここで、この W の上昇部分を形成しているタプルの c2 の値の合計を出す必要があるとします。相関変数 X は最初の上昇部分となるタプルを表し、Z は 2 番目の上昇部分となるタプルを表します。ここで、これらの両方に一致するタプルをグループ化する手段が必要です。これは、例に示すような SUBSET 句を定義して行うことができます。
サブセット S4 は (X,Z) として定義されています。これは、X または Z のいずれかに一致する入力ストリームのタプルを参照します。このサブセットは MEASURES 句の文 sum(S4.c2) as sumIncrArm で使用されています。これによって、X または Z のいずれかに一致するタプルの c2 属性の値の合計が計算されます。S4.c2 = 10 のように DEFINE 句で S4.c2 を参照する場合は、X と一致するタプルおよび Z と一致するタプルの中で最新のタプルの c2 の値が参照されます。
サブセット S6 は (Y) として定義されています。これは、相関変数 Y に一致するすべてのタプルを参照します。
例 15-16 は、クエリで返されるストリームを示します。
例 15-14 SUBSET 句を使用した MATCH_RECOGNIZE のクエリ
<query id="q55"><![CDATA[ select T.firstW, T.lastZ, T.sumDecrArm, T.sumIncrArm, T.overallAvg from S11 MATCH_RECOGNIZE ( MEASURES S2.c1 as firstW, last(S1.c1) as lastZ, sum(S3.c2) as sumDecrArm, sum(S4.c2) as sumIncrArm, avg(S5.c2) as overallAvg PATTERN(A W+ X+ Y+ Z+) SUBSET S1 = (Z) S2 = (A) S3 = (A,W,Y) S4 = (X,Z) S5 = (A,W,X,Y,Z) S6 = (Y) DEFINE W as W.c2 < prev(W.c2), X as X.c2 > prev(X.c2), Y as S6.c2 < prev(Y.c2), Z as Z.c2 > prev(Z.c2) ) as T ]]></query>
例 15-15 SUBSET 句を使用した MATCH_RECOGNIZE のストリーム入力
Timestamp Tuple 1000 1,8 2000 2,8 3000 3,8 4000 4,6 5000 5,3 6000 6,7 7000 7,6 8000 8,2 9000 9,6 10000 10,2 11000 11,9 12000 12,9 13000 13,8 14000 14,5 15000 15,0 16000 16,9 17000 17,2 18000 18,0 19000 19,2 20000 20,3 21000 21,8 22000 22,5 23000 23,9 24000 24,9 25000 25,4 26000 26,7 27000 27,2 28000 28,8 29000 29,0 30000 30,4 31000 31,4 32000 32,7 33000 33,8 34000 34,6 35000 35,4 36000 36,5 37000 37,1 38000 38,7 39000 39,5 40000 40,8 41000 41,6 42000 42,6 43000 43,0 44000 44,6 45000 45,8 46000 46,4 47000 47,3 48000 48,8 49000 49,2 50000 50,5 51000 51,3 52000 52,3 53000 53,9 54000 54,8 55000 55,5 56000 56,5 57000 57,9 58000 58,7 59000 59,3 60000 60,3
例 15-16 SUBSET 句を使用した MATCH_RECOGNIZE のストリーム出力
Timestamp Tuple Kind Tuple 9000: + 3,9,25,13,5.428571 21000: + 12,21,24,22,4.6 28000: + 24,28,15,15,6.0 38000: + 33,38,19,12,5.1666665 48000: + 42,48,13,22,5.0
詳細については、以下を参照してください。
以下に、基本的な MATCH_RECOGNIZE の実際の例を示します。
その他の例については、『Oracle CEP 入門』を参照してください。
パターン検出
図 15-1 に示すような株価変動があります。このデータはインデックス番号 (または時間) および株価のストリームとして表すことができます。図 15-1 では、1 ~ 9 日および 12 ~ 19 日の間に二番底パターンと呼ばれるトレーディングの一般的な現象が発生しています。このパターンは、W 字形の株価変動 (下降 (X)、上昇 (Y)、下降 (W)、2 度目の上昇 (Z)) として視覚化されます。
例 15-17 は、c1 (インデックス番号 (または時間)) および c2 (株価) のスキーマを持つストリーム S2 に対するクエリ q を示します。このクエリでは PATTERN 句 (A W+ X+ Y+ Z+) を使用して、着信する株取引の二番底パターンを検出します。この句の相関名は以下のとおりです。
A : 二番底パターンの開始点に相当します。
相関名 A は各入力で true であるため、DEFINE 句で定義されていません。DEFINE 句に定義されていない相関名を指定した場合は、各入力で true と見なされます。
W+ : 二番底パターンの最初の下降部分に相当します。
これは W.stockprice < Prev(W.stockprice) として定義されます。この定義は、現在の価格が前の価格よりも低いことを意味します。
X+ : 二番底パターンの最初の上昇部分に相当します。
Y+ : 二番底パターンの 2 番目の下降部分に相当します。
Z+ : 二番底パターンの 2 番目の上昇部分に相当します。
例 15-17 単純なパターン検出 : クエリ
<query id="q"><![CDATA[ SELECT T.firstW, T.lastZ FROM S2 MATCH_RECOGNIZE ( MEASURES A.c1 as firstW, last(Z) as lastZ PATTERN(A W+ X+ Y+ Z+) DEFINE W as W.c2 < prev(W.c2), X as X.c2 > prev(X.c2), Y as Y.c2 < prev(Y.c2), Z as Z.c2 > prev(Z.c2) ) as T ]]></query>
Partition By を使用したパターン検出
図 15-2 に示すような株価変動があります。このデータはインデックス番号 (または時間) および株価のストリームとして表すことができます。この例では、複数の株価表示記号のデータがストリームに含まれています。図 15-2 では、銘柄 BOFA の 1 ~ 9 日および 12 ~ 19 日の間に二番底パターンと呼ばれるトレーディングの一般的な現象が発生しています。このパターンは、W 字形の株価変動 (下降 (X)、上昇 (Y)、下降 (W)、2 度目の上昇 (Z)) として視覚化されます。
例 15-18 は、c1 (インデックス番号 (または時間)) および c2 (株価) のスキーマを持つストリーム S2 に対するクエリ q を示します。このクエリでは PATTERN 句 (A W+ X+ Y+ Z+) を使用して、着信する株取引の二番底パターンを検出します。この句の相関名は以下のとおりです。
A : 二番底パターンの開始点に相当します。
W+ : 二番底パターンの最初の下降部分に相当します。これは W.stockprice < Prev(W.stockprice) として定義され、現在の価格が前の価格よりも低いことを意味します。
X+ : 二番底パターンの最初の上昇部分に相当します。
Y+ : 二番底パターンの 2 番目の下降部分に相当します。
Z+ : 二番底パターンの 2 番目の上昇部分に相当します。
クエリでは PARTITION BY 句を使用して入力ストリームを株価表示記号別に分割し、各論理ストリームにこの PATTERN 句を適用します。
例 15-18 Partition By を使用したパターン検出 : クエリ
<query id="q"><![CDATA[ SELECT T.firstW, T.lastZ FROM S2 MATCH_RECOGNIZE ( PARTITION BY A.ticker MEASURES A.c1 as firstW, last(Z) as lastZ PATTERN(A W+ X+ Y+ Z+) DEFINE W as W.c2 < prev(W.c2), X as X.c2 > prev(X.c2), Y as Y.c2 < prev(Y.c2), Z as Z.c2 > prev(Z.c2) ) as T ]]></query>
集約を使用したパターン検出
例 15-19 のクエリ q1 と例 15-20 のデータ ストリーム S があるとします。ストリーム S のスキーマは (c1 integer) です。例 15-21 は、クエリで返されるストリームを示します。
例 15-19 集約を使用したパターン検出 : クエリ
<query id="q1"><![CDATA[ SELECT T.sumB FROM S MATCH_RECOGNIZE ( MEASURES sum(B.c1) as sumB PATTERN(A B* C) DEFINE A as ((A.c1 < 50) AND (A.c1 > 35)), B as B.c1 > avg(A.c1), C as C.c1 > prev(C.c1) ) as T ]]></query>
例 15-20 集約を使用したパターン検出 : ストリーム入力
Timestamp Tuple 1000 40 2000 52 3000 60 4000 58 5000 57 6000 56 7000 55 8000 59 9000 30 10000 40 11000 52 12000 60 13000 58 14000 57 15000 56 16000 55 17000 30 18000 10 19000 20 20000 30 21000 10 22000 25 23000 25 24000 25 25000 25
イベントの欠落の検出
異なる 5 つの部屋の間を移動するオブジェクトがあります。毎回部屋 1 から出発し、5 分以内に部屋 5 に到着する必要があります。図 15-3 は、オブジェクトのパフォーマンスを示しています。このデータは時間と部屋番号のストリームとして表すことができます。オブジェクトが時間 1 に部屋 1 から出発したときは、予期したとおり時間 5 に部屋 5 に到着しています。しかし、時間 6 に部屋 1 から出発したときは、時間 11 に部屋 5 に到着できず、時間 12 に部屋 5 に到着しています。時間 15 に部屋 1 から出発したときは、予期したとおり時間 20 に部屋 5 に到着しています。しかし、時間 23 に部屋 1 から出発したときは、時間 28 に部屋 5 に到着できず、時間 30 に部屋 5 に到着しています。時間 5 および 20 の成功は、イベントと見なされます。これは、オブジェクトが適切な時間に部屋 5 に到着したことを示します。時間 11 および 28 の失敗は、イベントの欠落と見なされます。これは、予期された到着イベントが発生しなかったことを示します。Oracle CQL を使用すると、このようなイベントの欠落を照会できます。
例 15-22 は、ストリーム S (部屋番号を表す c1 integer スキーマを持つ) に対してイベントの欠落を検出するクエリ q を示します。オブジェクトが部屋 1 を出発してから 5 分以内に部屋 5 に到着しなかった場合は毎回クエリによって部屋 1 を出発した時刻が返されます。