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

前
 
次
 

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

この章では、Oracle Continuous Query Language (Oracle CQL)のMATCH_RECOGNIZE句に関するリファレンスと使用情報を提供します。この句とその副句は、Oracle CQL問合せでパターン認識を実行します。

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

例19-1に示すように、MATCH_RECOGNIZE句によってOracle CQL問合せのパターン認識が実行されます。この問合せにより、DEFINE句の条件についてPATTERN句の正規表現を満たすイベント(タプル)のMEASURES句の値がエクスポートされます(SELECT内への包含が可能になります)。

例19-1 MATCH_RECOGNIZEとのパターン・マッチング

<query id="detectPerish"><![CDATA[ 
  select its.badItemId
  from tkrfid_ItemTempStream 
  MATCH_RECOGNIZE (
      PARTITION BY itemId
      MEASURES A.itemId as badItemId
      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>

pattern_recognition_clause::=

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

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

pattern_def_dur_clause::=

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

(pattern_clause::=pattern_skip_match_clause::=pattern_definition_clause::=duration_clause::=subset_clause::=)

MATCH_RECOGNIZEを使用して、着信イベントの属性の条件を定義し、相関変数と呼ばれるidentifiersを使用して、これらの条件を識別します。例19-1では、相関変数ABおよびCが定義されています。入力ストリームの連続するイベントのシーケンスがこれらの条件を満たす場合は、パターンが構成されます。

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

主なMATCH_RECOGNIZE副句には次のものがあります。

パターン認識を調整するには、次のようなオプションのMATCH_RECOGNIZE副句を使用できます。

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

19.1.1 MATCH_RECOGNIZE句とWHERE句

Oracle CQLでは(SQLと同様)、FROM句はWHERE句の前に評価されます。

次のOracle CQL問合せがあるとします。

SELECT ... FROM S MATCH_RECOGNIZE ( .... ) as T WHERE ...

この問合せでは、S MATCH_RECOGNIZE ( .... ) as Tは、FROM句内の副問合せと同様、最初でWHERE句の前に評価されます。

このため、MATCH_RECOGNIZE句とWHERE句の両方が同じOracle CQL問合せ内で使用されることはほとんどありません。かわりに、通常、ビューを使用して必要なWHERE句をストリームに適用し、MATCH_RECOGNIZE句を適用する問合せ内のビューから選択します。

例19-2では、それぞれWHERE句をストリームSに適用して、必要なイベントのストリームを事前にフィルタ処理する、e1p1e2p2という2つのビューが示されています。問合せqは、これらの2つのビューからいずれかを選択し、イベントのフィルタ処理済ストリーム上にMATCH_RECOGNIZEを適用します。

例19-2 MATCH_RECOGNIZE句とWHERE句

<view id="e1p1">
    SELECT * FROM S WHERE eventName = 'E1' and path = 'P1' and statName = 'countValue'
</view>
<view id="e2p2">
    SELECT * FROM S WHERE eventName = 'E2' and path = 'P2' and statName = 'countValue'
</view>

<query id="q">
    SELECT 
        T.e1p1Stat as e1p1Stat, T.e2p2Stat as e2p2Stat
    FROM
        e1p1, e2p2
    MATCH_RECOGNIZE(
        ALL MATCHES
        PATTERN(A+)
        DURATION 60 MINUTES
        DEFINE
            A as (A.e1p1Stat < 1000 and A.e2p2Stat > 2000 and count(A) > 3)
        ) as T
</query>

詳細は、opt_where_clause::=を参照してください。

19.1.2 シングルトンおよびグループ一致の参照

MATCH_RECOGNIZE句では、次の一致タイプが識別されます。

  • シングルトン: パターンで1回のみ発生し、SUBSETで定義されず、二者択一の有効範囲でなく、パターン量指定子で量が指定されない場合、相関変数はシングルトンです。

    このような相関変数への参照では、単一のイベントが参照されます。

  • グループ: パターンで2回以上発生し、SUBSETで定義され、二者択一の有効範囲内であるか、またはパターン量指定子で量が指定される場合、相関変数はグループです。

    このような相関変数への参照では、イベント・グループが参照されます。

MEASURES句とDEFINE句内のシングルトンおよびグループの相関変数を参照する場合、次のルールに従います。

  • シングルトンの相関変数の場合、集計ではなく個別のイベント属性のみを参照できます。

  • グループの相関変数の場合は、次のルールがあります。

    • 個別のイベント属性を参照する場合は、その相関変数と一致する最後のイベントの値が返されます。

      相関変数とまだ一致していない場合、NULLが返されます。count(A.*)については、相関変数Aとまだ一致していない場合、0が返されます。

      相関変数が、同じ変数の定義内で参照される場合(DEFINE A as A.balance > 1000など)、現在のイベントの値が返されます。

    • 集計を参照する場合は、これまでにその相関変数と一致したすべてのイベントに対して集計が実行されます。

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

19.1.3 集計の参照

MATCH_RECOGNIZE問合せのMEASURESおよびDEFINE句で、任意の組込み、Coltまたはユーザー定義の集計関数を使用できます。

集計関数を使用する場合、次を考慮してください。

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

19.1.3.1 実行中集計と最終集計

DEFINE句で、相関変数Xに基づくすべての集計関数が集計を実行します。つまり、集計には、現在の一致まで含め、Xのすべての前の一致が含まれます。相関変数Xがそれまでに完全に一致している場合、集計は最終となり、それ以外の場合は実行中となります。

MEASURES句では、一致が見つかった後で評価され、すべての集計が最終的に演算されるので、すべての集計が最終となります。

SUBSET句を使用する場合は、例19-3に示すように、誤って暗黙的に実行中集計を行う可能性があることに注意してください。

例19-3 暗黙的な実行中集計

...
PATTERN (X+ Y+)
SUBSET Z = (X, Y)
DEFINE
    X AS X.price > 100,
    Y AS sum(Z.price) < 1000
...

相関変数ZにはZが含まれるので、Yの定義にはY上の実行中集計が含まれます。

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

19.1.3.2 同一の相関変数での操作

MEASURESDEFINE句の両方で、同一の相関変数の属性にのみ集計関数を適用できます。

たとえば、例19-4のような集計関数correlationの使用は無効です。

例19-4 集計関数の無効な使用

...
MEASURES xycorr AS correlation(X.price, Y.price)
PATTERN (X+ Y+)
DEFINE 
    X AS X.price <= 10,
    Y AS Y.price > 10
...

correlation集計関数は、複数の相関変数では機能しない場合があります。

19.1.3.3 まだ一致していない変数の参照

DEFINE句では、まだ一致していない相関変数を参照できます。ただし、その場合は注意してください。例19-5のような場合があるとします。

例19-5 まだ一致していない変数の参照: 無効

PATTERN (X+ Y+)
DEFINE
    X AS count(Y.*) >= 3
    Y AS Y.price > 10,

この構文は有効ですが、この例では、Xが一致した時点でYはまだ一致しておらず、Yは0であるので、パターンは一致しません。

希望の動作を実装する(「Yの価格の値が10よりも大きい場合に行で3回以上一致する」)には、例19-6に示すようにこのパターンを実装します。

例19-6 まだ一致していない変数の参照: 有効

PATTERN (Y+ X+)
DEFINE
    Y AS Y.price > 10,
    X AS count(Y.*) >= 3

詳細は、19.1.3.5項「*、identifier.*およびidentifier.attrのあるcountの使用」を参照してください。

19.1.3.4 相関変数によって修飾されない参照属性

DEFINE句では、集計関数を相関変数によって未修飾のイベント属性に適用する場合、例19-7に示すように、集計は実行中集計です。

例19-7 相関変数によって修飾されない参照属性

PATTERN ((RISE FALL)+)
DEFINE
    RISE AS count(RISE.*) = 1 or RISE.price > FALL.price,
    FALL AS FALL.price < RISE.price and count(*) > 1000

この問合せでは、価格は可能な限り上下しますが、少なくとも1000の一致があるパターンが検出されます。

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

19.1.3.5 *、identifier.*およびidentifier.attrのあるcountの使用

組込み集計関数countの構文は次のとおりです。

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

(arith_expr::=attr::=identifier::=)

表19-1に示すように、countの戻り値は引数によって異なります。

表19-1 count集計関数の戻り値

入力引数 戻り値

arith_expr

arith_exprNULLでない場合のタプルの数。

*


重複とnullを含む、すべてのタプルの数。

identifier.*

相関変数identifierと一致する、重複とnullを含む、すべてのタプルの数。

次の点に注意してください。

  • count(A.*) = 1は、Aと一致する最初のイベントに対してtrueです。

  • count(A.*) = 0は、Aとまだ一致していない場合にtrueです。

identifier.attr

attrNULLでない場合に、相関変数identifierと一致するタプルの数。


例19-8のような場合があるとします。Sのスキーマに属性accountbalanceが含まれると想定します。この問合せでは、60分間で3回以上受信されていない各accountのイベントが返されます。

例19-8 count(A.*)を使用したMATCH_RECOGNIZEの問合せ

select 
    T.account,
    T.Atime 
FROM S 
    MATCH_RECOGNIZE(
        PARTITION BY account
        MEASURES
            A.account has account
            A.ELEMENT_TIME as Atime
        ALL MATCHES
        INCLUDE TIMER EVENTS
        PATTERN (A+) 
        DURATION 60 MINUTES
        DEFINE
            A AS count(A.*) < 3
    ) as T

PATTERN (A+)では、「Aと1回以上一致する」というパターンが指定されます。

DEFINE句では、次の条件が指定されます。

A AS count(A.*) < 3

Aのこの条件では、入力タプルにいずれの制限(A.balance > 1000など)も設定されません。PARTITION BY accountおよびDURATION 60 MINUTES句によってのみ制限が設定されます。DEFINE句では、A.*は「グループA+のすべての入力タプルと一致する」ことを意味します。このグループには、最初の入力タプルから60分間に着信した特定のaccountを持つ1つ以上の入力タプルが含まれます。count(A.*)はこのグループのイベントの合計数を返す実行中集計です。

DEFINE句では、次の条件が指定される場合、次のようになります。

A AS A.balance > 1000 and count(A.*) < 3

A.*は、まだ「グループA+のすべての入力タプルと一致する」ことを意味します。この場合、このグループには、最初の入力タプルおよびbalance > 1000のものから60分間に着信した特定のaccountを持つ1つ以上の入力タプルが含まれます。

対照的に、次のようになります。

  • count(*)は、「重複およびnullを含む、すべてのタプルの数」を意味します。つまり、MATCH_RECOGNIZE句が満たされるかどうかにかかわらず、Sに着信したすべてのタプルの数です。

  • count(A.balance)は、「balanceNULLでない場合に相関変数Aと一致するすべてのタプルの数」を意味します。

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

19.1.3.6 firstとlastの使用

firstlastの組込み集計関数を使用して、最初または最後に一致するイベントの各イベント属性にアクセスできます。

firstでは、ORDER BY句で定義された順序、またはデフォルトの順序で、最初に一致するグループの値が返されます。

lastでは、ORDER BY句で定義された順序、またはデフォルトの順序で、最後に一致するグループの値が返されます。

firstlast関数では、変数の最初の一致の後のオフセット、および最後の一致の前のオフセットをそれぞれ示す、オプションのゼロ以上の定整数の引数(N)を使用できます。このオフセットを指定する場合、first関数では、最初の一致後のN番目に一致するイベントが返され、last関数では、最後の一致前のN番目に一致するイベントが返されます。オフセットが変数の一致範囲外である場合、firstlast関数ではNULLが返されます。

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

19.1.4 prevの使用

prev組込み単一行関数を使用して、以前に一致したイベントのイベント属性にアクセスできます。以前に一致したイベントがない場合は、prev関数ではNULLが返されます。

prev関数では、以前の一致のオフセットを示す、オプションのゼロ以上の定整数の引数(N)を使用できます。このオフセットを指定する場合、prev関数では、現在の一致前のN番目に一致するイベントが返されます。以前に一致したイベントがない場合は、prev関数ではNULLが返されます。

prev関数をDEFINE句で使用する場合、この関数は現在定義済の相関変数のみにアクセスできます。

たとえば、例19-9の相関変数定義は有効です。

例19-9 prev関数の使用: 有効

Y AS Y.price < prev(Y.price, 2)

ただし、例19-10の相関変数定義は、相関変数Yの定義中、prev関数内の相関変数Xを参照するので無効です。

例19-10 prev関数の使用: 無効

Y AS Y.price < prev(X.price, 2)

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

19.2 MEASURES句

MEASURES句は、指定するパターンと一致するイベントの属性値をエクスポートします(SELECT内への包含を可能にする)。

パーティション属性、属性別の順序、シングルトン変数、グループ変数の集計、およびMATCH_RECOGNIZE句のソースであるストリームの属性の集計を参照する相関変数に対して式を指定できます。

相関変数によって属性値を修飾して、相関変数の条件と一致するイベントの属性の値をエクスポートします。たとえば、MEASURES句内で、次のようにA.c1はイベント属性c1の値を参照します。

SELECT文内には、MEASURES句で指定する属性のみを含めることができます。

pattern_measures_clause::=

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

(non_mt_measure_list::=)

non_mt_measure_list::=

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

(measure_column::=)

measure_column::=

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

(arith_expr::=identifier::=)

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

MEASURES
    A.itemId as itemId

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

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

19.2.1 MEASURES句内の相関変数用の関数

MEASURES句で、条件と一致するイベントの属性に単一行または集計関数を適用できます。

例19-11では、MEASURES句内の相関変数Z.c1last関数を適用できます。

例19-11 相関変数での関数の使用

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

例19-11MEASURES句内の次の点に注意してください。

  • A.c1では、次の理由により、最初の一致および問合せで処理される最初のイベント内のc1の値のみがエクスポートされます。

    • ADEFINE句で指定されていないので、常にtrueになります。

    • Aにパターン量指定子がないので、1回のみ一致します。

  • 組込み集計関数lastでは、PATTERN句が満たされるときにZと一致する最後のイベント内のc1の値がエクスポートされます。

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

19.3 PATTERN句

PATTERN句は、1つ以上の相関変数に対し、正規表現として一致するパターンを指定します。

着信イベントは、指定された順序(左から右)でこれらの条件と一致する必要があります。

正規表現には、次のような相関変数を含むことができます。

pattern_clause::=

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

(regexp::=within_clause::=)

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

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

19.3.1 パターン量指定子と正規表現

相関変数およびパターン量指定子で構成される正規表現としてパターンを表します。

regexp::=

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

(correlation_name::=pattern_quantifier::=)

correlation_name::=

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

(const_string::=)

pattern_quantifier::=

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

表19-2は、Oracle CQLでサポートされるパターン量指定子(pattern_quantifier::=))のリストです。

表19-2 MATCH_RECOGNIZEのパターン量指定子

最大限 最小限 説明

*

*?

0回以上

+

+?

1回以上

?

??

0 または1回

なし

なし

量指定のないパターン(Aなど)は、1つのみの一致を要求する量指定子を持つと見なされます。


A*またはA+?など、パターン量指定子を使用して正規表現としてパターンを指定できます。

1文字のパターン量指定子は最大限つまり「グリーディ」(貪欲)であり、可能な限り多くの正規表現のインスタンスとの一致を試みます。

2文字のパターン量指定子は最小限つまり「リラクタント」(消極的)であり、可能な限り少ない正規表現のインスタンスとの一致を試みます。

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

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

19.3.2 PATTERN句内でのグループ化および二者択一

regexp_grp_alt構文が示すように、次を使用できます。

  • 開カッコおよび閉カッコ(( and )): 相関変数のグループ化

  • 二者択一演算子(|): いずれか1つの相関変数(または相関変数のグループ)と一致

regexp_grp_alt::=

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

(correlation_name::=, pattern_quantifier::=, regexp::=)

次のpattern_clauseがあるとします。

PATTERN (A+ B+)

これは、「1回以上のAの後にBが1回以上続く」ことを意味します。

相関変数はグループ化できます。例:

PATTERN (A+ (C+ B+)*)

これは、「1回以上のAの後にゼロ以上のCが1回以上、およびBが1回以上続く」ことを意味します。

PATTERN句の二者択一演算子(|)を使用して、pattern_clauseの意味を調整できます。例:

PATTERN (A+ | B+)

これは、「Aが1回以上、またはBが1回以上、いずれか早い方」を意味します。

同様に、グループ相関変数と二者択一演算子の両方を使用できます。例:

PATTERN (A+ (C+ | B+))

これは、「1回以上のAの後に、Cが1回以上か、Bが1回以上、いずれか早い方が続く」ことを意味します。

すべての組合せと一致するようにするには、次を使用できます。

PATTERN ((A B) | (B A))

これは、「Aの後にB、またはBの後にA、いずれか早い方」を意味します。

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

19.4 DEFINE句

DEFINE句は、各相関変数のブール条件を指定します。

論理式または算術式を指定して、条件と一致するイベントの属性に単一行または集計関数を適用できます。

基本ストリームからの新しいタプルが受信されると、その時点で関連している相関変数の条件が評価されます。その定義の条件を満たしている場合、タプルは相関変数に一致したと見なされます。特定の入力は0個、1個または複数の相関変数と一致する可能性があります。入力の受信時に評価される関連条件は、PATTERN句の正規表現で管理されるロジックと、これまでの入力を処理した後のパターン認識処理の状態によって決定されます。

条件では、MATCH_RECOGNIZE句が適用されるストリームまたはストリームに評価されるビューのスキーマの任意の属性を参照できます。

PATTERN句の相関変数は、DEFINE句で指定する必要はありません。このような相関変数のデフォルトは、常にtrueの述語です。このような相関変数は、すべてのイベントに一致します。PATTERN句で使用されていない相関変数をDEFINE句に指定すると、エラーになります。

SUBSET句で定義される相関変数はいずれもDEFINE句で定義できません。

pattern_definition_clause::=

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

(non_mt_corrname_definition_list::=)

non_mt_corrname_definition_list::=

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

(correlation_name_definition::=)

correlation_name_definition::=

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

(correlation_name::=non_mt_cond_list::=)

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

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

19.4.1 DEFINE句内の相関変数用の関数

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

例19-12では、to_timestamp関数が相関変数に適用されます。

例19-12 相関変数での関数の使用: to_timestamp

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

例19-13では、count関数を相関変数Bに適用して、定義が満たされる回数をカウントします。totalCountValueが、30分間に1000未満が2、3回ある場合に一致が認識されます。

例19-13 相関変数での関数の使用: count

...
    MATCH_RECOGNIZE(
        ...
        PATTERN(B*)
        DURATION 30 MINUTES
        DEFINE
            B as (B.totalCountValue < 1000 and count(B.*) >= 2)
...

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

19.4.2 DEFINE句内の属性の参照

基本ストリームの属性を参照できます。

  • 相関変数がない場合: c1 < 20

  • 相関変数がある場合: A.c1 < 20

相関変数なしで属性を参照する場合、相関変数と最後に一致したタプルが評価の対象になります。

次の定義があるとします。

  • DEFINE A as c1 < 20

  • DEFINE A as A.c1 < 20

両方とも、最新の入力タプルである同じタプル内のc1を参照します。これは、最新の入力が相関変数と一致するものと想定し、入力着信時に、この相関変数の条件を評価するからです。

DEFINE句に定義されていない相関名を指定した場合は、各入力でtrueと見なされます。

例19-14では、相関変数APATTERN句内に存在しますが、DEFINEでは指定されていません。これは、相関名Aがすべての入力に対してtrueであることを意味します。PATTERN句で使用されていない相関名を定義するのは誤りです。

例19-14 未定義の相関名

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

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

19.4.3 相関変数間の参照

1つの相関変数の定義で、他の相関変数を参照できます。例19-15に示すような問合せがあるとします。

例19-15 相関変数間の参照

...
Select
    a_firsttime, d_lasttime, b_avgprice, d_avgprice
FROM
    S
MATCH_RECOGNIZE (
    PARTITION BY symbol
    MEASURES
        first(a.time) as a_firsttime,
        last(d.time) as d_lasttime,
        avg(b.price) as b_avgprice,
        avg(d.price) as d_avgprice
    PATTERN (A B+ C+ D)
    DEFINE
        A as A.price > 100,
        B as B.price > A.price,
        C as C.price < avg(B.price),
        D as D.price > prev(D.price)
)
...

次の点に注意してください。

  • 相関変数Aでは単一の属性が定義されるので、Bはこの単一属性を参照できます。

  • Bで1つ以上の属性が定義されるので、CBの単一の属性を参照できません。この場合、CBの集計のみを参照できます。

  • Dは自身との関係で定義されています。この場合、単一属性または集計を参照できます。この例で、prev関数は、現在の一致前のDの一致にアクセスするために使用されています。

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

19.5 PARTITION BY句

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

PARTITION BY句がない場合、すべてのストリーム属性は同じパーティションに属します。

pattern_partition_clause::=

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

(non_mt_attr_list::=)

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

PARTITION BY 
    itemId

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

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

例19-16 入力ストリームS1

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

例19-17のようなMATCH_RECOGNIZEの問合せがあるとします。

例19-17 入力ストリーム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

例19-17の問合せにPARTITION BY c2を追加すると、出力は次のように変わります。

3000:+ 2000, 3000, 2
4000:+ 1000, 4000, 1

これは、PARTITION BY句の追加により、一致が分割内でのみ行われるようになったためです。c2属性の値によって、1000と4000のタプルはある分割に属し、2000と3000 のタプルは別の分割に属します。最初の分割で、Aは1000のタプルと一致し、Bは4000のタプルと一致します。3000のタプルもBの定義と一致しますが、タプルが別の分割に属しているため、最初の分割では一致として提示されません。

1つ以上の属性によって分割する場合、ORDER BY句を使用してパーティションの順序を制御できます。詳細は、19.6項「ORDER BY句」を参照してください。

19.6 ORDER BY句

このオプションの句を使用して、PARTITION BY句を使用する場合のMATCH_RECOGNIZE句によるパーティション順序を決定するためのストリーム属性を指定できます。

ORDER BY句がない場合、MATCH_RECOGNIZEの結果は決定されません。

pattern_order_by_top_clause::=

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

PARTITION BY句があるORDER BY句のみを使用できます。

詳細は、19.5項「PARTITION BY句」pattern_partition_clause::=、およびorder_by_list::=を参照してください。

19.7 ALL MATCHES句

このオプションを使用して、重複するパターンに一致するようにOracle CEPを構成できます。

ALL MATCHES句がある場合、Oracle CEPですべてのあらゆる一致が検出されます。重複している一致、および同じイベントで開始される一致がある場合があります。この場合、パターン量指定子が「グリーディ」であっても「リラクタント」であっても、違いはありません。たとえば、次のようなパターンがあります。

ALL MATCHES
PATTERN (A* B)

次のように、同じ結果になります。

ALL MATCHES
PATTERN (A*? B)

ALL MATCHES句がない場合、重複する一致は返されず、アスタリスクなどの量指定子によって、一連の候補(および重複)一致のうち、優先して出力される一致が決定されます。重複する一致の残りは破棄されます。

pattern_skip_match_clause::=

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

ALL MATCHESを使用する例19-18の問合せtkpattern_q41例19-19のデータ・ストリームtkpattern_S11があるとします。ストリームtkpattern_S11のスキーマは(c1 integer, c2 integer)です。例19-20は、問合せで返されるストリームを示します。

例19-18の問合せtkpattern_q41では、入力ストリーム値のプロットが英字Wの形になる場合に一致が報告されます。例19-20のリレーションは、このWパターン一致の重複するインスタンスの例を示します。

重複するパターンのインスタンスには2つの種類があります。

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

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

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

例19-20に示すように、ALL MATCHES句では特定の入力が受信されると、一致するすべてのパターン・インスタンスが報告されます。たとえば、時間20000では{12,20}{13,20}および{14,20}のすべてのタプルが出力されます。

詳細は、19.3.1項「パターン量指定子と正規表現」を参照してください。

19.8 WITHIN句

WITHIN句は、指定された時間内で一致が発生する場合にのみ、pattern_clause一致を出力するオプションの句です。

within_clause::=

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

(time_spec::=)

つまり、次の場合にのみ発生します。

TL - TF < WD

説明:

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

TL - TF <= WD

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

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

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


注意:

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


19.9 DURATION句

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

duration_clause::=

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

(time_unit::=)

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

DURATION句を使用する場合は、INCLUDE TIMER EVENTS句を使用する必要があります。詳細は、19.10項「INCLUDE TIMER EVENTS句」を参照してください。

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


注意:

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


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

期間は、10などの定数値として指定できます。オプションで、秒や分などの時間単位を指定できます(time_unit::=を参照)。デフォルトの時間単位は秒です。

DURATION 10を使用して10秒(10000ms)の遅延を指定する例19-21の問合せtkpattern_q59と、例19-22のデータ・ストリームtkpattern_S19があるとします。ストリームtkpattern_S19のスキーマは(c1 integer)です。例19-23は、問合せで返されるストリームを示します。

例19-21 固定期間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>

例19-22 固定期間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

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

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

19.9.2 反復的なイベント欠落の検出

MULTIPLES OF句を指定した場合は、反復的なイベント欠落の検出が示されます。この場合、パターンが完全に一致した後にイベントが発生しないかぎり、期間値の倍数の時点で出力が送信されます。

DURATION MULTIPLES OF 10を使用して10秒(10000ms)の遅延を指定する例19-24の問合せtkpattern_q75と、例19-25のデータ・ストリームtkpattern_S23があるとします。ストリームtkpattern_S23のスキーマは(c1 integer)です。例19-26は、問合せで返されるストリームを示します。

例19-24 可変期間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>

例19-25 可変期間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

例19-26 可変期間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句の例と同様のロジックに従います(「固定期間のイベント欠落の検出」を参照)。異なる点は、後の方の出力です。72000のタプルはAに一致しますが、それ以降は入力がありません。パターンAB*とは一致するため、82000の時点で出力が行われます。MULTIPLES OF句で期間10が指定されているため、92000、102000およびそれ以降は同様に出力が行われます。

19.10 INCLUDE TIMER EVENTS句

イベント欠落の検出には、この句とDURATION句を併用します。

通常、たいていのパターン一致の問合せでは、パターン一致の出力は、常に入力イベントによって入力ストリーム上で一致するパターンに対してトリガーされます。唯一の例外は、イベント欠落の検出の問合せで、タイマーの期限切れイベントによって(入力ストリーム上の明示的な入力イベントではなく)出力がトリガーされる場合があります。

pattern_inc_timer_evs_clause::=

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

(pattern_clause::=pattern_skip_match_clause::=pattern_definition_clause::=duration_clause::=subset_clause::=)

詳細は、19.9項「DURATION句」を参照してください。

19.11 SUBSET句

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

例:

SUBSET S1 = (Z,X)

サブセットの右側((Z,X))は、PATTERN句での定義に基づいた1つ以上の相関変数のカンマ区切りのリストです。

サブセットの左側(S1)は、右側の相関変数を結合したものです。

サブセットの右側にサブセット変数を含めることはできません。

subset_clause::=

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

(non_mt_subset_definition_list::=)

non_mt_subset_definition_list::=

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

(subset_definition::=)

subset_definition::=

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

(subset_name::=non_mt_corr_list::=)

subset_name::=

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

(const_string::=)

non_mt_corr_list::=

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

(correlation_name::=)

例19-27の問合せq55例19-28のデータ・ストリーム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に一致するすべてのタプルを参照します。

例19-29は、問合せで返されるストリームを示します。

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

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

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

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

19.12 MATCH_RECOGNIZEの例

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

追加の例は、『Oracle Fusion Middleware Oracle Complex Event Processingスタート・ガイド』を参照してください。

19.12.1 パターン検出

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

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

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

例19-30は、スキーマsymbolstockTickおよびpriceを持つ株価イベントのストリームS2に対する問合せqを示します。この問合せではPATTERN句(A W+ X+ Y+ Z+)を使用して、着信する株取引の二番底パターンを検出します。この句の相関名は次のとおりです。

  • A: 二番底パターンの開始点に相当します。

    相関名Aは各入力でtrueであるため、DEFINE句で定義されていません。DEFINE句に定義されていない相関名を指定した場合は、各入力でtrueと見なされます。

  • W+: 二番底パターンの最初の下降部分に相当します。

    これはW.price < prev(W.price)として定義されます。この定義は、現在の価格が前の価格よりも低いことを意味します。

  • X+: 二番底パターンの最初の上昇部分に相当します。

  • Y+: 二番底パターンの2番目の下降部分に相当します。

  • Z+: 二番底パターンの2番目の上昇部分に相当します。

例19-30 単純なパターン検出: 問合せ

<query id="q"><![CDATA[ 
    SELECT
        T.firstW,
        T.lastZ
    FROM
        S2
    MATCH_RECOGNIZE (
        MEASURES
            A.stockTick as firstW,
            last(Z) as lastZ
        PATTERN(A W+ X+ Y+ Z+)
        DEFINE 
            W as W.price < prev(W.price),
            X as X.price > prev(X.price),
            Y as Y.price < prev(Y.price),
            Z as Z.price > prev(Z.price)
    ) as T
    WHERE
        S2.symbol = "oracle"
]]></query>

19.12.2 PARTITION BYを使用したパターン検出

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

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

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

例19-31は、スキーマsymbolstockTickおよびpriceを持つ株価イベントのストリームS2に対する問合せqを示します。この問合せではPATTERN句(A W+ X+ Y+ Z+)を使用して、着信する株取引の二番底パターンを検出します。この句の相関名は次のとおりです。

  • A: 二番底パターンの開始点に相当します。

  • W+: 二番底パターンの最初の下降部分に相当します。これはW.price < prev(W.price)として定義され、現在の価格が前の価格よりも低いことを意味します。

  • X+: 二番底パターンの最初の上昇部分に相当します。

  • Y+: 二番底パターンの2番目の下降部分に相当します。

  • Z+: 二番底パターンの2番目の上昇部分に相当します。

問合せではPARTITION BY句を使用して入力ストリームを株価表示記号別に分割し、各論理ストリームにこのPATTERN句を適用します。

例19-31 PARTITION BYを使用したパターン検出: 問合せ

<query id="q"><![CDATA[ 
    SELECT
        T.firstW,
        T.lastZ
    FROM
        S2
    MATCH_RECOGNIZE (
        PARTITION BY
            A.symbol
        MEASURES
            A.stockTick as firstW,
            last(Z) as lastZ
        PATTERN(A W+ X+ Y+ Z+)
        DEFINE
            W as W.price < prev(W.price),
            X as X.price > prev(X.price),
            Y as Y.price < prev(Y.price),
            Z as Z.price > prev(Z.price)
    ) as T
]]></query>

19.12.3集計を使用したパターン検出

例19-32の問合せq1例19-33のデータ・ストリームSがあるとします。ストリームSのスキーマは(c1 integer)です。例19-34は、問合せで返されるストリームを示します。

例19-32 集計を使用したパターン検出: 問合せ

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

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

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

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

Timestamp   Tuple
8000        338
12000       52

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

例19-35および例19-36の問合せと例19-37のデータ・ストリームSがあるとします。ストリームSのスキーマは(c1 integer, c2 integer)です。表19-3で、これらの問合せの出力を比較します。

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

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

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

表19-3 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,

表19-3queryWithin問合せに示すように、候補一致はTimeStamp=1000のイベントで開始されます。WITHIN句の期間が3秒であるため、問合せは、TimeStamp=4000のイベントの前に完了した場合にのみ、一致を出力します。問合せがTimeStampe=4000のイベントを受け取ると、その時点までで最も長い一致が出力されます(ALL MATCHESを使用していないため)。TimeStamp=4000のイベントがBに一致しても、そのイベントは一致に含まれないことに注意してください。次の一致は、TimeStamp=4000のイベントから開始されます。このイベントもAに一致しており、以前の一致がTimeStamp=3000で終了しているためです。

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

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

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

5つの異なる部屋を移動するオブジェクトがあるとします。オブジェクトは、毎回部屋1を出発し、5分以内に部屋5に到着する必要があります。図19-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を使用して、このようなイベント欠落を問い合せることができます。

図19-3 固定期間のイベント欠落の検出

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

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

例19-38 固定期間のイベント欠落の検出: 問合せ

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

詳細は、19.9項「DURATION句」を参照してください。