Drools对象图规则定义

Drools对象图规则定义,drools,object-graph,Drools,Object Graph,我有一个对象图,我正试图从它生成Drools中的实现对象。具体来说,实现对象表示满足或不满足的规则。我的对象图如下所示: Users ---> many Requirements --> Event `--> many Records ----^ rule "fulfils" when $u : User() $rec : Record() from $u.records $r : Requirement(event contai

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

Users ---> many Requirements --> Event
      `--> many Records      ----^
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
如果记录都指向同一事件,则它们可以满足要求。这将在Drools中生成一个实现对象

产生履行的缩减规则如下所示:

Users ---> many Requirements --> Event
      `--> many Records      ----^
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
我在这里遇到的问题是,如果用户没有记录,就没有为需求插入履行。我相信这是因为没有可以搜索的记录()来满足我的图

有没有一种方法可以在不需要超过零的情况下使用记录

此外,我是否需要在此处插入两条规则来插入正确和错误的履行情况,或者是否有更好的方法

编辑

这些规则面临的另一个问题是
需求(event包含$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

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

针对您的情况使用两种不同的规则是一种常见模式。它使您的规则库更易于阅读(并且在某种程度上也便于维护)。 关于您关于no Record()的问题,我认为您可以这样写(如果我正确理解您的问题):


这很有效,谢谢。我的规则似乎还有另一个问题。。你也能解决这个问题吗?