java - 基于时间运算符的累加/收集

标签 java drools fusion accumulate

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

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 名球员中是否有任何人以事件变量中指定为字符串的速度范围行进,并且这些速度同时全部重叠。

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

请帮忙。

谢谢。

最佳答案

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

The overlaps evaluator correlates two events and matches when the current event starts before the correlated event starts and finishes after the correlated event starts, but before the correlated event finishes. In other words, both events have an overlapping period.

这意味着它不会匹配任何任意重叠,但前提是一个事件既在另一个事件开始之前开始,又在该事件结束之前结束。假设我们有以下 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 fusion documentation .

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

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的反义词。

关于java - 基于时间运算符的累加/收集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38998500/

相关文章:

assemblies - CLR 何时尝试加载引用的程序集?

c# - AppDomain 执行程序集

java - Maven 循环依赖

java - 计算从 mysql 数据库检索的行数

java - JScrollPane 打破从右到左的方向

java - 如何使用 java selenium 重构按钮 webElement?

java - 无法在 JBPM 中启动和完成任务

java - 决策表的口水表现

java - 使用 Drools 的动态规则

c# - Fusion loader 找不到实际存在的 DLL