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

これは、2 つの期間の重複を取得するための私のオリジナルのルールです。

私が作成したいルールのアイデアは、フットボールの試合で選手の継続時間に集合的な重複があるかどうかを確認することです。フィールド上の最大 9 人のプレーヤーのいずれかが、イベント変数の文字列として指定された範囲の速度で同時に移動しているかどうかを確認したいと考えています。

私は蓄積と収集に関していくつかのことを試しましたが、これらのイベントが発生したときにこれらのイベントを収集し、それらをルールの右側に戻して標準出力に出力できるようにする方法に苦労しています。

助けてください。

ありがとう。

4

1 に答える 1

1

要件に合わせてルールを作成することは可能ですが、Drools のオーバーラップキーワードの正確な定義を認識する必要があると思います。

オーバーラップ エバリュエーターは 2 つのイベントを相関させ、現在のイベントが相関イベントの開始前に開始され、相関イベントの開始後、相関イベントが終了する前に終了したときに一致します。つまり、両方のイベントに重複期間があります。

つまり、任意のオーバーラップには一致しませんが、1 つのイベントが別のイベントの開始前に開始し、そのイベントの終了前に終了する場合にのみ一致します。次の 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 のドキュメントを参照してください。

それがユースケースに一致する場合、次のルールは、特定のイベントと重複するすべてのイベントを収集します。

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

ご覧のとおり、overlaps の逆である overloadpedby キーワードを使用します。

于 2016-08-17T18:29:48.247 に答える