<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-GB">
	<id>https://training-course-material.com/index.php?action=history&amp;feed=atom&amp;title=Drools_-_Rete</id>
	<title>Drools - Rete - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://training-course-material.com/index.php?action=history&amp;feed=atom&amp;title=Drools_-_Rete"/>
	<link rel="alternate" type="text/html" href="https://training-course-material.com/index.php?title=Drools_-_Rete&amp;action=history"/>
	<updated>2026-04-17T11:51:37Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.45.1</generator>
	<entry>
		<id>https://training-course-material.com/index.php?title=Drools_-_Rete&amp;diff=38581&amp;oldid=prev</id>
		<title>Wang Hao at 08:35, 12 August 2016</title>
		<link rel="alternate" type="text/html" href="https://training-course-material.com/index.php?title=Drools_-_Rete&amp;diff=38581&amp;oldid=prev"/>
		<updated>2016-08-12T08:35:23Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{Cat|Drools|070}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;slideshow style=&amp;quot;nobleprog&amp;quot; headingmark=&amp;quot;⌘&amp;quot; incmark=&amp;quot;…&amp;quot; scaled=&amp;quot;true&amp;quot; font=&amp;quot;Trebuchet MS&amp;quot; lang=&amp;quot;中文版&amp;quot; headingmark2=&amp;quot;。&amp;quot; &amp;gt;&lt;br /&gt;
;title: Drools - Rete&lt;br /&gt;
;author: Bernard Szlachta (NobleProg Ltd)&lt;br /&gt;
&amp;lt;/slideshow&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Drools -Rete ==&lt;br /&gt;
{{Can I use your material}}&lt;br /&gt;
&lt;br /&gt;
== Rete ⌘==&lt;br /&gt;
* Created by Dr. Charles Forgy in 1978&lt;br /&gt;
* In Latin Rete means &amp;quot;network&amp;quot;&lt;br /&gt;
* Made of two parts:&lt;br /&gt;
** Compilation&lt;br /&gt;
** Runtime Execution&lt;br /&gt;
&lt;br /&gt;
== Rete 。==&lt;br /&gt;
* 创始人Dr. Charles Forgy 1978&lt;br /&gt;
* 拉丁语 Rete 的意思是网络（&amp;quot;network&amp;quot;）&lt;br /&gt;
* 两部分组成:&lt;br /&gt;
** 编译（Compilation）&lt;br /&gt;
** Runtime执行&lt;br /&gt;
&lt;br /&gt;
== Compilation Algorithm ⌘==&lt;br /&gt;
* Describes how the Rules in the Production Memory are processed&lt;br /&gt;
* The output is an efficient discrimination network&lt;br /&gt;
* Nodes at the top have many matches&lt;br /&gt;
* At the bottom there are rules which are going to be fired&lt;br /&gt;
&lt;br /&gt;
[[File:Rete Nodes.png]]&lt;br /&gt;
&lt;br /&gt;
== 编译算法 。==&lt;br /&gt;
* 描述如何处理生产内存中的规则&lt;br /&gt;
* 输出是一个高效鉴别网络&lt;br /&gt;
* 在顶端的node有很多的匹配&lt;br /&gt;
* 在底端的规则准备启动（firing）&lt;br /&gt;
&lt;br /&gt;
[[File:Rete Nodes.png]]&lt;br /&gt;
&lt;br /&gt;
== Rete Nodes ⌘==&lt;br /&gt;
== Rete Nodes 。==&lt;br /&gt;
&lt;br /&gt;
=== ObjectTypeNode ⌘===&lt;br /&gt;
* always present, though may be implicit e.g.&lt;br /&gt;
 CourseEvent(booked == true)&lt;br /&gt;
contains two conditions:&lt;br /&gt;
** first: &amp;quot;There is a CourseEvent, in mvel&lt;br /&gt;
 CourseEvent()&lt;br /&gt;
