Oracle CQLMATCH_RECOGNIZE
コンストラクトおよびその副句によって、Oracle CQL問合せのパターン認識が実行されます。
Oracle CQLでは、MATCH_RECOGNIZE
コンストラクトを使用したパターン認識機能が提供されます。
入力ストリームの連続するイベントまたはタプルのシーケンスが特定の条件を満たす場合は、パターンが構成されます。Oracle CQLのパターン認識機能では、着信イベントまたはタプルの属性に条件を定義し、相関変数と呼ばれるString
名を使用してこれらの条件を識別できます(18.3項「DEFINE句」)。照合されるパターンは、これらの相関変数に対する正規表現として指定され、様々な着信タプルが有効な一致として見なされるために満たす必要のある条件のシーケンスまたは順序を決定します(18.7項「PATTERN句」を参照)。正規表現の使用によって、認識されるパターンを指定する際の表現が向上します。パターンの指定に一致するタプルの属性に対して計算を実行し、MATCH_RECOGNIZE
を含む問合せのSELECT
句でそれらを使用できます(18.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::=)
例18-1に、問合せの一般的なMATCH_RECOGNIZE
条件を示します。問合せでは、PATTERN
句で制限されたDEFINE句
の条件が満たされた場合に、select文のMEASURES
句の値が返されます。
例18-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
コンストラクトでは、次の副句が提供されます。
その他の例については、18.9項「例」を参照してください。
Oracle CEPで重複するパターンの一致を構成するには、このオプションの句を使用します。ALL MATCHES
句を省略すると、1つのパターンのみが一致するようにOracle CEPが構成されます。
ALL MATCHES
を使用する例18-2の問合せtkpattern_q41
と例18-3のデータ・ストリームtkpattern_S11
があるとします。ストリームtkpattern_S11
のスキーマは(c1 integer, c2 integer)
です。例18-4は、問合せで返されるストリームを示します。
例18-2の問合せtkpattern_q41
では、入力ストリーム値のプロットが英字Wの形になる場合に一致が報告されます。例18-4のリレーションは、このWパターン一致の重複するインスタンスの例を示します。
重複するパターンのインスタンスには2つの種類があります。
全体: 全体的な重複の例: 入力に含まれる時間3000-9000および4000-9000の行は両方とも指定されたパターン式に一致します。ALL MATCHES
句がない場合は、長い方(3000-9000)が使用されます。
部分: 部分的な重複の例: 入力に含まれる時間12000-21000および16000-23000の行は両方とも指定されたパターン式に一致します。ALL MATCHES
句がない場合は、先に出現した方が使用されます。これは、ALL MATCHES
句を省略した場合は、以前に一致したパターン・インスタンスの最後のタプルの次のタプルから、パターンに一致する次のインスタンスの検索が開始されるためです。
例18-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>
例18-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
例18-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
例18-4に示すように、ALL MATCHES
句では特定の入力が受信されると、一致するすべてのパターン・インスタンスが報告されます。たとえば、時間20000では{12,20}
、{13,20}
および{14,20}
のすべてのタプルが出力されます。
基になる基本ストリームのタプルに対する1つ以上の条件を定義するには、この句を使用します。例18-1のA
、B
、C
のように、相関名と変数を使用して条件を参照します。MATCH_RECOGNIZE
条件のPATTERN
句では、これらの相関変数に対して認識されるパターンを正規表現として指定します(18.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::=)
例18-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と見なされます。例18-5に示すように、相関名A
は各入力でtrueであるため、DEFINE
句に定義されていません。PATTERN
句で使用されていない相関名を定義するとエラーになります。
例18-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>
詳細は、18.7項「PATTERN句」を参照してください。
DURATION
句は、イベントの欠落を検出する問合せを作成する場合にのみ使用する必要のあるオプションの句です。イベントの欠落の検出では、特定の制限時間内に発生するはずの特定のイベントが時間内に発生しない状況が検出されます。
この句を使用すると、PATTERN
句の正規表現が完全に一致し、DURATION
句に指定された期間が期限切れになるまで他のイベントまたは入力が到着しない場合にのみ、一致が報告されます。期間は、パターンの一致の最初のイベントが到着した時点から計測されます。
この項の内容は、次のとおりです。
期間は、10などの定数値として指定できます。オプションで、秒や分などの時間単位を指定できます(time_unit::=を参照)。デフォルトの時間単位は秒です。
DURATION 10
を使用して10秒(10000 ms)の遅延を指定する例18-6の問合せtkpattern_q59
と、例18-7のデータ・ストリームtkpattern_S19
があるとします。ストリームtkpattern_S19
のスキーマは(c1 integer)
です。例18-8は、問合せで返されるストリームを示します。
例18-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>
例18-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
例18-8 固定期間DURATION句を使用したMATCH_RECOGNIZEのストリーム出力
Timestamp Tuple Kind Tuple 11000: + 10,88 25000: + 10, 38000: + 10,18 50000: + 10,19 62000: + 10,
時間1000のタプルはA
に一致します。
期間は10であるため、1000+10000=11000
の時点で入力を受け取るとすぐに一致が出力されます(値が12の)。1000から9000までのタプルのシーケンスはパターンAB*
に一致するため、11000の時点で入力を受け取るとすぐに一致が報告されます。
次の一致は、その時点でA
に一致するタプルのある15000の時点で開始されます。次のタプルの到着は時間27000です。ここでもまた、パターンAB*
を満たすタプルがあるため、15000+10000=25000
の時点で一致が報告されます。同様のロジックに従って、以降の出力が生成されます。
詳細は、「固定期間のイベント欠落の検出」を参照してください。
MULTIPLES OF
句を指定した場合は、反復的なイベント欠落の検出が示されます。この場合、パターンが完全に一致した後にイベントが発生しないかぎり、期間値の倍数の時点で出力が送信されます。
DURATION MULTIPLES OF 10
を使用して10秒(10000 ms)の遅延を指定する例18-9の問合せtkpattern_q75
と、例18-10のデータ・ストリームtkpattern_S23
があるとします。ストリームtkpattern_S23
のスキーマは(c1 integer)
です。例18-11は、問合せで返されるストリームを示します。
例18-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>
例18-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
例18-11 可変期間DURATION MULTIPLES OF句を使用したMATCH_RECOGNIZEのストリーム出力
Timestamp Tuple Kind Tuple 11000: + 10,88,637 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.11項「関数」を参照)。
例18-1で、pattern_measures_clause
は次のとおりです。
MEASURES A.itemId as itemId
A.c1
のように、基になるストリームまたはストリームに評価されるビューの属性を相関変数を使用して参照した場合、c1
の値は相関変数A
に対応する条件に最後に一致したタプルの値になります。DEFINE
句でA
が定義されていない場合は、常にTRUE
と見なされます。そのため、入力のすべてのタプルは効率的にA
と一致します。A.c1
の値は、最後に処理されたタプルのc1
の値になります。
MATCH_RECOGNIZE
句の結果を分割するためのストリームの属性を指定するには、このオプションの句を使用します。
例18-1で、pattern_partition_clause
は次のとおりです。
PARTITION BY itemId
パターン内のpartition by句は、partitionリスト内の属性に基づいて入力ストリームが論理的に分割され、その分割内でパターン・マッチングが行われることを意味します。
例18-12のようなスキーマ(c1 integer, c2 integer)
を持つストリームS
があるとします。
例18-13のようなMATCH_RECOGNIZE
の問合せがあるとします。
例18-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
例18-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
句に定義された相関変数に対して一致させるパターンを正規表現として指定するには、この句を使用します(18.3項「DEFINE句」を参照)。これらの正規表現ではDEFINE
句で定義されていない相関変数も使用できますが、それらは常にTRUE
と見なされるため、各入力に一致します。
(correlation_name::=、pattern_quantifier::=)
表18-1は、Oracle CQLでサポートされるパターン量指定子(pattern_quantifier::=)を示しています。パターン量指定子を使用して、A*
またはA+?
などのパターン一致の動作を指定します。
1文字のパターン量指定子は、最大または最も広範囲に一致します。正規表現の可能な最大インスタンス数との一致が試みられます。2文字のパターン数量子は、最小または最も限定的に一致します。正規表現の可能な最小インスタンス数との一致が試みられます。
量指定のないパターン(A
など)は厳密に1つの一致を必要とする量指定子を持つものと想定されます。
この項の内容は、次のとおりです。
例18-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
との一致はより少なくなります。
詳細は、以下を参照してください。
WITHIN
句は、一致が指定された期間内にのみ発生する場合、pattern_clause
の一致を出力します。すなわち、次の場合です。
TL - TF < WD
説明:
TL
- パターンに一致する最後のイベントのタイムスタンプ。
TF
- パターンに一致する最初のイベントのタイムスタンプ。
WD
- WITHIN
句で指定された期間。
WITHIN INCLUSIVE
句は境界でのイベントの一致も試みます。すなわち、次の場合に一致を出力します。
TL - TF <= WD
一致が指定された期間内に完了した場合、イベントは発生するとただちに出力されます。すなわち、一致を出力できる場合、完了時のタイムスタンプとともに出力されます。WITHIN
句は、DURATION
句のように期間が期限切れになるのを待機しません。
WITHIN
句の期間が期限切れになると、不完全な一致候補はすべて破棄されます。
詳細は、18.9.4項「WITHIN句を使用したパターン検出」を参照してください。
この句を使用すると、DEFINE
句に定義された1つ以上の相関変数をグループにまとめることができます。MEASURES
(18.5項「MEASURES句」を参照)とDEFINE
(19.3項「DEFINE句」を参照)では、他の任意の相関変数と同様にこの名前付きサブセットを使用できます。
(non_mt_subset_definition_list::=)
non_mt_subset_definition_list::=
(subset_name::=、non_mt_corr_list::=)
例18-14の問合せq55
と例18-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
に一致するすべてのタプルを参照します。
例18-16は、問合せで返されるストリームを示します。
例18-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>
例18-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
例18-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スタート・ガイドを参照してください。
図18-1に示すような株価変動があります。このデータはインデックス番号(または時間)および株価のストリームとして表すことができます。図18-1では、1 - 9日および12 - 19日の間に二番底パターンと呼ばれるトレーディングの一般的な現象が発生しています。このパターンは、W字形の株価変動(下降(X)
、上昇(Y)
、下降(W)
、2度目の上昇(Z)
)として視覚化されます。
例18-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番目の上昇部分に相当します。
図18-2に示すような株価変動があります。このデータはインデックス番号(または時間)および株価のストリームとして表すことができます。この例では、複数の株価表示記号のデータがストリームに含まれています。図18-2では、銘柄BOFAの1 - 9日および12 - 19日の間に二番底パターンと呼ばれるトレーディングの一般的な現象が発生しています。このパターンは、W字形の株価変動(下降(X
)、上昇(Y
)、下降(W
)、2度目の上昇(Z
))として視覚化されます。
例18-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
句を適用します。
例18-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>
例18-19の問合せq1
と例18-20のデータ・ストリームS
があるとします。ストリームS
のスキーマは(c1 integer)
です。例18-21は、問合せで返されるストリームを示します。
例18-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>
例18-22および例18-23の問合せと例18-24のデータ・ストリームS
があるとします。ストリームS
のスキーマは(c1 integer, c2 integer)
です。表18-2で、これらの問合せの出力を比較します。
例18-22 PATTERN句とWITHIN句
<query id="queryWithin"><![CDATA[
SELECT T.Ac2, T.Bc2, T.Cc2
FROM S
MATCH_RECOGNIZE(
MEASURES A.c2 as Ac2, B.c2 as Bc2, C.c2 as Cc2
PATTERN (A (B+ | C)) within 3000 milliseconds
DEFINE
A as A.c1=10 or A.c1=25,
B as B.c1=20 or B.c1=15 or B.c1=25,
C as C.c1=15
) as T
]]></query>
例18-23 PATTERN句とWITHIN INCLUSIVE句
<query id="queryWithinInclusive"><![CDATA[
SELECT T.Ac2, T.Bc2, T.Cc2
FROM S
MATCH_RECOGNIZE(
MEASURES A.c2 as Ac2, B.c2 as Bc2, C.c2 as Cc2
PATTERN (A (B+ | C)) within inclusive 3000 milliseconds
DEFINE
A as A.c1=10 or A.c1=25,
B as B.c1=20 or B.c1=15 or B.c1=25,
C as C.c1=15
) as T
]]></query>
例18-24 WITHIN句を使用したパターン検出: ストリーム入力
Timestamp Tuple 1000 10,100 h 2000 3000 15,200 3000 20,300 4000 25,400 5000 20,500 6000 20,600 7000 35,700 8000 10,800 9000 15,900 h 11000 11000 20,1000 11000 50,1100
表18-2 WITHINおよびWITHIN INCLUSIVEの問合せの出力
問合せqueryWithin | 問合せqueryWithinInclusive |
---|---|
Timestamp Tuple Kind Tuple 3000: + 100,300, 6000: + 400,600, 9000: + 800,900, |
Timestamp Tuple Kind Tuple 4000: + 100,400, 11000: + 800,1000, |
表18-2のqueryWithin
問合せに示すように、候補一致はTimeStamp=1000
のイベントで開始され、WITHIN
句の期間が3秒であるため、TimeStamp=4000
のイベントの前に完了する場合にのみ、問合せで一致が出力されます。問合せがTimeStampe=4000
のイベントを受け取る場合、その時点までの最大の一致が出力されます(ALL MATCHES
を使用していないため)。TimeStamp=4000
のイベントはB
に一致しますが、一致には含められません。次の一致はTimeStamp=4000
のイベントで開始されます。このイベントはA
にも一致し、前の一致がTimeStamp=3000
に終了するためです。
表18-2のqueryWithinInclusive
問合せに示すように、候補一致はTimeStamp=1000
のイベントで開始されます。問合せがTimeStamp=4000
のイベントを受け取る場合、問合せではWITHIN INCLUSIVE
が使用され、イベントがB
に一致するため、このイベントは一致に含められます。TimeStamp=5000
のイベントはB
に一致しますが、一致の開始(TimeStamp=1000
)から測定した期間(3秒)を超えているため、パターンはこれ以上拡張されません。一致はTimeStamp=4000
に終了しており、ALL MATCHES
を使用していないため、A
と一致する場合であっても、次の一致はTimeStamp=4000
に開始されません。
詳細は、以下を参照してください。
異なる5つの部屋の間を移動するオブジェクトがあります。毎回部屋1から出発し、5分以内に部屋5に到着する必要があります。図18-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を使用すると、このようなイベントの欠落を問合せできます。
例18-25は、ストリームS
(部屋番号を表すc1
integerスキーマを持つ)に対してイベントの欠落を検出する問合せq
を示します。オブジェクトが部屋1を出発してから5分以内に部屋5に到着しなかった場合は毎回問合せによって部屋1を出発した時刻が返されます。
例18-25 固定期間のイベント欠落の検出: 問合せ
<query id="q"><![CDATA[ select T.Atime FROM S MATCH_RECOGNIZE( MEASURES A.ELEMENT_TIME as Atime INCLUDE TIMER EVENTS PATTERN (A B*) DURATION 5 MINUTES DEFINE A as A.c1 = 1, B as B.c1 != 5 ) as T ]]></query>
詳細は、18.4項「DURATION句」を参照してください。