0

我是 Kogito 和 Drools 的新手。我不明白这段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

/loanApplications和是什么/allAmounts意思?它们是否链接到其他文件? /loanApplications出现在代码的许多部分中,我提取了 2 个特定部分作为示例。其中一个使用/loanApplications而不将其附加到变量。这是如何运作的?

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
4

1 回答 1

2

/loanApplications并且/allAmounts正在使用 OOPath 表示法来引用等效名称的规则单元。

Drools 文档描述了OOPath 符号如下:

OOPath 是 XPath 的面向对象的语法扩展,旨在浏览 DRL 规则条件约束中的对象图。OOPath 使用来自 XPath 的紧凑表示法在处理集合和过滤约束时导航相关元素,特别适用于对象图。

有关规则单元的更多信息可以在Drools 官方文档中找到,我总是推荐它,因为它写得非常好并且通常非常清晰。但是,我将在这里简要解释一下它是如何与您作为示例提供的规则一起工作的。

请注意,首先,在链接的 DRL 文件的顶部,在包声明的下方有一个 RuleUnit 声明:

unit LoanUnit;

这告诉我们这里涉及到一个规则单元,它可能包含如下所示的方法:

DataSource<LoanApplication> getLoanApplications()
DataSource<AllAmounts> getAllAmounts()

如果我们浏览存储库,我们可以LoanUnit.java/src/main/java/org/kie/kogito/queries/. 查看源代码,我发现我对这些函数的疯狂猜测是完全正确的。这也是一件好事——我不应该知道规则单元是如何定义的复杂性,以便利用它提供的数据和功能。

无论如何,规则编写者决定在您的示例 DRL 中为他们的规则使用 OOPath 表示法(有些人认为它“更简单”;我个人觉得它令人困惑。但只要您选择一种语法并坚持下去,我想它不会从长远来看,这很重要。)/loanApplications[ !approved, $id: id, $amount : amount ]在功能上等同于这种传统的 DRL 表示法:

LoanApplication( !approved, $id: id, $amount: amount ) from LoanApplications

from LoanApplications映射到 RuleUnit 中的方法getLoanApplications(),使用 Drools 基于 Java bean 命名约定映射到 getter 的常用方法。

由于 OOPath 表示法只是表达传统 DRL 表示法的另一种方式,因此您仍然可以执行您在正常规则中所做的所有事情,包括分配变量。在上面的例子中,我们实际上并不需要LoanApplication实例本身,只需要 id 和数量;但是如果我们真的想在实例中进行拖拽,我们可以很容易地用以下两种表示法中的任何一种来分配变量:

$myLoan: /loanApplications[ !approved, $id: id, $amount : amount ]
$myLoan: LoanApplication( !approved, $id: id, $amount: amount ) from LoanApplications

这两个语句在功能上是相同的。


如果您想了解有关 OOPath 表示法的更多信息……那我帮不了您。谷歌搜索似乎表明这是 JBoss/Drools 的事情,但它显然记录得很差。我发现的大多数语法都是通过提供的示例向后工作。我敢肯定,如果您喜欢 xpath 表示法(谁喜欢?),那会非常好,但是使用它的选择当然取决于您。

于 2021-08-22T16:48:09.303 回答