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句」を参照してください。