2016-08-17 60 views
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名球員在場上以一系列速度行進,這些速度在事件變量中被指定爲一個字符串,這些字符串都是一次重疊的。

我已經試過就積累和收集,但與如何發生的時候收集這些事件,並將它們返回到規則的右側,使他們能夠打印到標準輸出掙扎了幾件事情。

請幫忙。

謝謝。

回答

0

應該可以創建規則,以符合您的要求,但我認爲你需要知道的的確切定義的重疊關鍵字在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 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關鍵字,這是逆重疊

+0

啊我明白了。是的,這是有道理的。基本上,時間操作符(重疊)是錯誤的方式(應重疊)。 而我只是簡單地需要使用收集功能,而不是積累。 Drools文檔(包括由packt編寫的書籍)似乎推動了積累功能。因此,爲什麼我對是否使用它感到困惑。無論如何,感謝您的幫助。 – Stu

+0

不客氣。如果你不介意,你能否將我的答案標記爲已接受? –

+0

完成。只是想知道你是否可以爲我回答一個簡短的問題: 我聲明瞭一個全局變量,它是一個列表並用特定對象填充它。在滿足條件後,您是否知道如何在RHS上的全局數組中調用這些對象的方法?謝謝。 – Stu