基于drools_Drools:基于PHREAK堆栈的评估和向后链接

基于drools

前一段时间,我写了一篇有关我们新算法的博客: http : //blog.athico.com/2013/11/rip-rete-time-to-get-phreaky.html

有人问我有关新的基于堆栈的系统以及向后链接如何工作的信息。 我在电子邮件中回复了他们,但我认为其他人可能会觉得有用,因此将其粘贴在下面。 它是从我的大脑直接写到页面上的,因此在某些地方有点粗糙。 但我希望有人觉得它有用,无论如何。

-

评估规则时,它会从根到尖端进行评估。

对于每个节点,它评估所有可能的联接并生成一个元组集。 然后,该子元组集将传递到子节点。 传入的元组集称为srcTupleSet(用于变量名),然后将所有子级放入trgTupleSet中。 trgTupleSet传递到子节点,在此它成为srcTupleSet。

第245行显示了此循环: https : //github.com/droolsjbpm/drools/blob/master/drools-core/src/main/java/org/drools/core/phreak/RuleNetworkEvaluator.java#L245

srcTuples = trgTuples; // previous target, is now the source

输入节点后,它具有许多评估该节点所需的变量。 节点ID,节点内存,段内存,srcTupleSet,trgTupleSet。 通过创建引用这些值的StackEntry,可以暂停和恢复任何节点(在稍后的时间进行评估)。 StackEntry放置在堆栈上。 这是StackEntry类: https : //github.com/droolsjbpm/drools/blob/master/drools-core/src/main/java/org/drools/core/phreak/StackEntry.java

出于两个原因需要这样做,即反向链接和子网。 向后链接是通过查询节点完成的。

当传播到达查询节点时,它需要暂停对当前规则的评估-因此它创建了StackEntry并将其放置在堆栈中。

第459行: https : //github.com/droolsjbpm/drools/blob/master/drools-core/src/main/java/org/drools/core/phreak/RuleNetworkEvaluator.java#L459

查询只是没有RHS的规则,没有后果。 它收集到达终端节点的所有结果,并将它们返回给调用方。 查询节点允许规则通过传入参数来调用查询。 通过插入DroolsQuery对象(与根模式匹配并触发传播)来完成查询的调用:

参见第67行: https : //github.com/droolsjbpm/drools/blob/master/drools-core/src/main/java/org/drools/core/phreak/PhreakQueryNode.java

LeftInputAdapterNode.doInsertObject(handle, pCtx, lian, wm, lm, false, dquery.isOpen());

像序言一样,参数可以绑定或不绑定。 绑定参数是一个固定变量,而未绑定参数是一个固定变量。 在实现方面,我们不对未绑定的参数施加约束。 这允许经典的序言“传递闭包”类型查询。 尽管规则可以调用查询,但是查询也可以调用查询(我们没有制表法来检测无限循环)。

query isContainedIn( String x, String y )Location( x, y; )or( Location( z, y; ) and isContainedIn( x, z; ) )
end

注意drools支持模式中的位置参数和空位参数。 这是通过将所有位置映射到插槽来完成的。

可以在以下位置找到有关React式和非React式传递闭包的上述查询的逐步说明, 网址为 : https : //www.youtube.com/watch?v=fCjIRVSRFvA

对于评估查询,当trgTulupleSet到达终端节点时,它将迭代并将每个元组添加到“收集器”中。

参见第65行: https : //github.com/droolsjbpm/drools/blob/master/drools-core/src/main/java/org/drools/core/phreak/PhreakQueryTerminalNode.java#L65

收集器创建一个特殊的子元组,可以将其添加到调用父级。

参见第343行: https : //github.com/droolsjbpm/drools/blob/master/drools-core/src/main/java/org/drools/core/reteoo/QueryElementNode.java#L343

查询完成评估后,它将返回。 然后,重新调整过程允许执行程序访问堆栈,并在其中弹出StackEntry并恢复评估-但是现在查询结果可用。

参见第166和173行: https : //github.com/droolsjbpm/drools/blob/master/drools-core/src/main/java/org/drools/core/phreak/RuleNetworkEvaluator.java

可以React性和非React性地调用查询。 非React式意味着没有剩余内存,查询也没有打开。 React地意味着有剩余的内存,查询保持打开状态。 React式查询是完全增量式的,并且支持更新和删除:

参见第143和169行: https : //github.com/droolsjbpm/drools/blob/master/drools-core/src/main/java/org/drools/core/phreak/PhreakQueryNode.java#L143

我们用于元组和“嵌套”(查询结果)元组的数据结构高效,“无复制”和“无搜索”-都是双链表。 这对于使增量查询有效很有必要。

子网使用类似的技术。 在到达子网的点上,外部规则被挂起(放在堆栈上),并创建内部网络评估。

