15 MATCH_RECOGNIZEを使用したパターン認識
Oracle Continuous Query Language (Oracle CQL)のMATCH_RECOGNIZE
句に関するリファレンスと使用情報を提供します。この句とその副句は、Oracle CQL問合せでパターン認識を実行します。
FROM
句内の複数のストリームとのパターン一致もサポートされています。
15.1 MATCH_RECOGNIZE
を使用したパターン認識について
MATCH_RECOGNIZE
句によってOracle CQL問合せのパターン認識が実行されます。この問合せにより、DEFINE
句の条件についてPATTERN
句の正規表現を満たすイベント(タプル)のMEASURES
句の値がエクスポートされます(SELECT
内への包含が可能になります)。
<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_def_dur_clause::=
![pattern def dur clause pattern def dur clause](img/pattern_def_dur_clause.png)
(図15-2、図15-7、図15-3、図15-9、図15-11)
MATCH_RECOGNIZE
を使用して、着信イベントの属性の条件を定義し、相関変数と呼ばれるidentifiers
を使用して、これらの条件を識別します。前の例では、相関変数A
、B
およびC
が定義されています。入力ストリームの連続するイベントのシーケンスがこれらの条件を満たす場合は、パターンが構成されます。
MATCH_RECOGNIZE
問合せの出力は常にストリームです。
主なMATCH_RECOGNIZE
副句には次のものがあります。
-
MEASURES
: 指定するパターンと一致するイベントの属性値をエクスポートします(SELECT
内への包含を可能にする)。「MEASURES句」を参照してください。
-
PATTERN
: 1つ以上の相関変数に対し、正規表現として一致するパターンを指定します。「PATTERN句」を参照してください。
-
DEFINE
: 1つ以上の相関変数に関する条件を指定します。「DEFINE句」を参照してください。
パターン認識を調整するには、次のようなオプションのMATCH_RECOGNIZE
副句を使用できます。
詳細については、以下を参照:
15.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
句を適用する問合せ内のビューから選択します。
次の例に示す2つのビュー、e1p1
とe2p2
は、それぞれWHERE
句をストリームS
に適用して、必要なイベントのためにストリームを事前フィルタ処理します。問合せq
は、これらの2つのビューからいずれかを選択し、イベントのフィルタ処理済ストリーム上にMATCH_RECOGNIZE
を適用します。
<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>
15.1.2 シングルトンおよびグループ一致の参照
MATCH_RECOGNIZE
句では、次の一致タイプが識別されます。
-
シングルトン: パターンで1回のみ発生し、
SUBSET
で定義されず、二者択一の有効範囲でなく、パターン量指定子で量が指定されない場合、相関変数はシングルトンです。このような相関変数への参照では、単一のイベントが参照されます。
-
グループ: パターンで2回以上発生し、
SUBSET
で定義され、二者択一の有効範囲内であるか、またはパターン量指定子で量が指定される場合、相関変数はグループです。このような相関変数への参照では、イベント・グループが参照されます。
MEASURES
句とDEFINE
句内のシングルトンおよびグループの相関変数を参照する場合、次のルールに従います。
-
シングルトンの相関変数の場合、集計ではなく個別のイベント属性のみを参照できます。
-
グループの相関変数の場合は、次のルールがあります。
-
個別のイベント属性を参照する場合は、その相関変数と一致する最後のイベントの値が返されます。
相関変数とまだ一致していない場合、
NULL
が返されます。count(A.*)
については、相関変数A
とまだ一致していない場合、0が返されます。相関変数が、同じ変数の定義内で参照される場合(
DEFINE A as A.balance > 1000
など)、現在のイベントの値が返されます。 -
集計を参照する場合は、これまでにその相関変数と一致したすべてのイベントに対して集計が実行されます。
-
詳細については、以下を参照:
15.1.3 集計の参照
MATCH_RECOGNIZE
問合せのMEASURES
およびDEFINE
句で、任意の組込み、Coltまたはユーザー定義の集計関数を使用できます。
集計関数を使用する場合、次を考慮してください。
詳細については、以下を参照:
15.1.3.1 実行中集計と最終集計
DEFINE
句では、相関変数X
に基づくすべての集計関数が集計を実行します。つまり、集計には、現在の一致を含め、X
のそれ以前のすべての一致が含まれます。相関変数X
がそれまでに完全に一致している場合、集計は最終となり、それ以外の場合は実行中となります。
MEASURES
句は、一致が見つかった後で評価されるので、最後の一致で計算されるすべての集計は最後になります。
SUBSET
句を使用する場合は、誤って暗黙的に実行中集計を行う可能性があることに注意してください。
... PATTERN (X+ Y+) SUBSET Z = (X, Y) DEFINE X AS X.price > 100, Y AS sum(Z.price) < 1000 ...
相関変数Z
にはZ
が含まれるので、Y
の定義にはY
上の実行中集計が含まれます。
詳細については、以下を参照:
15.1.3.2 同一の相関変数での操作
MEASURES
とDEFINE
句の両方で、同一の相関変数の属性にのみ集計関数を適用できます。
たとえば、集計関数correlation
の使用は無効です。
... MEASURES xycorr AS correlation(X.price, Y.price) PATTERN (X+ Y+) DEFINE X AS X.price <= 10, Y AS Y.price > 10 ...
correlation
集計関数は、複数の相関変数では機能しない場合があります。
15.1.3.3 まだ一致していない変数の参照
DEFINE
句では、まだ一致していない相関変数を参照できます。ただし、その場合は注意してください。
PATTERN (X+ Y+) DEFINE X AS count(Y.*) >= 3 Y AS Y.price > 10,
この構文は有効ですが、この例では、X
が一致した時点でY
はまだ一致しておらず、Y
は0であるので、パターンは一致しません。
希望の動作(「3回以上連続してY
の価格が10を超える場合に一致」)を実装するには、このパターンを実装します。
PATTERN (Y+ X+) DEFINE Y AS Y.price > 10, X AS count(Y.*) >= 3
詳細は、「*、identifier.*およびidentifier.attrのあるcountの使用」を参照してください。
15.1.3.4 相関変数によって修飾されない参照属性
DEFINE
句では、集計関数を相関変数によって未修飾のイベント属性に適用する場合、集計は実行中集計です。
PATTERN ((RISE FALL)+) DEFINE RISE AS count(RISE.*) = 1 or RISE.price > FALL.price, FALL AS FALL.price < RISE.price and count(*) > 1000
この問合せでは、価格は可能なかぎり上下しますが、少なくとも1000の一致があるパターンが検出されます。
詳細については、以下を参照:
15.1.3.5 *、identifier.*およびidentifier.attrのあるcountの使用
表15-1 count集計関数の戻り値
入力引数 | 戻り値 |
---|---|
|
|
|
パターンのすべての相関変数と一致する、重複とnullを含むタプルの数。 |
|
相関変数 次の点に注意してください。
|
|
|
S
のスキーマに属性account
とbalance
が含まれると想定します。この問合せでは、60分間で3回以上受信されていない各account
のイベントが返されます。
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を含むタプルの数」を意味します。 -
count(A.balance)
は、「balance
がNULL
でない場合に相関変数A
と一致するすべてのタプルの数」を意味します。
詳細については、以下を参照:
15.1.3.6 first
とlast
の使用
first
とlast
の組込み集計関数を使用して、最初または最後に一致するイベントそれぞれのイベント属性にアクセスできます。
first
では、ORDER BY
句で定義された順序、またはデフォルトの順序で、最初に一致するグループの値が返されます。
last
では、ORDER BY
句で定義された順序、またはデフォルトの順序で、最後に一致するグループの値が返されます。
first
とlast
関数では、変数の最初の一致の後のオフセット、および最後の一致の前のオフセットをそれぞれ示す、オプションのゼロ以上の定整数の引数(N
)を使用できます。このオフセットを指定する場合、first
関数では、最初の一致後のN
番目に一致するイベントが返され、last
関数では、最後の一致前のN
番目に一致するイベントが返されます。オフセットが変数の一致範囲外である場合、first
とlast
関数ではNULL
が返されます。
詳細については、以下を参照:
15.1.4 prev
の使用
prev
組込み単一行関数を使用して、以前に一致したイベントのイベント属性にアクセスできます。以前に一致したイベントがない場合は、prev
関数ではNULL
が返されます。
prev
関数では、以前の一致のオフセットを示す、オプションのゼロ以上の定整数の引数(N
)を使用できます。このオフセットを指定する場合、prev
関数では、現在の一致前のN
番目に一致するイベントが返されます。以前に一致したイベントがない場合は、prev
関数ではNULL
が返されます。
prev
関数をDEFINE
句で使用する場合、この関数は現在定義済の相関変数のみにアクセスできます。
たとえば、相関変数の定義は次のようになります。
Y AS Y.price < prev(Y.price, 2)
ただし、次の相関変数定義は、相関変数Y
の定義中、prev
関数内の相関変数X
を参照するため無効です。
Y AS Y.price < prev(X.price, 2)
詳細については、以下を参照:
15.2 MEASURES
句
MEASURES
句は、指定するパターンと一致するイベントの属性値をエクスポートします(SELECT
内への包含を可能にする)。
パーティション属性、属性別の順序、シングルトン変数、グループ変数の集計、およびMATCH_RECOGNIZE
句のソースであるストリームの属性の集計を参照する相関変数に対して式を指定できます。
相関変数によって属性値を修飾して、相関変数の条件と一致するイベントの属性の値をエクスポートします。たとえば、MEASURES
句内で、次のようにA.c1
はイベント属性c1
の値を参照します。
-
A
がDEFINE
句で指定されている場合、相関変数A
に対応する条件と最後に一致すたタプル内。 -
A
がDEFINE
句内で指定されていない場合、最後に処理されたタプル内。これは、
A
はDEFINE
句内で指定されていない場合に、A
は常にTRUE
と見なされるからです。このため、入力内のすべてのタプルが効率よくA
と一致します。
SELECT
文内には、MEASURES
句で指定する属性のみを含めることができます。
図15-1 pattern_measures_clause::=
![pattern measures clause pattern measures clause](img/pattern_measures_clause.png)
non_mt_measure_list::=
measure_column::=
![measure column measure column](img/measure_column.png)
pattern_measures_clause
は次のとおりです。
MEASURES A.itemId as itemId
この項の内容は、次のとおりです。
詳細については、以下を参照:
15.2.1 MEASURES句内の相関変数用の関数
MEASURES
句で、条件と一致するイベントの属性に単一行または集計関数を適用できます。
MEASURES
句内の相関変数Z.c1
にlast
関数を適用できます。
<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>
MEASURES
句内の次の点に注意してください。
-
A.c1
では、次の理由により、最初の一致および問合せで処理される最初のイベント内のc1
の値のみがエクスポートされます。-
A
はDEFINE
句で指定されていないので、常にtrueになります。 -
A
にパターン量指定子がないので、1回のみ一致します。
-
-
組込み集計関数
last
では、PATTERN
句が満たされるときにZ
と一致する最後のイベント内のc1
の値がエクスポートされます。
詳細については、以下を参照:
15.3 PATTERN句
PATTERN
句は、1つ以上の相関変数に対し、正規表現として一致するパターンを指定します。
着信イベントは、指定された順序(左から右)でこれらの条件と一致する必要があります。
正規表現には、次のような相関変数を含むことができます。
-
DEFINE
句で定義される相関変数: 条件定義でTRUE
に評価される場合にのみ、trueと見なされます。「DEFINE句」を参照してください。
-
DEFINE
句で定義されていない相関変数: 常にTRUE
と見なされ、すべての入力と一致します。
図15-2 pattern_clause::=
![pattern clause pattern clause](img/pattern_clause.png)
この項の内容は、次のとおりです。
詳細については、以下を参照:
15.3.1 パターン量指定子と正規表現
相関変数およびパターン量指定子で構成される正規表現としてパターンを表します。
regexp::=
correlation_name::=
![correlation name correlation name](img/correlation_name.png)
pattern_quantifier::=
![pattern quantifier pattern quantifier](img/pattern_quantifier.png)
表15-2は、Oracle CQLでサポートされるパターン量指定子(pattern_quantifier::=)のリストです。
表15-2 MATCH_RECOGNIZEのパターン量指定子
最大 | 最小 | 説明 |
---|---|---|
|
|
0回以上 |
|
|
1回以上。 |
|
|
0回または1回。 |
なし |
なし |
量指定のないパターン( |
A*
またはA+?
など、パターン量指定子を使用して正規表現としてパターンを指定できます。
1文字のパターン量指定子は最大限つまり「グリーディ」(貪欲)であり、可能なかぎり多くの正規表現のインスタンスとの一致を試みます。
2文字のパターン量指定子は最小限つまり「リラクタント」(消極的)であり、可能なかぎり少ない正規表現のインスタンスとの一致を試みます。
次の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
との一致はより少なくなります。
詳細については、以下を参照:
15.3.2 PATTERN句内でのグループ化および二者択一
regexp_grp_alt
構文が示すように、次を使用できます。
-
開カッコと閉カッコ(
(
と)
): 相関変数のグループ化 -
二者択一演算子(
|
): いずれか1つの相関変数(または相関変数のグループ)と一致
regexp_grp_alt::=
![regexp grp alt regexp grp alt](img/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、いずれか早い方」を意味します。
詳細については、以下を参照:
15.4 DEFINE
句
DEFINE
句は、各相関変数のブール条件を指定します。
論理式または算術式を指定して、条件と一致するイベントの属性に単一行または集計関数を適用できます。
基本ストリームからの新しいタプルが受信されると、その時点で関連している相関変数の条件が評価されます。その定義の条件を満たしている場合、タプルは相関変数に一致したと見なされます。特定の入力は0個、1個または複数の相関変数と一致する可能性があります。入力の受信時に評価される関連条件は、PATTERN
句の正規表現で管理されるロジックと、これまでの入力を処理した後のパターン認識処理の状態によって決定されます。
条件では、MATCH_RECOGNIZE
句が適用されるストリームまたはストリームに評価されるビューのスキーマの任意の属性を参照できます。
PATTERN
句の相関変数は、DEFINE
句で指定する必要はありません。このような相関変数のデフォルトは、常にtrueの述語です。このような相関変数は、すべてのイベントに一致します。PATTERN
句で使用されていない相関変数をDEFINE
句に指定すると、エラーになります。
SUBSET
句で定義される相関変数はいずれもDEFINE
句で定義できません。
図15-3 pattern_definition_clause::=
![pattern definition clause pattern definition clause](img/pattern_definition_clause.png)
(図15-4)
図15-4 non_mt_corrname_definition_list::=
![non mt corrname definition list non mt corrname definition list](img/non_mt_corrname_def_list.png)
図15-5 correlation_name_definition::=
![correlation name definition correlation name definition](img/correlation_name_definition.png)
(correlation_name::=、non_mt_cond_list)
この項の内容は、次のとおりです。
詳細については、以下を参照:
15.4.1 DEFINE句内の相関変数用の関数
相関変数の定義では関数を使用できます。
次の例では、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) ...
次の例では、count
関数を相関変数B
に適用して、定義が満たされる回数をカウントします。totalCountValue
が、30分間に1000未満が2、3回ある場合に一致が認識されます。
... MATCH_RECOGNIZE( ... PATTERN(B*) DURATION 30 MINUTES DEFINE B as (B.totalCountValue < 1000 and count(B.*) >= 2) ...
詳細については、以下を参照:
15.4.2 DEFINE句内の属性の参照
基本ストリームの属性を参照できます。
-
相関変数がない場合:
c1 < 20
-
相関変数がある場合:
A.c1 < 20
相関変数なしで属性を参照する場合、相関変数と最後に一致したタプルが評価の対象になります。
次の定義があるとします。
-
DEFINE A as c1 < 20
-
DEFINE A as A.c1 < 20
両方とも、最新の入力タプルである同じタプル内のc1
を参照します。これは、最新の入力が相関変数と一致するものと想定し、入力着信時に、この相関変数の条件を評価するからです。
DEFINE
句に定義されていない相関名を指定した場合は、各入力でtrueと見なされます。
相関変数A
はPATTERN
句内に存在しますが、DEFINE
句では指定されていません。これは、相関名A
がすべての入力に対してtrueであることを意味します。PATTERN
句で使用されていない相関名を定義するのは誤りです。
<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.4.3 相関変数間の参照
1つの相関変数の定義で、他の相関変数を参照できます。次の問合せについて考えてみます。
... 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つ以上の属性が定義されるので、C
はB
の単一の属性を参照できません。この場合、C
はB
の集計のみを参照できます。 -
D
は自身との関係で定義されています。この場合、単一属性または集計を参照できます。この例で、prev
関数は、現在の一致前のD
の一致にアクセスするために使用されています。
詳細については、以下を参照:
15.5 PARTITION BY句
MATCH_RECOGNIZE
句の結果を分割するためのストリームの属性を指定するには、このオプションの句を使用します。
PARTITION BY
句がない場合、すべてのストリーム属性は同じパーティションに属します。
図15-6 pattern_partition_clause::=
![pattern partition clause pattern partition clause](img/pattern_partition_clause.png)
pattern_partition_clause
は次のとおりです。
PARTITION BY itemId
パターン内のpartition by句は、partitionリスト内の属性に基づいて入力ストリームが論理的に分割され、その分割内でパターン・マッチングが行われることを意味します。
スキーマ(c1 integer, c2 integer)
を持つストリームS
があるとします。
c1 c2 1000 10, 1 2000 10, 2 3000 20, 2 4000 20, 1
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
この問合せに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.6 ALL MATCHES句
このオプション句を使用すると、重複するパターンに一致するようにOracle Event Processingを構成できます。
ALL MATCHES
句がある場合は、考えられるすべての一致がOracle Event Processingで検出されます。重複している一致、および同じイベントで開始される一致がある場合があります。この場合、パターン量指定子が「グリーディ」であっても「リラクタント」であっても、違いはありません。たとえば、次のようなパターンがあります。
ALL MATCHES PATTERN (A* B)
次のように、同じ結果になります。
ALL MATCHES PATTERN (A*? B)
ALL MATCHES
句がない場合、重複する一致は返されず、アスタリスクなどの量指定子によって、一連の候補(および重複)一致のうち、優先して出力される一致が決定されます。重複する一致の残りは破棄されます。
図15-7 pattern_skip_match_clause::=
![pattern skip match clause pattern skip match clause](img/pattern_skip_match_clause.png)
ALL MATCHES
を使用する問合せtkpattern_q41
と、データ・ストリームtkpattern_S11
があるとします。ストリームtkpattern_S11
のスキーマは(c1 integer, c2 integer)
です。この問合せはストリームを返します。
問合せtkpattern_q41
では、入力ストリーム値のプロットが英字Wの形になる場合に一致が報告されます。リレーションは、このWパターン一致の重複するインスタンスの例を示します。
重複するパターンのインスタンスには2つの種類があります。
-
全体: 全体的な重複の例: 入力に含まれる時間3000-9000および4000-9000の行は両方とも指定されたパターン式に一致します。
ALL MATCHES
句がない場合は、長い方(3000-9000)が使用されます。 -
部分: 部分的な重複の例: 入力に含まれる時間12000-21000および16000-23000の行は両方とも指定されたパターン式に一致します。
ALL MATCHES
句がない場合は、先に出現した方が使用されます。これは、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>
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
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
ALL MATCHES
句では特定の入力が受信されると、一致するすべてのパターン・インスタンスが報告されます。たとえば、時間20000では{12,20}
、{13,20}
および{14,20}
のすべてのタプルが出力されます。
詳細は、「パターン量指定子と正規表現」を参照してください。
15.7 WITHIN句
WITHIN
句は、指定された時間内で一致が発生する場合にのみ、pattern_clause
一致を出力するオプションの句です。
図15-8 within_clause::=
![within clause within clause](img/within_clause.png)
つまり、次の場合にのみ発生します。
TL - TF < WD
説明:
-
TL
- パターンに一致する最後のイベントのタイムスタンプ。 -
TF
- パターンに一致する最初のイベントのタイムスタンプ。 -
WD
-WITHIN
句で指定された期間。
WITHIN INCLUSIVE
句は境界でのイベントの一致も試みます。すなわち、次の場合に一致を出力します。
TL - TF <= WD
一致が指定された期間内に完了した場合、イベントは発生するとただちに出力されます。すなわち、一致を出力できる場合、完了時のタイムスタンプとともに出力されます。WITHIN
句は、DURATION
句のように期間が期限切れになるのを待機しません。
WITHIN
句の期間が期限切れになると、不完全な一致候補はすべて破棄されます。
詳細は、「WITHIN句を使用したパターン検出」を参照してください。
注意:
WITHIN
句とDURATION
句を併用することはできません。詳細は、「DURATION句」を参照してください。
15.8 DURATION句
DURATION
句は、イベントの欠落を検出する問合せを作成する場合にのみ使用する必要のあるオプションの句です。イベントの欠落の検出では、特定の制限時間内に発生するはずの特定のイベントが時間内に発生しない状況が検出されます。
図15-9 duration_clause::=
![duration clause duration clause](img/duration_clause_fixed.png)
(図7-10)
この句を使用すると、PATTERN
句の正規表現が完全に一致し、DURATION
句に指定された期間が期限切れになるまで他のイベントまたは入力が到着しない場合にのみ、一致が報告されます。期間は、パターンの一致の最初のイベントが到着した時点から計測されます。
DURATION
句を使用する場合は、INCLUDE TIMER EVENTS
句を使用する必要があります。詳細は、「INCLUDE TIMER EVENTS句」を参照してください。
この項の内容は、次のとおりです。
注意:
DURATION
句とWITHIN
句を併用することはできません。詳細は、「WITHIN句」を参照してください。
15.8.1 固定期間のイベント欠落の検出
期間は、10などの定数値として指定できます。オプションで、秒数や分数などの時間単位を指定できます(図7-11を参照)。デフォルトの時間単位は秒数です。
DURATION 10
を使用して10秒(10000ms)の遅延を指定する問合せtkpattern_q59
と、データ・ストリームtkpattern_S19
があるとします。ストリームtkpattern_S19
のスキーマは(c1 integer)
です。この問合せはストリームを返します。
<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>
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
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
の時点で一致が報告されます。同様のロジックに従って、以降の出力が生成されます。
詳細は、「固定期間のイベント欠落の検出」を参照してください。
15.8.2 反復的なイベント欠落の検出
MULTIPLES OF
句を指定した場合は、反復的なイベント欠落の検出が示されます。この場合、パターンが完全に一致した後にイベントが発生しないかぎり、期間値の倍数の時点で出力が送信されます。
DURATION MULTIPLES OF 10
を使用して10秒(10000ms)の遅延を指定する問合せtkpattern_q75
と、データ・ストリームtkpattern_S23
があるとします。ストリームtkpattern_S23
のスキーマは(c1 integer)
です。この問合せはストリームを返します。
<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>
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
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およびそれ以降は同様に出力が行われます。
15.10 SUBSET句
この句を使用すると、DEFINE
句に定義された1つ以上の相関変数をグループにまとめることができます。MEASURES
とDEFINE
では、他の任意の相関変数と同様にこの名前付きサブセットを使用できます。
次に例を示します。
SUBSET S1 = (Z,X)
サブセットの右側((Z,X)
)は、PATTERN
句での定義に基づいた1つ以上の相関変数のカンマ区切りのリストです。
サブセットの左側(S1
)は、右側の相関変数を結合したものです。
サブセットの右側にサブセット変数を含めることはできません。
図15-11 subset_clause::=
![subset clause subset clause](img/subset_clause.png)
(図15-12)
図15-12 non_mt_subset_definition_list::=
![non mt subset definition clause non mt subset definition clause](img/non_mt_subset_def_list.png)
(図15-13)
図15-14 subset_name::=
![subset name subset name](img/subset_name.png)
(図7-3)
図15-15 non_mt_corr_list::=
![non mt corr list non mt corr list](img/non_mt_corr_list.png)
例15-1の問合せq55
と、例15-2のデータ・ストリーム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-1 SUBSET句の問合せ
<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-2 SUBSET句の問合せ
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
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.11 MATCH_RECOGNIZEの例
次に、基本的なMATCH_RECOGNIZE
の実際の例を示します。
15.11.1 パターン検出
図15-16に示すような株価変動について考えます。このデータは証券コード(索引番号または時間)および株価のストリームとして表すことができます。図15-16では、1~9日および12~19日の間に二番底パターンと呼ばれるトレーディングの一般的な現象が発生しています。このパターンは、W字形の株価変動(下降(X)
、上昇(Y)
、下降(W)
、2度目の上昇(Z)
)として視覚化されます。
例15-3は、スキーマsymbol
、stockTick
および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番目の上昇部分に相当します。
例15-3 パターン検出
<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>
15.11.2 PARTITION BYを使用したパターン検出
図15-17に示すような株価変動について考えます。このデータは証券コード(索引番号または時間)および株価のストリームとして表すことができます。この例では、複数の証券コードのデータがストリームに含まれています。図15-17では、銘柄BOFAの1~9日および12~19日の間に二番底パターンと呼ばれるトレーディングの一般的な現象が発生しています。このパターンは、W字形の株価変動(下降(X)
、上昇(Y)
、下降(W)
、2度目の上昇(Z)
)として視覚化されます。
例15-4は、スキーマsymbol
、stockTick
およびprice
を持つ株価イベントのストリームS2
に対する問合せq
を示します。この問合せではPATTERN
句(A W+ X+ Y+ Z+
)を使用して、着信する株取引の二番底パターンを検出します。この句の相関名は次のとおりです。
-
A
: 二番底パターンの開始点に相当します。 -
W
+: 二番底パターンの最初の下降部分に相当します。これはW.price < prev(W.price)
として定義され、現在の価格が前の価格よりも低いことを意味します。 -
X+
: 二番底パターンの最初の上昇部分に相当します。 -
Y+
: 二番底パターンの2番目の下降部分に相当します。 -
Z+
: 二番底パターンの2番目の上昇部分に相当します。
問合せではPARTITION BY
句を使用して入力ストリームを株価表示記号別に分割し、各論理ストリームにこのPATTERN
句を適用します。
例15-4 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>
15.11.3 集計を使用したパターン検出
問合せq1
とデータ・ストリームS
があるとします。ストリームS
のスキーマは(c1 integer)
です。この問合せはストリームを返します。
<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>
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
Timestamp Tuple 8000 338 12000 52
15.11.4 WITHIN句を使用したパターン検出
問合せとデータ・ストリームS
があるとします。ストリームS
のスキーマは(c1 integer, c2 integer)
です。表15-3で、これらの問合せの出力を比較します。
<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>
<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>
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
表15-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, |
表15-3のqueryWithin
問合せに示すように、候補一致はTimeStamp=1000
のイベントで開始されます。WITHIN
句の期間が3秒であるため、問合せは、TimeStamp=4000
のイベントの前に完了した場合にのみ、一致を出力します。問合せがTimeStampe=4000
のイベントを受け取ると、その時点までで最も長い一致が出力されます(ALL MATCHES
を使用していないため)。TimeStamp=4000
のイベントがB
に一致しても、そのイベントは一致に含まれないことに注意してください。次の一致は、TimeStamp=4000
のイベントから開始されます。このイベントもA
に一致しており、以前の一致がTimeStamp=3000
で終了しているためです。
表15-3のqueryWithinInclusive
問合せに示すように、候補一致はTimeStamp=1000
のイベントで開始されます。問合せがTimeStamp=4000
のイベントを受け取る場合、問合せではWITHIN INCLUSIVE
が使用され、イベントがB
に一致するため、このイベントは一致に含められます。TimeStamp=5000
のイベントはB
に一致しますが、一致の開始(TimeStamp=1000
)から測定した期間(3秒)を超えているため、パターンはこれ以上拡張されません。一致はTimeStamp=4000
に終了しており、ALL MATCHES
を使用していないため、A
と一致する場合であっても、次の一致はTimeStamp=4000
に開始されません。
詳細については、以下を参照:
15.11.5 固定期間のイベント欠落の検出
5つの異なる部屋を移動するオブジェクトがあるとします。オブジェクトは、毎回部屋1を出発し、5分以内に部屋5に到着する必要があります。図15-18は、オブジェクトの動きを示しています。このデータは、時間および部屋番号のストリームとして表すことができます。オブジェクトは、時間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を使用して、このようなイベント欠落を問い合せることができます。
次の例は、ストリームS
(部屋番号を表すc1
integerスキーマを持つ)に対してイベントの欠落を検出する問合せq
を示します。オブジェクトが部屋1を出発してから5分以内に部屋5に到着しなかった場合は毎回問合せによって部屋1を出発した時刻が返されます。
<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>
詳細は、「DURATION句」を参照してください。