ヘッダーをスキップ
Oracle® Complex Event Processing CQL言語リファレンス
11g リリース1(11.1.1)
B61613-01
  目次へ移動
目次
索引へ移動
索引

前
 
次
 

18 MATCH_RECOGNIZEを使用したパターン認識

Oracle CQLMATCH_RECOGNIZEコンストラクトおよびその副句によって、Oracle CQL問合せのパターン認識が実行されます。

18.1 MATCH_RECOGNIZEを使用したパターン認識について

Oracle CQLでは、MATCH_RECOGNIZEコンストラクトを使用したパターン認識機能が提供されます。

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

MATCH_RECOGNIZE問合せの出力は常にストリームです。

pattern_recognition_clause::=

pattern_recognition_clause.gifについては周囲のテキストで説明しています。

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

pattern_def_dur_clause::=

pattern_def_dur_clause.gifについては周囲のテキストで説明しています。

(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項「例」を参照してください。

18.2 ALL MATCHES句

Oracle CEPで重複するパターンの一致を構成するには、このオプションの句を使用します。ALL MATCHES句を省略すると、1つのパターンのみが一致するようにOracle CEPが構成されます。

pattern_skip_match_clause::=

pattern_skip_match_clause.gifについては周囲のテキストで説明しています。

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つの種類があります。

例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}のすべてのタプルが出力されます。

18.3 DEFINE句

基になる基本ストリームのタプルに対する1つ以上の条件を定義するには、この句を使用します。例18-1ABCのように、相関名と変数を使用して条件を参照します。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」を参照してください。

相関変数の定義では関数も使用できます。

pattern_definition_clause::=

pattern_definition_clause.gifについては周囲のテキストで説明しています。

(non_mt_corrname_definition_list::=)

non_mt_corrname_definition_list::=

non_mt_corrname_def_list.gifについては周囲のテキストで説明しています。

(correlation_name_definition::=)

correlation_name_definition::=

correlation_name_definition.gifについては周囲のテキストで説明しています。

(correlation_name::=non_mt_cond_list::=)

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

18.4 DURATION句

DURATION句は、イベントの欠落を検出する問合せを作成する場合にのみ使用する必要のあるオプションの句です。イベントの欠落の検出では、特定の制限時間内に発生するはずの特定のイベントが時間内に発生しない状況が検出されます。

duration_clause::=

duration_clause_fixed.gifについては周囲のテキストで説明しています。

(time_unit::=)

この句を使用すると、PATTERN句の正規表現が完全に一致し、DURATION句に指定された期間が期限切れになるまで他のイベントまたは入力が到着しない場合にのみ、一致が報告されます。期間は、パターンの一致の最初のイベントが到着した時点から計測されます。

この項の内容は、次のとおりです。


注意:

DURATION句とWITHIN句を併用することはできません。詳細は、18.7.2項「PATTERN句とWITHIN句の使用」を参照してください。

18.4.1 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の時点で一致が報告されます。同様のロジックに従って、以降の出力が生成されます。

詳細は、「固定期間のイベント欠落の検出」を参照してください。

18.4.2 DURATION句を使用した反復的なイベント欠落の検出

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およびそれ以降は同様に出力が行われます。

18.5 MEASURES句

DEFINE句の条件(相関変数)に一致する基本ストリーム内のタプルの属性に対する式を定義し、このMATCH_RECOGNIZE条件を含む主要問合せのSELECT句でそれらの式を適切に使用できるよう、式の別名を指定するには、この句を使用します。基本ストリームの属性は、直接参照するか、または相関変数によって参照できます。

任意のOracle CQL組込み関数またはユーザー定義関数を使用できます(1.1.11項「関数」を参照)。

pattern_measures_clause::=

pattern_measures_clause.gifについては周囲のテキストで説明しています。

(non_mt_measure_list::=)

non_mt_measure_list::=

non_mt_measure_list.gifについては周囲のテキストで説明しています。

(measure_column::=)

measure_column::=

measure_column.gifについては周囲のテキストで説明しています。

(arith_expr::=identifier::=)

例18-1で、pattern_measures_clauseは次のとおりです。

MEASURES
    A.itemId as itemId

A.c1のように、基になるストリームまたはストリームに評価されるビューの属性を相関変数を使用して参照した場合、c1の値は相関変数Aに対応する条件に最後に一致したタプルの値になります。DEFINE句でAが定義されていない場合は、常にTRUEと見なされます。そのため、入力のすべてのタプルは効率的にAと一致します。A.c1の値は、最後に処理されたタプルのc1の値になります。