参见593和604行: https : //github.com/droolsjbpm/drools/blob/master/drools-core/src/main/java/org/drools/core/phreak/RuleNetworkEvaluator.java

子网完成后,外部规则将恢复并将结果放入外部子节点的正确输入中:

第662行: https : //github.com/droolsjbpm/drools/blob/master/drools-core/src/main/java/org/drools/core/phreak/RuleNetworkEvaluator.java#L662

如前所述,当前我们提供惰性规则评估,但不提供增量规则评估。 一旦开始规则评估,就会生成所有元组。 但是,由于堆栈条目可以在任何节点中暂停和恢复,因此它也可以用于提供增量规则评估-尽管我们现在不这样做。 实际上,您在正确的输入上“获取”了X个对象-可以是1或5或25或100。该数量允许您调整延迟与吞吐量。 进行取整后,如果仍然有未评估的正确输入,则创建一个StackEntry,在当前传播完成后,强制对该节点进行重新评估。

参考: Drools: Drools&jBPM博客上来自JCG合作伙伴 Geoffrey De Smet的基于PHREAK堆栈的评估和向后链接 。

翻译自: https://www.javacodegeeks.com/2014/01/drools-phreak-stack-based-evaluations-and-backward-chaining.html

基于drools

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/343981.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[渝粤教育] 中国地质大学 微积分(一) 复习题 (2)

《微积分(一)》模拟题 一.单选题 1.求极限-) A.-1 B.0 C.1 D.∞ 2.求极限 A.0 B.1 C.1/2 D.3/2 3.设函数在内连续求的值. A.5 B.6 .7 D.8 4.求函数当1时的增量. A.0.1 B.0.2 C.0.3 D.0.4 5.求极限 A.1 B.1/2 C.1/3 D.1/4 6.求极限 A.-1 B.0 C.1 D.2 7.求极限 A.1 B.2 C…

[渝粤教育] 中国地质大学 政府与事业单位会计 复习题

《政府与事业单位会计》模拟题 一.单选题 1.校办工厂将纯收入的一部分上缴学校学校应记作(). A.经营收入 B.事业收入 C.附属单位上缴收入 D.其他收入 2.事业单位的任务不包括() A.组织资金供应合理使用资金 B.保护公共财产合理分配结余 C.积极开辟财源实行盈亏核算 D.反映预…

mysql内表和外表_Hive内表和外表的区别

本文以例子的形式介绍一下Hive内表和外表的区别。例子共有4个:不带分区的内表、带分区的内表、不带分区的外表、带分区的外表。1 不带分区的内表#创建表create table innerTable(id int,name string) row format delimited fields terminated by ‘|’;(show tables…

工业交换机与光纤收发器的区别

工业交换机与光纤收发器效果有什么差异工业交换机与光纤收发器不同的是,光纤收发器其实是点对点的工业工业交换机,光纤收发器只是一种光电转化设备,仅仅只是用于因传输间隔过远而采取的一种延长传输间隔的一种手法;而工业交换机是…

使用React Native和Spring Boot构建一个移动应用

“我喜欢编写身份验证和授权代码。” 〜从来没有Java开发人员。 厌倦了一次又一次地建立相同的登录屏幕? 尝试使用Okta API进行托管身份验证,授权和多因素身份验证。 React Native是使用React构建移动应用程序的框架。 React允许您使用声明式编程风格来…

[渝粤教育] 中国地质大学 概率论与数理统计 复习题 (2)

《概率论与数理统计》模拟题 一.单选题 1.对于事件AB下列命题正确的是(). A.若AB互不相容则与也互不相容. B.若AB相容那么与也相容. C.若AB互不相容且概率都大于零则AB也相互独立. D.若AB相互独立那么与也相互独立. 2.在一次假设检验中下列说法正确的是(). A.既可能犯第一类错…

mysql 操作指令详解_Mysql常用命令详解

Mysql安装目录数据库目录/var/lib/mysql/配置文件/usr/share/mysql(mysql.server命令及配置文件)相关命令/usr/bin(mysqladmin mysqldump等命令)启动脚本/etc/init.d/mysql(启动脚本文件mysql的目录)系统管理连接MySQL格式: mysql -h 主机地址 -u用户名 -p用户密码例 1:连接到本…

[渝粤教育] 中国地质大学 电路理论(新) 复习题 (2)

《电路理论》模拟题 一.单项选择题 1.基尔霍夫电压定律电流定律与() A.网络结构有关与原件性质有关 B.网络结构有关与原件性质无关 C.网络结构无关与原件性质有关 D.网络结构无关与原件性质无关 2.关于理想电感元件的伏安关系下列各式正确的有() A.uωLi B.uLi C.ujωLi D.uLd…

