Java 分组会降低和/或组中的规则

Java 分组会降低和/或组中的规则,java,drools,Java,Drools,我有几个域规则(我将它们称为“先决条件”),我将它们描述为Drools规则。例如,对于被认为成绩良好的学生,他们必须保持GPA>3.0。我还有一些基本上是这些先决条件的布尔逻辑分组的规则,比如IsInHonorRoll。要使IsInHonorll为真,需要满足规则HasGoodGrades,或(HasOkGrades和HasPerfectAttention) 我是如何处理这一点的,当规则得到满足时,我插入了预处理结果事实。然后,在这些更大的“分组”规则中,我检查这些预处理结果事实,并在那里执行布

我有几个域规则(我将它们称为“先决条件”),我将它们描述为Drools规则。例如,对于被认为成绩良好的学生,他们必须保持GPA>3.0。我还有一些基本上是这些先决条件的布尔逻辑分组的规则,比如
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