Drools对象图规则定义

时间:2013-02-05 01:06:33

标签: drools object-graph

我有一个对象图,我试图在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()来搜索以满足我的图形。

有没有办法使用记录而不需要存在多于零的记录?

此外,我是否需要在此处插入两条规则来插入true和false Fulfillments,还是有更好的方法来执行此操作?

修改

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

另一个编辑

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

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

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

1 个答案:

答案 0 :(得分: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