我想运行一个调用Java方法并从另一个规则传递事实(或者更确切地说,它的逻辑值)的规则,尽管我不知道java方法是否对这个问题很重要。描述起来并不容易,所以我将尝试基于一个示例来展示它:
rule "Some rule determining fact"
when
... //some conditions
then
insert(new SomeCondition(callSomeJavaMethodReturningBoolean()))
end
rule "Some rule using SomeCondition"
when
SomeCondition($value: value)
... //some other conditions
then
insert(callJavaMethodUsingSomeCondition($value))
end
这里的问题是,第一条规则并不总是触发,因此不总是定义某些条件,也不计算第二条规则。
我的第二次尝试是创建这样两个独立的规则:
rule "Some rule determining fact"
when
... //some conditions
then
insert(new SomeCondition(callSomeJavaMethodReturningBoolean()))
end
rule "SomeConditionTrueRule"
when
SomeCondition(value == true)
... //some other conditions
then
insert(callJavaMethodUsingSomeCondition(true))
end
rule "SomeConditionFalseRule"
when
not SomeCondition() or SomeCondition(value == false)
... //some other conditions
then
insert(callJavaMethodUsingSomeCondition(false))
end
这也不能像预期的那样工作,因为它首先计算someconditionfalse规则,甚至在计算我的第一条规则之前。如果你能给我一些关于如何解决这个问题的建议,我将不胜感激。如果有必要,使用的Drools版本是6.5.0。此外,如果可能的话,我想避免使用突显,因为我读过这是一种不好的做法(如果我错了,请纠正我)。
在这种情况下,需要将两组规则(插入SomeCondition对象的规则和执行java代码的规则)分开。
最简单的方法是在第二组中使用较低的显著性:
rule "Some rule determining fact"
when
... //some conditions
then
insert(new SomeCondition(callSomeJavaMethodReturningBoolean()))
end
rule "SomeConditionTrueRule"
salience -1
when
SomeCondition(value == true)
... //some other conditions
then
insert(callJavaMethodUsingSomeCondition(true))
end
rule "SomeConditionFalseRule"
salience -1
when
not SomeCondition() or SomeCondition(value == false)
... //some other conditions
then
insert(callJavaMethodUsingSomeCondition(false))
end
一种更可靠的方法是使用2个议程组,并逐个激活它们。
但其想法是,执行java代码的规则为规则提供时间,以确定需要执行什么才能做出最终决定。
在我上面介绍的情况下,一旦创建会话,您将对SomeConditionFalseRule进行激活(A1),但激活将在调用fireAllRules()之前不会执行。如果您随后插入必要的事实以使SomeConditionTrueRule变为true,那么您现在将获得它的激活(
A2)。
此时,议程将如下所示:
|A1|A2|
。
调用fireAllRules()
时,Drools将在议程中选择显著性较高的激活(默认情况下,规则的显著性为0)。在这种情况下,将拾取并执行A2。
A2
的执行将插入一个新的Fact,该Fact将使A1
无效,并将为一些条件True规则
创建一个新的激活(A3
)。Drools将继续从议程中删除A1
,因此不会执行规则一些条件False规则
。
执行
A2
后的议程如下所示:|A3|
希望有帮助,
如果存在可选项,我想将值设置为字符串,否则根据条件从列表中获取它。我尝试了很多方法,但都无法获得它。我是Streams的新手,所以需要帮助。 基本上我的情况是传统的- 这是我写的,但它不起作用。我在orElse部分出错了- 你能建议一下正确的方法吗?提前感谢您的帮助。
我有一个问题,我必须做一个查询,根据产品上是否有图像,我必须在列中显示“是”或“否”的值。我必须加入product表这是安全的,但我如何在查询中判断“image presence”字段是否为空,写“no”,否则写“yes”。我希望我已经解释过了。谢谢大家。
问题内容: 在MySQL以外的任何事物中,它感觉都非常简单。 基本上,我需要根据一个特定术语返回多少结果来切换我正在使用的索引类型以及其他一些条件。 效果: MySQL语句中可能吗? 编辑: 查询A: 查询B: 查询切换的原因是,根据“术语”的流行程度,我得到的结果时间截然不同。 问题答案: 编辑: 我下面说的关于要求存储过程的说法是不正确的。尝试这个: 确实,这是一个case表达式,在存储的pr
问题内容: 如果我想实现一些可以通过两种方式实现的条件代码。那么哪种方式更好的是条件运算符?:或if..then..else ?? 问题答案: 这取决于。通常,您希望活动的主要流程在代码的结构中表示。如果算法的关键是变量已初始化,那么最好的解决方案是使用条件运算符: 如果决策是了解正在发生的事情的关键问题,那么您将首选。实际上,这意味着当两者都可行时,您将使用。关键是“合理” —如果您发现在子表达
问题内容: 我当前正在使用sed脚本: cd(根文件夹)优先 当前,此脚本在标记下删除所有包含其子文件夹的文件夹上的,xml的示例为: 所以现在,我需要排除那些带有“ scheduler-service- core”或基本上是scheduler的标签,因为我不需要解析它,但是我的脚本正在删除它,因为它在依赖项标签下,我该如何排除这一点?“调度程序”一词将发生变化,因为我将在不同的服务上使用它,因此
问题内容: 我试图做一个有条件的正则表达式,我知道堆栈溢出还有其他帖子,但是对这个问题太具体了。 如何创建仅在特定条件下才能匹配的正则表达式? 一个例子 例如,如果我们有一个字符串列表( 在java中 ): 并且我们只想匹配字符串末尾与开头相同数量的 在这个例子中我们想要什么 在此示例中,我们需要一个正则表达式来检查结尾处是否有与开始时相同数量的正则表达式。 条件部分 :如果开头有,则检查结尾是否