如何使用 Esper EPL (CEP) 在模式中索引事件

How to index events in patterns with Esper EPL (CEP)

我无法使用索引或某物来引用特定事件。类似于由 window 定义的生成的数据元组(据我了解 Esper CEP 引擎背后的逻辑)。没有参考的可能性,我无法在 Esper EPL 中实现新 CEP 模式的逻辑。

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

传入事件:
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 模式 [每个 (a=EventStream(PressureEvent=0) -> b=EventStream(Temp1Event[0] > 0.7*Temp1Event[2]))].win:length(3);

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

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

非常感谢! :)

你可以做到这一点。

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

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

还有其他解决方案。 "prev" 函数或枚举(即取)。