2010-09-09 28 views
3

具有相同显着性的几条规则的结果是什么?他们的执行顺序是否只是他们列出的顺序,或者这种行为是未定义的 - 也就是说,他们是否以任意顺序进行检查?我似乎无法找到有关内部处理的文档。流口水中的显着性

回答

12

简短的回答是,你不应该依赖相同显着性的规则触发顺序 - 如果它们“处于冲突状态”(即两者都有资格触发)。没有显着性的规则只是零的显着性,顺便说一句。

当然这是确定性的 - 它只是算法在版本之间可能会发生变化(尽管不太可能)。

这是在“冲突解决”的一般领域,并已写了很多。我无法找到关于Drools策略的最新文章 - 但我相信大部分内容都是“新近” - 即最近修改/插入的事实“获胜” - 或者更确切地说,涉及最近事实的规则将赢得胜利。如果毕竟它不能决定 - 通常是它们的规则被加载的顺序(这通常与它们在文件中的写法有关)。如果您必须订购 - 使用显着性,或者使用规则流程或类似方法,最好不要再猜测它是如何工作的。

+0

我从生产的角度对它没有真正的兴趣 - 我理解突出的目的,我永远不会依赖某个实现以特定顺序触发它们。对我来说,知道行为是否被定义完全是一个兴趣点。欢呼你的答案! – JBirch 2010-09-09 07:32:31

+2

根据官方的JBOSS文档,具有默认显着性(或相等但不是默认)的规则将以任意顺序执行。如果行动的顺序很重要,就不应该依赖它。 (http://docs.redhat.com/docs/en-US/JBoss_Enterprise_BRMS_Platform/5/html-single/JBoss_Rules_5_Reference_Guide/index.html#sect-Activations_Agenda_Conflict_Sets) – Zec 2011-10-12 12:46:27

+0

执行顺序在Drools 5.x期间的某个时刻确实发生了变化版本。我的规则只有在执行以某种顺序发生时才起作用,对我感到羞耻。幸运的是,我足够聪明地编写单元测试来捡起它。 – 2011-11-30 15:09:32

1

我对Drools 5.1的使用经验是,它是最后的先出。也就是说,最后在你的drl中定义的规则将首先被执行。

但是,是的,依靠这样的行为不会是最好的主意:)

2

Rete算法使用的新旧程度和条件特异性。