ヘッダーをスキップ
Oracle® CEP CQL 言語リファレンス
11g リリース 1 (11.1.1)
B55504-01
  目次
目次
索引
索引

戻る
戻る
 
次へ
次へ
 

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

Oracle CQL の MATCH_RECOGNIZE 構成体およびその下位の句によって、Oracle CQL クエリのパターン認識が実行されます。

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

Oracle CQL では、MATCH_RECOGNIZE 構成体を使用したパターン認識機能が提供されます。

入力ストリームの連続するイベントまたはタプルのシーケンスが特定の条件を満たす場合は、パターンが構成されます。Oracle CQL のパターン認識機能では、着信イベントまたはタプルの属性に条件を定義し、相関変数と呼ばれる String 名を使用してこれらの条件を識別できます (節 15.3「DEFINE 句」)。照合されるパターンは、これらの相関変数に対する正規表現として指定され、さまざまな着信タプルが有効な一致として見なされるために満たす必要のある条件のシーケンスまたは順序を決定します (節 15.7「PATTERN 句」を参照)。正規表現の使用によって、認識されるパターンを指定する際の表現が向上します。パターンの指定に一致するタプルの属性に対して計算を実行し、MATCH_RECOGNIZE を含むクエリの SELECT 句でそれらを使用できます (節 15.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::=)

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

15.2 ALL MATCHES 句

Oracle CEP で重複するパターンの一致をコンフィグレーションするには、この省略可能な句を使用します。ALL MATCHES 句を省略すると、1 つのパターンのみが一致するように Oracle CEP がコンフィグレーションされます。

pattern_skip_match_clause::=

pattern_skip_match_clause.gif を説明する関連テキスト

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

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

15.3 DEFINE 句

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

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

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::=)

例 15-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 と見なされます。例 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 句」を参照してください。

15.4 DURATION 句

DURATION 句は、イベントの欠落を検出するクエリを作成する場合にのみ使用する必要のある省略可能な句です。イベントの欠落の検出では、特定の制限時間内に発生するはずの特定のイベントが時間内に発生しない状況が検出されます。例については、「イベントの欠落の検出」を参照してください。

duration_clause::=

duration_clause.gif を説明する関連テキスト

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

15.5 MEASURES 句

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

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

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::=)

例 15-1 で、pattern_measures_clause は以下のとおりです。

MEASURES
    A.itemId as itemId

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

15.6 PARTITION BY 句

MATCH_RECOGNIZE 句の結果を分割するためのストリームの属性を指定するには、この省略可能な句を使用します。

pattern_partition_clause::=

pattern_partition_clause.gif を説明する関連テキスト

(non_mt_attr_list::=)

例 15-1 で、pattern_partition_clause は以下のとおりです。

PARTITION BY 
    itemId

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

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

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

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

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

15.7 PATTERN 句

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

pattern_clause::=

pattern_clause.gif を説明する関連テキスト

(regexp::=)

regexp::=

regexp.gif を説明する関連テキスト

(correlation_name::=pattern_quantifier::=)

correlation_name::=

correlation_name.gif を説明する関連テキスト

(const_string::=)

pattern_quantifier::=

pattern_quantifier.gif を説明する関連テキスト

表 15-1 は、Oracle CQL でサポートされるパターン量指定子 (pattern_quantifier::=) を示しています。パターン量指定子を使用して、パターン一致の動作を指定します。1 文字のパターン量指定子は、最大または最も広範囲に一致します。正規表現の可能な最大インスタンス数との一致が試みられます。2 文字のパターン数量子は、最小または最も限定的に一致します。正規表現の可能な最小インスタンス数との一致が試みられます。

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

最大 最小 説明

*

*?

0 回以上

+

+?

1 回以上

?

??

0 または 1 回


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

例 15-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 との一致はより少なくなります。

15.8 SUBSET 句

この句を使用すると、DEFINE 句に定義された 1 つ以上の相関変数をグループにまとめることができます。MEASURES (節 15.5「MEASURES 句」を参照) と DEFINE (節 15.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::=)

例 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

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

15.9

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

その他の例については、『Oracle CEP 入門』を参照してください。

パターン検出

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

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

図 15-1 の説明
「図 15-1 パターン検出 : 二番底の価格変動」の説明

例 15-17 は、c1 (インデックス番号 (または時間)) および c2 (株価) のスキーマを持つストリーム S2 に対するクエリ q を示します。このクエリでは PATTERN 句 (A W+ X+ Y+ Z+) を使用して、着信する株取引の二番底パターンを検出します。この句の相関名は以下のとおりです。

例 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-2 Partition By を使用したパターン検出 : 株価変動

図 15-2 の説明
「図 15-2 Partition By を使用したパターン検出 : 株価変動」の説明

例 15-18 は、c1 (インデックス番号 (または時間)) および c2 (株価) のスキーマを持つストリーム S2 に対するクエリ q を示します。このクエリでは PATTERN 句 (A W+ X+ Y+ Z+) を使用して、着信する株取引の二番底パターンを検出します。この句の相関名は以下のとおりです。

クエリでは 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

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

Timestamp   Tuple
8000        338
12000       52

イベントの欠落の検出

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

図 15-3 の説明
「図 15-3 イベントの欠落の検出」の説明

例 15-22 は、ストリーム S (部屋番号を表す c1 integer スキーマを持つ) に対してイベントの欠落を検出するクエリ q を示します。オブジェクトが部屋 1 を出発してから 5 分以内に部屋 5 に到着しなかった場合は毎回クエリによって部屋 1 を出発した時刻が返されます。

例 15-22 イベントの欠落の検出 : クエリ

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