二层和三层交换机的选择及交换机层数的区别

以太网交换机厂商根据市场需求,推出了二层、三层甚至四层交换机。但无论如何,其核心功能仍是二层的以太网数据包交换,只是带有了一定的处理IP层甚至更高层数据包的能力。接下来就由飞畅科技来为大家详细介绍下二层交换机,三层交换…

[渝粤教育] 中国地质大学 结构力学 复习题

《结构力学》 一.单选题 1.在力矩分配法中分配系数表示(). A.结点A有单位转角时在AB杆A端产生的力矩 B.结点A转动时在AB杆A端产生的力矩 C.结点A上作用单位外力偶时在AB杆A端产生的力矩 D.结点A上作用力偶时在AB杆A端产生的力矩 2.当远端为固定端时传递系数等于(). A.1 B.0.5 …

数据库迁移mysql到sqlserver_数据库迁移(sqlserver至mysql)

最近项目在做一个大迁移,项目从dobbo项目迁至成springcloud项目,同时内部也有一个很大的转变,从架构开始一整个的转型,而我目前负责的是一个数据库的转型。就如标题所说,sqlserver转至成mysql。其实sql的转变区别不大&…

交换机的特点及工作原理

交换机有多个端口,每个端口都具有桥接功能,可以连接一个局域网或一台高性能服务器或工作站,实际上,交换机有时被称为多端口网桥。那么,对于交换机的特点以及工作原理这块你是否有了解呢?接下来我们就来为大…

[渝粤教育] 中国地质大学 计算机系统结构(新) 复习题

《计算机系统结构》模拟题 一.单选题 1.下列说法正确的是() A.Cache容量一般不大命中率不会很高 B.Cache芯片速度一般比CPU的速度慢数十倍 C.Cache本身速度很快但地址变换速度很慢 D.Cache存储器查映象表和访问物理Cache其间可以流水使速度与CPU匹配. 2.采用Cache存储器主要是…

tls1.1 tls1.2_Java 8将默认使用传输级别安全性(TLS)1.2

tls1.1 tls1.2传输级别安全性(TLS)1.2将默认设置为3月18日发布的标准Java的下一版本。TLS将提供加密的Internet通信,但不能完全解决Java的安全问题,因为Java的加密通信没有灵丹妙药有关安全问题的解释。 TLS版本1.2将在Java开发工…

查看mysql8日志_mysql dba系统学习(8)查询日志文件功能

查询日志的作用是记录所有客户端发来的sql语句,也就是记录客户端的所有操作Log参数将要过时,现在用general_log来代替打开查询日志功能mysql> showvariables like "%log";-----------------------| Variable_name| Value |----------------…

[渝粤教育] 中国地质大学 高层建筑施工 复习题

《高层建筑施工》模拟题 一.单选题 1.基坑开挖时沿坑底周围或中央开挖排水沟的最小坡度为() A.0.1%~0.2% B.0.2%~0.5% C.0.5%~0.8% D.0.8%~1.0% 2.在深层搅拌机水泥土桩挡墙施工中制备水泥浆的水灰比一般为() A.0.15~0.2 B.0.25~0.3 C.0.35~0.4 D.0.45~0.5 3.在大体积砼基础…

光纤收发器tx和rx,光纤收发器单模和多模的区别!

对于光纤收发器来讲有很多的分类,例如按照光纤来分,总共可以分为两种单模与多模,它们之间的差别有些朋友了解的不多,接下来我们就来一起分辨一下光纤收发器tx和rx,光纤收发器的单模和多模有什么区别?一起来…

[渝粤教育] 西南科技大学 机械设计基础 在线考试复习资料

机械设计基础——在线考试复习资料 一、判断题 1.花键联接一般用于传递较小的扭矩。 2.低速重载下工作的滑动轴承应选用粘度较低的润滑油。 3.仅传递扭矩的轴是转轴。 4.圆柱销与销孔之间必须采用过盈配合。 5.受横向载荷的螺栓联接中的螺栓必受剪切力。 6.在润滑良好的闭…

Spark UI的见解

作为延续解剖的-Apache的火花的工作后,我将分享如何利用星火UI调谐工作。 我将继续使用先前文章中使用的相同示例,新的spark应用程序将在以下方面完成工作 –阅读纽约市停车票 –通过“板ID”进行汇总并计算违规日期 –保存结果 此代码的DAG看起来像…

run在java_Java语言start和run方法的区别

Java语言start和run方法的区别导语:Thread类定义了一个功能,用于存储线程要运行的代码,该存储功能就是run方法。那么它和start方法有什么不同呢?让我们了解一下吧!调用start方法方可启动线程,而run方法只是thread的一个普通方法&…