-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

鉴于它们都以某种方式链接到,变量$l和的使用有什么区别?它们被认为是局部变量还是实例变量?$a/loanApplications

我已经提取了一些规则来说明我在这里要问的内容。考虑到它们应该是不同的,实际上进入$l和的是什么?$a

rule NotAdultApplication when
    $l: /loanApplications[ applicant.age < 20 ]
then
    modify($l) { setApproved(false) };
end
rule AllAmounts
when
    accumulate ( $a : /loanApplications ; $sum : sum($a.amount))
then
    allAmounts.add(new AllAmounts($sum));
end
4

1 回答 1

1

Drools 中的变量类似于 Java 中的变量。

对于您的第一条规则,NotAdultApplication的结果/loanApplications被分配给变量$l。它的范围是规则——条件(when)和后果(then)子句。

对于您的第二条规则,AllAmounts有两个不同的变量:$a$sum。与$l第一条规则类似,$sum它的作用域是规则,您可以看到它在结果中被使用。但是$a,范围仅限于accumulatefunction,而不是 rule ——您无法$a从 when 子句访问。

这两个变量的作用域不同的原因是它们服务于两个不同的功能;它们的范围实际上是由于它们作为积累的一部分所代表的。如果我将规则重写为如下所示可能更容易理解:

rule "AllAmounts (alternative version)"
when
  $applications: /loanApplications
  accumulate( $a: LoanApplication() from $applications,
              $sum: sum($a.amount))
then
  allAmounts.add(new AllAmounts($sum));
end

希望这个版本更清楚:$a是一个临时内部变量,用于帮助迭代贷款申请;它就像 foreach 循环中的变量——它为我们提供了对单个加载应用程序的引用。$sum分配给函数的输出,这就是为什么您可以在规则结果中使用它的原因。

如果您考虑一下,尝试从积累之外进行访问是没有意义$a的——它指的是什么?

这大致等同于以下 Java 代码:

Collection<LoanApplication> $applications = getLoanApplications(); // or whatever the equivalent is for /loanApplications
  
double $sum = 0.0;
for ( LoanApplication $a : $applications ) {
  $sum += $a.amount;
}
// you can't access $a here -- what would it even mean?
于 2021-08-22T16:23:46.530 回答