【问题标题】:How to index events in patterns with Esper EPL (CEP)如何使用 Esper EPL (CEP) 以模式索引事件
【发布时间】:2019-01-15 21:00:53
【问题描述】:

我无法使用索引或某事来引用特定事件。类似于定义的窗口生成的数据元组(因为我已经理解了 Esper CEP 引擎背后的逻辑)。如果没有引用的可能性,我无法在 Esper EPL 中实现新 CEP 模式的逻辑。

已经尝试过:
1) 先前的功能,但不允许在模式中使用 [例如来自 Esper Doc.: 从 Trade.win 中选择 prev(2, price):length(10)]
2) 像在 Python 或 Java 中一样索引元组 [e.g. dataTuple[1] 用于第二个条目]
3)创建几个部分(a,b,c ...)并引用它们[例如a=EventA -> b=EventA

即将发生的事件:
EventStream={id=1, Temp1Event=35.5, Temp2Event=37.2, PressureEvent=896.99}
t=t.plus(2 秒)
EventStream={id=2, Temp1Event=37.4, Temp2Event=39.1, PressureEvent=869.5}
t=t.plus(2 秒)
EventStream={id=3, Temp1Event=48.3, Temp2Event=51.9, PressureEvent=908.56}
t=t.plus(2 秒)
EventStream={id=4, Temp1Event=55.7, Temp2Event=56.9, PressureEvent=928.82}
t=t.plus(2 秒)
EventStream={id=5, Temp1Event=66.5, Temp2Event=39.48, PressureEvent=0}
t=t.plus(2 秒)
EventStream={id=6, Temp1Event=52.3745930271536, Temp2Event=31.1136121636059, PressureEvent=0}
t=t.plus(2 秒)
EventStream={id=7, Temp1Event=41.9102341671244, Temp2Event=24.9156396131152, PressureEvent=0}

规则的逻辑:
如果压力变为“0”并因此温度迅速下降,则发出压力室门打开(=规则触发)的警告。

我的声明:
SELECT * FROM 模式 [every (a=EventStream(PressureEvent=0) -> b=EventStream(Temp1Event[0] > 0.7*Temp1Event[2]))].win:length(3);

如果 a) 压力事件变为 0 并且 b) 之后温度迅速下降,我希望规则会触发,这可以通过第一个传入事件的值与第二个传入事件的值来证明。

我知道有函数“lastEvent”和“firstEvent”。也许他们是一个可能的解决方案。尽管如此,我希望得到类似于索引“DataTuple[x]”的可能性,因为我想这更灵活。

提前非常感谢! :)

【问题讨论】:

    标签: indexing pattern-matching complex-event-processing esper


    【解决方案1】:

    你可以这样做。

    SELECT * FROM pattern [every a=EventStream(PressureEvent=0) 
      -> b=EventStream
      -> c=EventStream(b.temp > 0.7*temp)]
    

    在模式中,“tag=”为事件分配一个名称,例如“b”。 然后可以在表达式中使用该标签,例如“b.temp”。

    还有其他解决方案。 “prev”函数或枚举(即take)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多