Nools和流口水

use*_*672 2 rule-engine drools node.js

我很高兴在Node中看到一个规则引擎,并在阅读Java文档的同时(尤其是:http ://docs.jboss.org/drools/release/6.1.0.Final/drools)在Java世界中查看了Drools。-docs / html_single / index.html#PHREAK)发现 Drools 6.0已经发展,现在使用PHREAK方法进行规则匹配。感兴趣的特定段落是:

RETE中每次成功的加入尝试都会产生一个元组(或令牌,或部分匹配),该元组将传播到子节点。因此,它被描述为面向元组的算法。对于到达的每个子节点,它将尝试与该节点的另一侧进行联接,再次,每次成功的联接尝试都将立即传播。这将产生下降递归效果。当节点网络从进入beta网络的点到所有可到达的叶节点上下左右波动时,对节点网络进行处理。

对于复杂的规则和超过一定限制的规则,以上引述说基于RETE的方法会浪费大量内存,因此它演变为PHREAK。

由于nools基于Rete算法,以上方法是否有效?是否进行过与PHREAK类似的优化?与Drools有任何比较吗?

小智 6

仅当您想尝试并发和并行化(需要锁定区域)时,网络抖动才是一个问题。由于NodeJS是单线程的,所以这不是问题。我们也尚未尝试在Drools中解决这一领域-但Phreak的工作是在考虑这一点的基础上进行的,它是从Rete实施中发现的问题中吸取教训的。值得一提的是,Rete过去曾使用分区算法来实现并行性,而这项工作在同一领域中正试图解决的问题。

对于单线程计算机,惰性规则评估更为有趣。但是,正如该文档所指出的那样,在Phreak和Rete之间,联接的单个规则在性能上不会有所不同。当您添加许多规则时,懒惰特性避免了潜在的工作,从而节省了整个cpu周期。对于大量错误编写的规则,该算法也更宽容,并且应降低性能。例如,它不需要传统的Rete根“ Context”对象,该对象用于驱动规则选择和短路浪费的匹配-在Phreak中这将被视为反模式,并且在您将其击倒时可能会减慢其速度匹配,将来可能会再次使用。 http://www.dzone.com/links/rip_rete_time_to_get_phreaky.html

当在规则中使用多个子网(例如具有多个累积)时,面向集合的传播也很重要。 http://blog.athico.com/2014/02/drools-6-performance-with-phreak.html

我还对向后链接和堆栈评估基础结构进行了跟踪:http : //blog.athico.com/2014/01/drools-phreak-stack-based-evaluations.html

马克(Phreak的创作者)