我有一个对象图,我试图从 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
这处理了比较两个集合的重叠的问题,以及用户没有记录的情况。(希望对此进行一些验证)。