我有一个对象图,我正试图从Drools中生成Fulfillment对象。具体来说,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
我在这里遇到的问题是,如果用户没有记录,那么就没有为需求插入Fulfillment。我相信这是因为没有Record()可以搜索来满足我的图。
有没有一种方法可以在不需要超过零的情况下使用这些记录?
此外,我需要两条规则来插入正确和错误的履行吗?或者有更好的方法吗?
编辑
我在使用这些规则时面临的另一个问题是,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
这解决了比较两个集合的重叠的问题,以及用户没有记录的情况。(希望对此进行验证)。
针对您的情况使用两种不同的规则是一种常见的模式。它使您的规则库更易于阅读(在某种程度上也便于维护)。关于你关于没有录音()的问题,我想你可以写这样的东西(如果我正确理解你的问题):
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