gpt4 book ai didi

流口水:规则执行多次

转载 作者:行者123 更新时间:2023-12-04 17:49:58 25 4
gpt4 key购买 nike

我正在尝试使用 Drools 规则引擎,我是一个初学者。

我在单个规则文件中设置了以下规则:

rule "A stand alone rule" 
salience 2
no-loop
when
$account : Account()
Account($account.balance>100)
then
System.out.println("balance>100");
System.out.println($account.getBalance());
System.out.println($account.getCustomer().getName());
end

rule "A second Rule"
salience 1
no-loop
when
$account : Account()
Account($account.balance<100)
then
System.out.println("balance<100");
System.out.println($account.getBalance());
System.out.println($account.getCustomer().getName());
end

在 StatefulKnowledgeSession 中,我传递了两个帐户,一个余额为 15000,另一个余额为 15,
Account account=new Account(7l,15000l);
Account account1=new Account(5l,15l);

Customer customer = new Customer("Samrat", 28, "Sector51", account);
Customer customer1 = new Customer("Alexi", 28, "Sector50", account1);
account.setCustomer(customer);
account1.setCustomer(customer1);
session.insert(account);
session.insert(account1);

session.fireAllRules();

在我看来,预期的结果应该是每个规则应该只触发一次,并且应该打印相应的对象。

但我得到的结果是:
balance>100
15000
Samrat
balance>100
15000
Samrat
balance<100
15
Alexi
balance<100
15
Alexi

我无法理解为什么每个规则都运行两次????

最佳答案

使用多个模式(并且不指定它们之间的任何关系)将创建一个完整的笛卡尔积(就像在没有连接子句的情况下对多个表进行选择一样)。
所以,规则:

rule A
when
Account()
Account()
then
...
end

将为 Account 类型的 N 个对象激活 N^2 次。
一种解决方案可能是使用魔术字段“this”来指定第二个帐户与第一个帐户相同:
rule A
when
$a: Account()
Account(this == $a)
then
...
end

但是,回到您的示例,我认为您甚至不需要使用 2 种不同的模式。您可以按如下方式重写规则:
rule "A stand alone rule" 
salience 2
no-loop
when
$account: Account(balance>100)
then
System.out.println("balance>100");
System.out.println($account.getBalance());
System.out.println($account.getCustomer().getName());
end

rule "A second Rule"
salience 1
no-loop
when
$account: Account(balance<100)
then
System.out.println("balance<100");
System.out.println($account.getBalance());
System.out.println($account.getCustomer().getName());
end

希望能帮助到你,

关于流口水:规则执行多次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18982549/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com