0

DroolsでFulfillmentオブジェクトを生成しようとしているオブジェクトグラフがあります。具体的には、フルフィルメントオブジェクトは、満たされている、または満たされていないルールを表します。私のオブジェクトグラフは次のようになります。

Users ---> many Requirements --> Event
      `--> many Records      ----^

レコードが両方とも同じイベントを指している場合、レコードは要件を満たすことができます。これにより、DroolsでFulfillmentオブジェクトが生成されます。

フルフィルメントを生成するための削減ルールは次のとおりです。

rule "fulfils"
when
    $u : User()
    $rec : Record() from $u.records
    $r : Requirement(event contains $rec.event) from $u.requirements
then
    insertLogical( new Fulfillment($u, $rec, $r, true));
    System.out.println("Inserting logical");
end

rule "unfulfils"
when
    $u : User()
    $rec : Record() from $u.records
    $r : Requirement(event not contains $rec.event) from $u.requirements
then
    insertLogical( new Fulfillment($u, $rec, $r, false));
    System.out.println("Inserting logical");
end

query "fulfillment"
    $fulfillment : Fulfillment()
end

ここで遭遇する問題は、ユーザーにレコードがない場合、要件にフルフィルメントが挿入されていないことです。これは、グラフを満たすために検索するRecord()がないためだと思います。

ゼロ以上の存在を必要とせずにレコードを使用する方法はありますか?

また、真と偽の両方のフルフィルメントを挿入するには、ここに2つのルールが必要ですか、それともこれを行うためのより良い方法がありますか?

編集

これらのルールで私が直面しているもう1つの問題はRequirement(event contains $rec.event)、特定のイベントのコレクションを満たすレコードがあるかどうかを見つけるタスクを実行しないことです。多くのレコードの単一のイベントと単一の要件の複数のイベントの間に重複が存在するかどうかを確認するためのより良い方法はありますか?

別の編集

これが私が考えた別のアプローチです。要件とレコードのペアが見つからない場合にフルフィルメントを挿入する代わりに、一致する正のフルフィルメントがないすべての要件に対してロジックフルフィルメントを挿入しないのはなぜですか。

rule "unfulfils"
when
    $u : User()
    $r : Requirement() from $u.requirements
    not(Fulfillment(user == $u, requirement == $r, fulfilled == true))
then
    insertLogical( new Fulfillment($u, null, $r, false));
    System.out.println("Inserting logical");
end

query "fulfillment"
    $fulfillment : Fulfillment()
end

これにより、2つのコレクションの重複を比較する問題と、ユーザーにレコードがない場合が処理されます。(これに関するいくつかの検証をいただければ幸いです)。

4

1 に答える 1

1

状況に応じて2つの異なるルールを使用するのが一般的なパターンです。それはあなたのルールベースを読みやすくします(そして維持する方法でも)。Record()がないことについてのあなたの質問に関して、私はあなたがこのような何かを書くことができると思います(私があなたの質問を正しく理解したならば):

rule "unfulfils because of no Record"
when
    $u : User(records == null || records.empty == true) //A user without records
    $r : Requirement() from $u.requirements // but with Requirements
then
    //You don't have a record to set in your Fulfillment object
    insertLogical( new Fulfillment($u, $rec, null, false));
    System.out.println("Inserting logical");
end
于 2013-02-05T09:26:20.367 に答える