0

我正在尝试编写一个基于时间运算符收集/累积值的规则。

rule "Zone6 Overlap"
when
    $i1 : Instance ($e1 : event == " Vel : 20.99-23.98 km/h : " && $name1 : name) from entry-point "Stream"
    $i2 : Instance ($e2 : event && $name2 : name && $e2 == $e1 && $name2 != $name1 
    && this overlaps $i1) from entry-point "Stream"
then 
    System.out.println("** Overlap Event: Velocity Zone 6 ** \nPlayer1: " + $i1.getName() + "\nPlayer2: " 
    + $i2.getName() + "\nEvent: " + $i1.getEvent() + "\n" + "Start Time (P1): " 
    + $i1.getStart() + " - End Time: " + $i1.getEnd() + "\nStart Time (P2): " 
    + $i2.getStart() + " - End Time: " + $i2.getEnd() + "\n");
end

这是我最初的规则,它设法使两个持续时间重叠。

我要创建的规则的想法是查看足球比赛中球员的持续时间是否存在任何集体重叠。我想看看场上最多 9 名球员中是否有任何一名球员以事件变量中指定为字符串的速度范围移动,这些速度都同时重叠。

我已经尝试了一些关于累积和收集的事情,但是在这些事件发生时如何收集它们并将它们返回到规则的右侧以便它们可以打印到标准输出时遇到了困难。

请帮忙。

谢谢。

4

1 回答 1

1

应该可以创建一个规则来满足您的要求,但我认为您需要了解 Drools 中重叠关键字的确切定义:

当当前事件在相关事件开始之前开始并且在相关事件开始之后但在相关事件结束之前结束时,重叠评估器将两个事件相关并匹配。换句话说,两个事件都有一个重叠的时期。

这意味着它不会匹配任何任意重叠,但前提是一个事件既在另一个事件开始之前开始,又在该事件结束之前结束。假设我们有以下 3 个事件:

A [11:19:00-11:19:30]
B [11:19:15-11:19:45]
C [11:19:20-11:19:40]

在这种情况下,A 在 B 和 C 之前开始,并且在两者之前结束。这意味着 A 与 B 和 C 重叠。但是,B 不与 C 重叠,因为它在 C 之前开始,但在 C 之后结束。有关每个可用运算符的完整定义,请参阅Drools 融合文档

如果这与您的用例匹配,则以下规则将收集与给定事件重叠的所有事件:

rule "Overlap"
when
    $i1 : Instance ($e1 : event == "some event" ) 
    $instances : List( size > 0 ) from collect ( Instance ( event == $e1, this != $i1, 
        this overlappedby $i1 ) )
then
    System.out.println("** Overlap Event for: " + $i1.getName());
    for (int i = 0; i < $instances.size(); i++) {
        System.out.println("Overlaps: " +  ((Instance)$instances.get(i)).getName());
    }
end

如您所见,它使用了overlappedby关键字,这是overlaps 的倒数

于 2016-08-17T18:29:48.247 回答