Java 分组会降低和/或组中的规则
我有几个域规则(我将它们称为“先决条件”),我将它们描述为Drools规则。例如,对于被认为成绩良好的学生,他们必须保持GPA>3.0。我还有一些基本上是这些先决条件的布尔逻辑分组的规则,比如Java 分组会降低和/或组中的规则,java,drools,Java,Drools,我有几个域规则(我将它们称为“先决条件”),我将它们描述为Drools规则。例如,对于被认为成绩良好的学生,他们必须保持GPA>3.0。我还有一些基本上是这些先决条件的布尔逻辑分组的规则,比如IsInHonorRoll。要使IsInHonorll为真,需要满足规则HasGoodGrades,或(HasOkGrades和HasPerfectAttention) 我是如何处理这一点的,当规则得到满足时,我插入了预处理结果事实。然后,在这些更大的“分组”规则中,我检查这些预处理结果事实,并在那里执行布
IsInHonorRoll
。要使IsInHonorll
为真,需要满足规则HasGoodGrades
,或(HasOkGrades
和HasPerfectAttention
)
我是如何处理这一点的,当规则得到满足时,我插入了预处理结果
事实。然后,在这些更大的“分组”规则中,我检查这些预处理结果
事实,并在那里执行布尔逻辑:
规则“IsInHonorRoll”
方言“mvel”
什么时候
$s:Student()
预处理结果(id==“HasGoodGrades”,学生==$s)
或
(预处理结果(id==“HasOkGrades”,学生==$s)
和
预处理结果(id=“HasPerfectAttention”,student=$s))
然后
系统输出打印(“学生在荣誉榜上”);
结束
规则“HasOkGrades”
方言“mvel”
什么时候
$s:学生(平均成绩>2.0)
然后
插入(新结果(“HasOkGrades”$s))
结束
规则“HasGoodGrades”
方言“mvel”
什么时候
$s:学生(平均成绩<3.0)
然后
插入(新结果(“HasGoodGrades”$s))
结束
规则“出席”
方言“mvel”
什么时候
$s:Student(daysAbsent==0)
然后
插入(新结果(“HasPerfectAttention”$s))
结束
这似乎有效,但感觉不自然,我相信有更好的方法在流口水时做这类事情。更重要的是,给定足够多的这些规则和足够大和复杂的布尔子句,即使给定非常大的堆大小,Drools也会随着内存不足错误而开始消亡
处理这些Drools规则的布尔逻辑“分组”的最佳方法是什么?谢谢 在drools中重用前置条件的更自然的方法是DSL。然后可以根据需要组合复杂的逻辑语句。比如说
rule Test2
when
There is a ShoppingCart that
- worth a discount
then
print eligible price
end
数字用户线
检查完整答案如果你是正确的,这是一种令人垂涎三尺的方法(采取babysteps-每一步都有自己的规则)。只需将第一条规则拆分为两条单独的规则,这样您就不需要任何或多条规则
有不同的策略来避免大内存使用。一个想法是只将单个学生的数据插入会话,运行它,然后为下一个学生创建新会话,并再次运行所有规则。除此之外还有其他策略 你找到解决办法了吗?
[when]worth a discount =
(total price is not less than 500
and not over limit
or total price is greater than 5000)
// stupid condition just for demonstration
[when]over limit = ((total price + total price * 0.05) > total price + 50)
[when]total price = totalPrice