0

我有一个对象图,我试图从 Drools 中生成 Fulfillment 对象。具体来说,Fulfillment 对象表示满足或不满足的规则。我的对象图如下所示:

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

如果记录都指向同一个事件,则它们可以满足要求。这会在 Drools 中生成一个 Fulfillment 对象。

产生 Fulfillments 的减少规则如下:

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

我在这里遇到的问题是,如果用户没有记录,则没有为需求插入 Fulfillment。我相信这是因为没有 Record() 可以搜索来满足我的图表。

有没有办法使用记录而不需要超过零存在?

另外,我是否需要两个规则来插入真假履行,还是有更好的方法来做到这一点?

编辑

这些规则我面临的另一个问题是Requirement(event contains $rec.event)没有完成查找是否有任何记录满足给定事件集合的任务。有没有更好的方法来查找多个记录的单个事件与单个要求多个事件之间是否存在重叠?

另一个编辑

这是我想到的另一种方法。如果没有找到需求/记录对,而不是插入 Fulfillments,为什么不为没有匹配的正 Fullfillment 的所有需求插入逻辑 Fullfillments:

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

这处理了比较两个集合的重叠的问题,以及用户没有记录的情况。(希望对此进行一些验证)。

4

1 回答 1

1

针对您的情况使用 2 种不同的规则是一种常见模式。它使您的规则库更易于阅读(并且以某种方式维护)。关于你关于 no 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 回答