分类:
2010-12-26 15:12:38
2.4 时间(Temporal)推理
时间推理是任何CEP系统的又一个必要条件。如上所讨论,事件的一个显著特性是它们强烈的时间关系。
时间推理是一个广泛研究的领域,从有关时间形式逻辑(Temporal Modal Logic)的根源到业务系统中更实际的应用。
对一些应用描述的方法,有数以百计的文章和编写的论文。Drools在几个资源的基础上,再次采取了务实和简单的方法,下面的文章特别值得注意:
[ALLEN81]Allen, J.F..An Interval-based Representation of Temporal Knowledge. 1981.
[ALLEN83]Allen, J.F..Maintaining knowledge about temporal intervals. 1983.
[BENNE00] by Bennet, Brandon and Galton, Antony P.. A Unifying Semantics for Time and Events. 2005.
[YONEK05] by Yoneki, Eiko and Bacon, Jean. Unified Semantics for Event Correlation Over Time and Space in Hybrid Network Environments. 2005.
Drools实现了由Allen描述的Interval-based Time Event(基于区间的时间事件)语义,并且用期限为0的Interval-based 事件表示Point-in-Time事件。
2.4.1 时间运算符
Drools实现了由Allen定义的所有13种运算符,以及它们的逻辑补(非)。这部分详细描述每个运算符和它们的参数。
2.4.1.1 After
After运算符与两个事件相关, 并且当从当前事件到相关联事件的时间距离属于操作符声明的距离范围时进行匹配。
让我们看一个例子:
$eventA : EventA( this after[ 3m30s, 4m ] $eventB )
当且仅当在$eventB完成时的时间与当$eventA开始时的时间的时间距离是在(3分30秒)和(4分钟)之间时,上面的模式才会匹配。换言之:
3m30s <= $eventA.startTimestamp - $eventB.endTimeStamp <= 4m
After运算符的时间距离区间是可选的:
l 如果定义了两个值(如下所示),区间从第一个值开始到第二个值结束。
l 如果只定义了一个值,区间从该值开始到正无穷大结束。
l 如果没有定义值,它假设开始值为1毫秒,终值为正无穷大。
技巧:这个运行运算符可以定义负的距离,例如:
$eventA : EventA( this after[ -3m30s, -2m ] $eventB )
注意:如果第一个值大于第二个值,引擎自动倒转它们,因为没有理由第一个值大于第二个值。例如,下面的两个模式被认为有相同的语义:
$eventA : EventA( this after[ -3m30s, -2m ] $eventB )
$eventA : EventA( this after[ -2m, -3m30s ] $eventB )
2.4.1.2 Before
Before运算符与两个事件相关, 并且当从相关联事件到当前事件的时间距离属于操作符声明的距离范围时进行匹配。
让我们看一个例子:
$eventA : EventA( this before[ 3m30s, 4m ] $eventB )
当且仅当在$eventB开始时的时间与当$eventA完成时的时间的时间距离是在(3分30秒)和(4分钟)之间时,上面的模式才会匹配。换言之:
3m30s <= $eventB.startTimestamp - $eventA.endTimeStamp <= 4m
Before运算符的时间距离区间是可选的:
l 如果定义了两个值(如下所示),区间从第一个值开始到第二个值结束。
l 如果只定义了一个值,区间从该值开始到正无穷大结束。
l 如果没有定义值,它假设开始值为1毫秒,终值为正无穷大。
技巧:这个运行运算符可以定义负的距离,例如:
$eventA : EventA( this before[ -3m30s, -2m ] $eventB )
注意:如果第一个值大于第二个值,引擎自动倒转它们,因为没有理由第一个值大于第二个值。例如,下面的两个模式被认为有相同的语义:
$eventA : EventA( this before[ -3m30s, -2m ] $eventB )
$eventA : EventA( this before[ -2m, -3m30s ] $eventB )
2.4.1.3 Coincides
Coincidesf运算符关联两个事件,并且当两个事件在相同的时间发生时进行匹配。可选的,运算符接受事件的开始时间戳和结束时间戳之间的距离阈值。
让我们看一个例子:
$eventA : EventA( this coincides $eventB )
当且仅当$eventA和$eventB两个的开始时间戳相同,且$eventA和$eventB结束时间戳也相同时,上面的模式才会匹配。
可选的,这个运算符接受一个或两个操作符。这些参数是匹配时间戳之间的距离阈值。
l 如果只给了一个参数,其用于开始时间戳和结束时间戳两个。
l 如果给了两个参数,那么第一个用来作为开始时间戳的阈值,第二用来作为结束时间戳的阈值。
换言之:
$eventA : EventA( this coincides[15s, 10s] $eventB )
上面的模式会匹配,当且仅当:
abs( $eventA.startTimestamp - $eventB.startTimestamp ) <= 15s &&
abs( $eventA.endTimestamp - $eventB.endTimestamp ) <= 10s
警告:该参数使用负的区间值是没有意义,并且如果那样,引擎会引发一个错误。
2.4.1.4 During
During运算符关联两个事件,并且在关联的事件出现期间当前的事件发生时进行匹配。
让我们看一个例子:
$eventA : EventA( this during $eventB )
当且仅当在$eventA开始在$eventB 开始后,且结束在$eventB结束前,上面的模式会匹配。
换言之:
$eventB.startTimestamp < $eventA.startTimestamp <= $eventA.endTimestamp < $eventB.endTimestamp
During运算符接受1、2或4个参数,如下所示:
l 如果定义一个值,它会是用于运算符匹配的两个事件的开始时间戳之间的最大距离,和两个事件的结束时间戳的最大距离,如:
$eventA : EventA( this during[ 5s ] $eventB )
模式会匹配,当且仅当:
0 < $eventA.startTimestamp - $eventB.startTimestamp <= 5s &&
0 < $eventB.endTimestamp - $eventA.endTimestamp <= 5s
l 如果定义两个值,第一个值是两个事件的开始时间戳之间的最小距离,第二个值是两个事件的结束时间戳的最大距离,如:
$eventA : EventA( this during[ 5s, 10s ] $eventB )
模式会匹配,当且仅当:
5s <= $eventA.startTimestamp - $eventB.startTimestamp <= 10s &&
5s <= $eventB.endTimestamp - $eventA.endTimestamp <= 10s
l 如果定义四个值,前面两个值是两个事件的开始时间戳之间的最小距离和最大距离,后面两个值是两个事件的结束时间戳之间的最小距离和最大距离:
$eventA : EventA( this during[ 2s, 6s, 4s, 10s ] $eventB )
模式会匹配,当且仅当:
2s <= $eventA.startTimestamp - $eventB.startTimestamp <= 6s &&
4s <= $eventB.endTimestamp - $eventA.endTimestamp <= 10s
2.4.1.5 Finishes
Finishes运算符关联两个事件,在当前事件的开始时间戳发生在相关联的事件开始时间戳之后,但两个的结束时间戳发生在相同时间时进行匹配。
让我们看一个例子:
$eventA : EventA( this finishes $eventB )
当且仅当 $eventA开始在$eventB开始之后,并且结束在$eventB结束的相同时间,上面的模式会匹配。
换言之:
$eventB.startTimestamp < $eventA.startTimestamp &&
$eventA.endTimestamp == $eventB.endTimestamp
finishes运算符接受一个可选参数。如果定义了它,它确定两个事件的结束时间戳之间的最大距离,用于运算符匹配。如:
$eventA : EventA( this finishes[ 5s ] $eventB )
会匹配,当且仅当:
$eventB.startTimestamp < $eventA.startTimestamp &&
abs( $eventA.endTimestamp - $eventB.endTimestamp ) <= 5s
警告:该参数使用负的区间值是没有意义,并且如果那样,引擎会引发一个异常。
2.4.1.6 Finished by
Finishedby运算符关联两个事件,在当前事件的开始时间戳发生在相关联的事件开始时间戳之前,但两个的结束时间戳发生在相同时间时进行匹配。它是Finishes运行符的对称面。
让我们看一个例子:
$eventA : EventA( this finishedby $eventB )
当且仅当 $eventA开始在$eventB开始之前,并且结束在$eventB结束的相同时间,上面的模式会匹配。
换言之:
$eventA.startTimestamp < $eventB.startTimestamp &&
$eventA.endTimestamp == $eventB.endTimestamp
finishedby运算符接受一个可选参数。如果定义了它,它确定两个事件的结束时间戳之间的最大距离,用于运算符匹配。如:
$eventA : EventA( this finishedby[ 5s ] $eventB )
会匹配,当且仅当:
$eventA.startTimestamp < $eventB.startTimestamp &&
abs( $eventA.endTimestamp - $eventB.endTimestamp ) <= 5s
警告:该参数使用负的区间值是没有意义,并且如果那样,引擎会引发一个异常。
2.4.1.7 Includes
Includes运算符关联两个事件,并且关联的事件发生在当前事件期间时进行匹配。它是during运算符的对称面。
让我们看一个例子:
$eventA : EventA( this finishes $eventB )
当且仅当在$eventB开始在$eventA 开始后,且结束在$eventA结束前,上面的模式会匹配。
换言之:
$eventA.startTimestamp < $eventB.startTimestamp <= $eventB.endTimestamp < $eventA.endTimestamp
Includes运算符接受1、2或4个参数,如下所示:
l 如果定义一个值,它会是用于运算符匹配的两个事件的开始时间戳之间的最大距离,和两个事件的结束时间戳的最大距离,如:
$eventA : EventA( this includes[ 5s ] $eventB )
模式会匹配,当且仅当:
0 < $eventB.startTimestamp - $eventA.startTimestamp <= 5s &&
0 < $eventA.endTimestamp - $eventB.endTimestamp <= 5s
l 如果定义两个值,第一个值是两个事件的开始时间戳之间的最小距离,第二个值是两个事件的结束时间戳的最大距离,如:
$eventA : EventA( this includes[ 5s, 10s ] $eventB )
模式会匹配,当且仅当:
5s <= $eventB.startTimestamp - $eventA.startTimestamp <= 10s &&
5s <= $eventA.endTimestamp - $eventB.endTimestamp <= 10s
l 如果定义四个值,前面两个值是两个事件的开始时间戳之间的最小距离和最大距离,后面两个值是两个事件的结束时间戳之间的最小距离和最大距离:
$eventA : EventA( this includes[ 2s, 6s, 4s, 10s ] $eventB )
模式会匹配,当且仅当:
2s <= $eventB.startTimestamp - $eventA.startTimestamp <= 6s &&
4s <= $eventA.endTimestamp - $eventB.endTimestamp <= 10s
2.4.1.8 Meets
Meets运算符关联两个事件,并且当前事件的结束时间戳发生与关联事件的开始时间戳相同时进行匹配。
让我们看一个例子:
$eventA : EventA( this meets $eventB )
当且仅当$eventA结束在$eventB开始的相同时间,上面的模式会匹配。
换言之:
abs( $eventB.startTimestamp - $eventA.endTimestamp ) == 0
meets运算符接受一个可选参数。如果定义了它,它确定当前事件的结束时间戳与关联事件的开始时间戳的最大距离,用于该运算符的匹配,例如:
$eventA : EventA( this meets[ 5s ] $eventB )
会匹配,当且仅当:
abs( $eventB.startTimestamp - $eventA.endTimestamp) <= 5s
警告:该参数使用负的区间值是没有意义,并且如果那样,引擎会引发一个异常。
2.4.1.9 Met by
Metby运算符关联两个事件,并且当前事件的开始时间戳发生与关联事件的结束时间戳相同时进行匹配。
让我们看一个例子:
$eventA : EventA( this metby $eventB )
当且仅当$eventA开始在$eventB结束的相同时间,上面的模式会匹配。
换言之:
abs( $eventA.startTimestamp - $eventB.endTimestamp ) == 0
metby运算符接受一个可选参数。如果定义了它,它确定当前事件的结束时间戳与关联事件的开始时间戳的最大距离,用于该运算符的匹配,例如:
$eventA : EventA( this metby[ 5s ] $eventB )
会匹配,当且仅当:
abs( $eventA.startTimestamp - $eventB.endTimestamp) <= 5s
警告:该参数使用负的区间值是没有意义,并且如果那样,引擎会引发一个异常。
2.4.1.10 Overlaps
Overlaps运算符关联两个事件,并且在当前事件开始在关联事件开始前,结束在关联事件开始后,但在关联事件结束前时进行匹配。换言之,两个事件有一个重叠期。
让我们看一个例子:
$eventA : EventA( this overlaps $eventB )
上面的例子会匹配,当且仅当:
$eventA.startTimestamp < $eventB.startTimestamp < $eventA.endTimestamp < $eventB.endTimestamp
overlaps运算符接受1或2个参数,如下所示:
l 如果定义了一个参数,它将是关联事件的开始时间戳与当前事件的结束时间戳之间的最大距离。如:
$eventA : EventA( this overlaps[ 5s ] $eventB )
会匹配,当且仅当:
$eventA.startTimestamp < $eventB.startTimestamp < $eventA.endTimestamp < $eventB.endTimestamp &&
0 <= $eventA.endTimestamp - $eventB.startTimestamp <= 5s
l 如果定义了两个值,它们将是关联事件的开始时间戳与当前事件的结束时间戳之间的最小距离和最大距离。如:
$eventA : EventA( this overlaps[ 5s, 10s ] $eventB )
会匹配,当且仅当:
$eventA.startTimestamp < $eventB.startTimestamp < $eventA.endTimestamp < $eventB.endTimestamp &&
5s <= $eventA.endTimestamp - $eventB.startTimestamp <= 10s
2.4.1.11 Overlappd by
Overlappd运算符关联两个事件,并且在关联事件开始在当前事件开始前,结束在当前事件开始后,但在当前事件结束前时进行匹配。换言之,两个事件有一个重叠期。
让我们看一个例子:
$eventA : EventA( this overlappedby $eventB )
上面的例子会匹配,当且仅当:
$eventB.startTimestamp < $eventA.startTimestamp < $eventB.endTimestamp < $eventA.endTimestamp
overlappd运算符接受1或2个参数,如下所示:
l 如果定义了一个参数,它将是当前事件的开始时间戳与关联事件的结束时间戳之间的最大距离。如:
$eventA : EventA( this overlappedby[ 5s ] $eventB )
会匹配,当且仅当:
$eventB.startTimestamp < $eventA.startTimestamp < $eventB.endTimestamp < $eventA.endTimestamp &&
0 <= $eventB.endTimestamp - $eventA.startTimestamp <= 5s
l 如果定义了两个值,它们将是当前事件的开始时间戳与关联事件的结束时间戳之间的最小距离和最大距离。如:
$eventA : EventA( this overlappedby[ 5s, 10s ] $eventB )
会匹配,当且仅当:
$eventB.startTimestamp < $eventA.startTimestamp < $eventB.endTimestamp < $eventA.endTimestamp &&
5s <= $eventB.endTimestamp - $eventA.startTimestamp <= 10s
2.4.1.12 Starts
Starts运算符关联两个事件,并且在当前事件结束时间戳发生在关联事件的结束时间戳之前,但两个的开始时间戳发生在相同的时间进匹配。让我们看一个例子:
$eventA : EventA( this starts $eventB )
当且仅当 $eventA结束在$eventB 结束之前,且开始在$eventB开始的相同时间时,上面的模式会匹配。
换言之:
$eventA.startTimestamp == $eventB.startTimestamp &&
$eventA.endTimestamp < $eventB.endTimestamp
starts运算符接受一个可选参数。如果定义了它,它确定两个事件开始时间戳的最大距离,用于该运算符的匹配,例如:
$eventA : EventA( this starts[ 5s ] $eventB )
会匹配,当且仅当:
abs( $eventA.startTimestamp - $eventB.startTimestamp ) <= 5s &&
$eventA.endTimestamp < $eventB.endTimestamp
警告:该参数使用负的区间值是没有意义,并且如果那样,引擎会引发一个异常。
2.4.1.13 Started by
Startedby运算符关联两个事件,并且在关联事件结束时间戳发生在当前事件的结束时间戳之前,但两个的开始时间戳发生在相同的时间进匹配。让我们看一个例子:
$eventA : EventA( this startedby $eventB )
当且仅当 $eventB结束在$eventA 结束之前,且开始在$eventB开始的相同时间时,上面的模式会匹配。
换言之:
$eventA.startTimestamp == $eventB.startTimestamp &&
$eventA.endTimestamp > $eventB.endTimestamp
startedby运算符接受一个可选参数。如果定义了它,它确定两个事件开始时间戳的最大距离,用于该运算符的匹配,例如:
$eventA : EventA( this startedby[ 5s ] $eventB )
会匹配,当且仅当:
abs( $eventA.startTimestamp - $eventB.startTimestamp ) <= 5s &&
$eventA.endTimestamp > $eventB.endTimestamp
警告:该参数使用负的区间值是没有意义,并且如果那样,引擎会引发一个异常。