** second: there is a booking (booked == true)&lt;br /&gt;
&lt;br /&gt;
http://docs.jboss.org/drools/release/5.3.0.Final/drools-expert-docs/html_single/images/Chapter-Rule_Engine/Object_Type_Nodes.png&lt;br /&gt;
&lt;br /&gt;
ObjectTypeNodes can propagate:&lt;br /&gt;
* AlphaNodes&lt;br /&gt;
* LeftInputAdapterNodes&lt;br /&gt;
* BetaNodes&lt;br /&gt;
&lt;br /&gt;
=== ObjectTypeNode 。===&lt;br /&gt;
* 一直在线, 虽然可能看不见。比如&lt;br /&gt;
 CourseEvent(booked == true)&lt;br /&gt;
包含两个条件:&lt;br /&gt;
** 一: &amp;quot;有一个 CourseEvent, in mvel&lt;br /&gt;
 CourseEvent()&lt;br /&gt;
** 二: 有一个 booking (booked == true)&lt;br /&gt;
&lt;br /&gt;
http://docs.jboss.org/drools/release/5.3.0.Final/drools-expert-docs/html_single/images/Chapter-Rule_Engine/Object_Type_Nodes.png&lt;br /&gt;
&lt;br /&gt;
ObjectTypeNodes 可传播:&lt;br /&gt;
* AlphaNodes&lt;br /&gt;
* LeftInputAdapterNodes&lt;br /&gt;
* BetaNodes&lt;br /&gt;
&lt;br /&gt;
=== AlphaNodes ⌘=== &lt;br /&gt;
* evaluate literal conditions e.g.&lt;br /&gt;
** booked == ture&lt;br /&gt;
* multiple literal conditions for a single object type are linked together (i.e. object must first satisfy the first literal condition before it can proceed to the next AlphaNode) - AKA IntraElement conditions&lt;br /&gt;
&lt;br /&gt;
http://docs.jboss.org/drools/release/5.3.0.Final/drools-expert-docs/html_single/images/Chapter-Rule_Engine/Alpha_Nodes.png&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Drools extends Rete by optimizing the propagation from ObjectTypeNode to AlphaNode using hashing. Each time an AlphaNode is added to an ObjectTypeNode it adds the literal value as a key to the HashMap with the AlphaNode as the value. When a new instance enters the ObjectType node, rather than propagating to each AlphaNode, it can instead retrieve the correct AlphaNode from the HashMap,thereby avoiding unnecessary literal checks.&lt;br /&gt;
&lt;br /&gt;
=== AlphaNodes 。=== &lt;br /&gt;
* 对文本条件进行运算，比如&lt;br /&gt;
** booked == ture&lt;br /&gt;
* 单独object type的多个文本条件连接在一起 (比如 object 必须首先满足第一个文本条件，然后才能处理下一个AlphaNode) - 也叫做 IntraElement 条件&lt;br /&gt;
&lt;br /&gt;
http://docs.jboss.org/drools/release/5.3.0.Final/drools-expert-docs/html_single/images/Chapter-Rule_Engine/Alpha_Nodes.png&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Drools 扩展了 Rete 通过使用hashing优化从ObjectTypeNode到AlphaNode的传递。每次一个AlphaNode被加入到一个ObjectTypeNode，他将文本值作为一个键值（key）添加到HashMap中，对应的值即相应的AlphaNode。当一个新的实例进入ObjectTypeNode, 与其传递到每个AlphaNode, 它可以从HashMap里取得正确的AlphaNode, 这样可以避免不必要的文本检查。&lt;br /&gt;
&lt;br /&gt;
== Beta Nodes ⌘==&lt;br /&gt;
* BetaNodes compare 2 objects and their fields&lt;br /&gt;
* Two inputs are referred as left and right&lt;br /&gt;
** Left input for a BetaNode is a list of objects (Tuple)&lt;br /&gt;
** Right input is a single object&lt;br /&gt;
* used to implement &amp;#039;exists&amp;#039; checks (see _60ToBeOrNotToBe.drl)&lt;br /&gt;
&lt;br /&gt;
* BetaNodes have memory&lt;br /&gt;
** The left input is called the Beta Memory and remembers all incoming tuples&lt;br /&gt;
** The right input is called the Alpha Memory and remembers all incoming objects&lt;br /&gt;
&lt;br /&gt;
* Drools extends Rete by performing indexing on the BetaNodes&lt;br /&gt;
&lt;br /&gt;
http://docs.jboss.org/drools/release/5.4.0.CR1/drools-expert-docs/html_single/images/Chapter-Rule_Engine/Join_Node.png&lt;br /&gt;
&lt;br /&gt;
== Beta Nodes 。==&lt;br /&gt;
* BetaNodes 比较两个objects和它们的fields&lt;br /&gt;
* 两个输入用左和右（left and right）代表&lt;br /&gt;
** 左输入（Left input）是一个objects列表（Tuple）&lt;br /&gt;
** 右输入是一个单独 object&lt;br /&gt;
* 用来做“存在”检验 (见 _60ToBeOrNotToBe.drl)&lt;br /&gt;
&lt;br /&gt;
* BetaNodes 有记忆&lt;br /&gt;
** 左输入叫做Beta记忆，能记住所有输入的tuples&lt;br /&gt;
** 右输入叫做Alpha记忆，能记住所有的输入objects&lt;br /&gt;
&lt;br /&gt;
* Drools 通过在BetaNodes做索引扩展了 Rete &lt;br /&gt;
&lt;br /&gt;
http://docs.jboss.org/drools/release/5.4.0.CR1/drools-expert-docs/html_single/images/Chapter-Rule_Engine/Join_Node.png&lt;br /&gt;
&lt;br /&gt;
== Join Node ⌘==&lt;br /&gt;
* To enable the &amp;#039;&amp;#039;Cheese&amp;#039;&amp;#039; object to enter the network we use a LeftInputNodeAdapter&lt;br /&gt;
* LeftInputNodeAdapter this takes an Object as an input and propagates a single Object Tuple&lt;br /&gt;
* Terminal nodes are used to indicate a single rule having matched all its conditions (full match)&lt;br /&gt;
* A rule with an &amp;#039;or&amp;#039; conditional disjunctive connective splits in subrule for each possible logically branch (one rule can have multiple terminal nodes)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Drools also performs node sharing. Many rules repeat the same patterns, and node sharing allows us to collapse those patterns so that they don&amp;#039;t have to be re-evaluated for every single instance.&lt;br /&gt;
&lt;br /&gt;
http://docs.jboss.org/drools/release/5.4.0.CR1/drools-expert-docs/html_single/images/Chapter-Rule_Engine/Node_Sharing.png&lt;br /&gt;
&lt;br /&gt;
== Join Node 。==&lt;br /&gt;
* To enable the &amp;#039;&amp;#039;Cheese&amp;#039;&amp;#039; object to enter the network we use a LeftInputNodeAdapter&lt;br /&gt;
* LeftInputNodeAdapter this takes an Object as an input and propagates a single Object Tuple&lt;br /&gt;
* Terminal nodes用于表示一条规则成功匹配了所有的条件（全匹配）&lt;br /&gt;
* A rule with an &amp;#039;or&amp;#039; conditional disjunctive connective splits in subrule for each possible logically branch (one rule can have multiple terminal nodes)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Drools also performs node sharing. Many rules repeat the same patterns, and node sharing allows us to collapse those patterns so that they don&amp;#039;t have to be re-evaluated for every single instance.&lt;br /&gt;
&lt;br /&gt;
http://docs.jboss.org/drools/release/5.4.0.CR1/drools-expert-docs/html_single/images/Chapter-Rule_Engine/Node_Sharing.png&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Examples and Exercises ⌘==&lt;br /&gt;
1. See examples in _90_RETE folder&lt;br /&gt;
&lt;br /&gt;
2. Draw a RETE tree for the rules below&lt;br /&gt;
 TODO Copy the rules from the files&lt;br /&gt;
&lt;br /&gt;
3. Optimize the rules below to make the RETE tree more optimal&lt;br /&gt;
&lt;br /&gt;
== 举例和练习 。==&lt;br /&gt;
1. 见 _90_RETE 文件夹中的例子&lt;br /&gt;
&lt;br /&gt;
2. 根据下面的规则画一幅 RETE tree&lt;br /&gt;
 TODO Copy the rules from the files&lt;br /&gt;
&lt;br /&gt;
3. 优化下面的规则从而优化 RETE tree &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Sources ==&lt;br /&gt;
[http://docs.jboss.org/drools/release/5.4.0.CR1/drools-expert-docs/html_single/index.html Official Drools Documentation]&lt;/div&gt;</summary>
		<author><name>Wang Hao</name></author>
	</entry>
</feed>