18.6 PARTITION BY句

MATCH_RECOGNIZE句の結果を分割するためのストリームの属性を指定するには、このオプションの句を使用します。

pattern_partition_clause::=

pattern_partition_clause.gifについては周囲のテキストで説明しています。

(non_mt_attr_list::=)

例18-1で、pattern_partition_clauseは次のとおりです。

PARTITION BY 
    itemId

パターン内のpartition by句は、partitionリスト内の属性に基づいて入力ストリームが論理的に分割され、その分割内でパターン・マッチングが行われることを意味します。

例18-12のようなスキーマ(c1 integer, c2 integer)を持つストリームSがあるとします。

例18-12 入力ストリームS1

     c1  c2
1000 10, 1
2000 10, 2
3000 20, 2
4000 20, 1

例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の定義と一致しますが、タプルが別の分割に属しているため、最初の分割では一致として提示されません。

18.7 PATTERN句

DEFINE句に定義された相関変数に対して一致させるパターンを正規表現として指定するには、この句を使用します(18.3項「DEFINE句」を参照)。これらの正規表現ではDEFINE句で定義されていない相関変数も使用できますが、それらは常にTRUEと見なされるため、各入力に一致します。

pattern_clause::=

pattern_clause.gifについては周囲のテキストで説明しています。

(regexp::=within_clause::=)

within_clause::=

within_clause.gifについては周囲のテキストで説明しています。

(time_spec::=)

regexp::=

regexp.gifについては周囲のテキストで説明しています。

(correlation_name::=pattern_quantifier::=)

correlation_name::=

correlation_name.gifについては周囲のテキストで説明しています。

(const_string::=)

pattern_quantifier::=

pattern_quantifier.gifについては周囲のテキストで説明しています。

表18-1は、Oracle CQLでサポートされるパターン量指定子(pattern_quantifier::=)を示しています。パターン量指定子を使用して、A*またはA+?などのパターン一致の動作を指定します。

1文字のパターン量指定子は、最大または最も広範囲に一致します。正規表現の可能な最大インスタンス数との一致が試みられます。2文字のパターン数量子は、最小または最も限定的に一致します。正規表現の可能な最小インスタンス数との一致が試みられます。

表18-1 MATCH_RECOGNIZEのパターン量指定子

最大 最小 説明

*

*?

0回以上

+

+?

1回以上

?

??

0 または1回


量指定のないパターン(Aなど)は厳密に1つの一致を必要とする量指定子を持つものと想定されます。

この項の内容は、次のとおりです。

18.7.1 PATTERN句の使用

例18-1で、pattern_clauseは次のとおりです。

PATTERN (A B* C)

このパターン句では、連続する入力タプルによって次の条件が満たされた場合に、パターンの一致が認識され、報告されます。

  1. 1つのタプルが相関変数Aを定義する条件と一致する

  2. 0個以上のタプルが相関変数Bと一致する

  3. 1つのタプルが相関変数Cと一致する

2で、相関変数BCの両方に一致するタプル(これらの定義条件を両方とも満たしているため)が到着した場合、Bの量指定子*は最も広範囲に一致するため、このタプルはCではなくBに一致するものと見なされます。最も広範囲なプロパティによってBCよりも優先され、Bとの一致がより多くなります。または、パターン式がA B*? Cであるとすると、Bには最も限定的な量指定子が使用されるため、BCの両方に一致するタプルはCとのみ一致するものとして処理されます。このように、CBよりも優先され、Bとの一致はより少なくなります。

詳細は、以下を参照してください。

18.7.2 PATTERN句とWITHIN句の使用

WITHIN句は、一致が指定された期間内にのみ発生する場合、pattern_clauseの一致を出力します。すなわち、次の場合です。

TL - TF < WD

説明:

  • TL - パターンに一致する最後のイベントのタイムスタンプ。

  • TF - パターンに一致する最初のイベントのタイムスタンプ。

  • WD - WITHIN句で指定された期間。

WITHIN INCLUSIVE句は境界でのイベントの一致も試みます。すなわち、次の場合に一致を出力します。

TL - TF <= WD

一致が指定された期間内に完了した場合、イベントは発生するとただちに出力されます。すなわち、一致を出力できる場合、完了時のタイムスタンプとともに出力されます。WITHIN句は、DURATION句のように期間が期限切れになるのを待機しません。

