-1

我不明白这段drl代码的一些部分,但我将在这里发布一个问题:

https://github.com/kiegroup/kogito-examples/blob/stable/ruleunit-quarkus-example/src/main/resources/org/kie/kogito/queries/RuleUnitQuery.drl

完整的 drl 代码在这里:

package org.kie.kogito.queries;
unit LoanUnit;
import org.kie.kogito.queries.LoanApplication;
import org.kie.kogito.queries.AllAmounts;
rule SmallDepositApprove when
    $l: /loanApplications[ applicant.age >= 20, deposit < 1000, amount <= 2000 ]
then
    modify($l) { setApproved(true) };
end
rule SmallDepositReject when
    $l: /loanApplications[ applicant.age >= 20, deposit < 1000, amount > 2000 ]
then
    modify($l) { setApproved(false) };
end
rule LargeDepositApprove when
    $l: /loanApplications[ applicant.age >= 20, deposit >= 1000, amount <= maxAmount ]
then
    modify($l) { setApproved(true) };
end
rule LargeDepositReject when
    $l: /loanApplications[ applicant.age >= 20, deposit >= 1000, amount > maxAmount ]
then
    modify($l) { setApproved(false) };
end
rule NotAdultApplication when
    $l: /loanApplications[ applicant.age < 20 ]
then
    modify($l) { setApproved(false) };
end
query FindApproved
    $l: /loanApplications[ approved ]
end
query FindNotApprovedIdAndAmount
    /loanApplications[ !approved, $id: id, $amount : amount ]
end
rule AllAmounts
when
    accumulate ( $a : /loanApplications ; $sum : sum($a.amount))
then
    allAmounts.add(new AllAmounts($sum));
end
query FindAllApplicationAmounts
    $a : /allAmounts
end

modify($l) { setApproved(true) };

我已经看到了update在其他 drl 文件中的使用。modify和有什么区别update?是否有修改过的链接文件?

4

1 回答 1

1

Drools 文档很好地涵盖了这一点。

modify用于更改工作内存中对象内字段的值。

update用于用修改后的实例完全替换工作内存中的对象。

这两条规则都会触发对工作记忆的重新评估。update,具体来说,应该谨慎调用,因为它会再次触发对所有规则的完整评估。(这就像用新数据第二次调用“触发所有规则”。)

这些操作很重要的原因是因为定期更改工作内存对象中的字段不会导致重新评估规则。也就是说,如果您有两个这样的规则:

rule "Remove invalid houses"
when
  $house: House( forSale == true, price == 0 )
then
  $house.setForSale(false);
end

rule "Schedule inspection for all for-sale houses"
when
  $house: House( forSale == true )
then
  InspectionUtil.schedule($house);
end

...在这种情况下,即使第一个规则也是如此,您的第二个规则也会触发。在此示例中,我们有一个带有“待售”标志(真/假)和价格的 House 对象。如果价格为 0,则列表出现问题,因此我们要删除“待售”指示符。同时,我们要安排所有待售房屋进行检查。当我们将“待售”标志的状态更改为 false 时,该更改对第二个“计划检查”规则不可见;为了使更改可见,您必须使用修改:

rule "Remove invalid houses"
when
  $house: House( forSale == true, price == 0 )
then
  modify( $house ) {
    setForSale(false)
  }
end

现在第二条规则不会触发,因为它会“看到”房子不再出售。如果您想了解有关此问题的更多详细信息以及它为何以这种方式工作,我简要概述了 Drools 如何在此其他答案中评估规则条件。

于 2021-08-22T17:04:27.343 回答