WITHIN句の期間が期限切れになると、不完全な一致候補はすべて破棄されます。

詳細は、18.9.4項「WITHIN句を使用したパターン検出」を参照してください。


注意:

WITHIN句とDURATION句を併用することはできません。詳細は、18.4項「DURATION句」を参照してください。

18.8 SUBSET句

この句を使用すると、DEFINE句に定義された1つ以上の相関変数をグループにまとめることができます。MEASURES(18.5項「MEASURES句」を参照)とDEFINE(19.3項「DEFINE句」を参照)では、他の任意の相関変数と同様にこの名前付きサブセットを使用できます。

subset_clause::=

subset_clause.gifについては周囲のテキストで説明しています。

(non_mt_subset_definition_list::=)

non_mt_subset_definition_list::=

non_mt_subset_def_list.gifについては周囲のテキストで説明しています。

(subset_definition::=)

subset_definition::=

subset_definition.gifについては周囲のテキストで説明しています。

(subset_name::=non_mt_corr_list::=)

subset_name::=

subset_name.gifについては周囲のテキストで説明しています。

(const_string::=)

non_mt_corr_list::=

non_mt_corr_list.gifについては周囲のテキストで説明しています。

(correlation_name::=)

例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

詳細は、以下を参照してください。

18.9

次に、基本的なMATCH_RECOGNIZEの実際の例を示します。

詳細は、Oracle CEPスタート・ガイドを参照してください。

18.9.1 パターン検出

図18-1に示すような株価変動があります。このデータはインデックス番号(または時間)および株価のストリームとして表すことができます。図18-1では、1 - 9日および12 - 19日の間に二番底パターンと呼ばれるトレーディングの一般的な現象が発生しています。このパターンは、W字形の株価変動(下降(X)、上昇(Y)、下降(W)、2度目の上昇(Z))として視覚化されます。

図18-1 パターン検出: 二番底の価格変動

図18-1の説明が続きます
「図18-1 パターン検出: 二番底の価格変動」の説明

例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-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>

18.9.2 Partition Byを使用したパターン検出

図18-2に示すような株価変動があります。このデータはインデックス番号(または時間)および株価のストリームとして表すことができます。この例では、複数の株価表示記号のデータがストリームに含まれています。図18-2では、銘柄BOFAの1 - 9日および12 - 19日の間に二番底パターンと呼ばれるトレーディングの一般的な現象が発生しています。このパターンは、W字形の株価変動(下降(X)、上昇(Y)、下降(W)、2度目の上昇(Z))として視覚化されます。

図18-2 Partition Byを使用したパターン検出: 株価変動

図18-2の説明が続きます
「図18-2 Partition Byを使用したパターン検出: 株価変動」の説明

例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.9.3 集計を使用したパターン検出

例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-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

例18-21 集計を使用したパターン検出: ストリーム出力

Timestamp   Tuple
8000        338
12000       52

18.9.4 WITHIN句を使用したパターン検出

例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-2queryWithin問合せに示すように、候補一致はTimeStamp=1000のイベントで開始され、WITHIN句の期間が3秒であるため、TimeStamp=4000のイベントの前に完了する場合にのみ、問合せで一致が出力されます。問合せがTimeStampe=4000のイベントを受け取る場合、その時点までの最大の一致が出力されます(ALL MATCHESを使用していないため)。TimeStamp=4000のイベントはBに一致しますが、一致には含められません。次の一致はTimeStamp=4000のイベントで開始されます。このイベントはAにも一致し、前の一致がTimeStamp=3000に終了するためです。

表18-2queryWithinInclusive問合せに示すように、候補一致はTimeStamp=1000のイベントで開始されます。問合せがTimeStamp=4000のイベントを受け取る場合、問合せではWITHIN INCLUSIVEが使用され、イベントがBに一致するため、このイベントは一致に含められます。TimeStamp=5000のイベントはBに一致しますが、一致の開始(TimeStamp=1000)から測定した期間(3秒)を超えているため、パターンはこれ以上拡張されません。一致はTimeStamp=4000に終了しており、ALL MATCHESを使用していないため、Aと一致する場合であっても、次の一致はTimeStamp=4000に開始されません。

詳細は、以下を参照してください。

18.9.5 固定期間のイベント欠落の検出

異なる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-3 固定期間のイベント欠落の検出

図18-3の説明が続きます
「図18-3 固定期間のイベント欠落の検出」の説明

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