Drools推理引擎

图片无法显示可参考链接:
http://note.youdao.com/share/?id=6f8e6c9ee12db3f9a02997eef9b056ed&type=note#/

1.Drools简介
很多系统的业务规则需要经常修改,如果将这些规则直接编写到代码中,则业务规则一旦改变就需要修改代码,重新编译打包整个代码,而且业务规则也越来越复杂,且经常需要实时进行修改,故可将这些可变的业务规则抽取到外面,使其独立于程序代码,可以实时修改业务规则而不用打包编译整个程序。
规则引擎是一种嵌套在应用程序中的组件,它实现了将业务规则从应用程序代码中分离出来,规则引擎使用特定的语法编写业务规则,规则引擎可以接受数据输入、解释业务规则,每个·规则代表一个业务需求,根据业务规则做出相应的决策;Drools是基于JAVA和Rete算法的产生式规则引擎的实现,Drools推理引擎将事实、数据和规则进行匹配,以推出结论。

2.使用步骤
2.1 环境搭建
Drools提供了基于Eclipse的IDE开发工具,使用前须在http://www.eclipse.org/downloads/ 网址下载安装Eclipse,本次测试使用的版本为Eclipse4.5.1,安装完成后,再到http://www.eclipse.org/downloads/下载Drools开发工具包和Drools插件,进入网站后有如下界面,此次下载的Drools版本为6.3.0.Final,下载下方红色矩形框行对应的压缩文件drools-distribution-6.3.0.Final.zip和droolsjbpm-tools-distribution-6.3.0.Final.zip

安装Eclipse插件
解压droolsjbpm-tools-distribution-6.3.0.Final.zip,将解压后的文件目录droolsjbpm-tools-distribution-6.3.0.Final\binaries\org.drools.updatesite\plugins下的jar文件全部复制到Eclipse安装目录的plugins目录下,打开Eclipse,在Window->Preferences中,可以看到已经添加Drools目录

配置Drools运行环境
解压开发工具包drools-distribution-6.3.0.Final.zip,选择Window->Preferences->Drools目录下的Installed Drools Runtimes

点击Add按键,在弹出窗口的Path栏浏览添加drools-distribution-6.3.0.Final.zip解压后的drools-distribution-6.3.0.Final\binaries文件夹,Name可填写任意名称(此处测试填写为Droos6Runtime),点击OK继续

随后勾选添加的运行环境Drools6Runtime,依次点击Apply、OK按键,重新启动Eclipse,运行环境配置完成

按照如下所示步骤新建一个Drools项目
选择File->New->Projecet…
选择Drools目录下Drools Project,点击Next继续

填写工程名称,此处测试填写test,使用默认工作路径,点击Next继续

勾选红色框中两项,在新建drools工程中添加HelloWorld例子(包含HelloWorld规则文件和加载执行规则文件的Java文件),点击Next继续

填写GroupId、ArtifactId、Version(此处图中为随意填写),选择Drools Runtime(此处默认选择先前配置的Drools6Runtime),Generate code compatible一栏选择Drools6.0.x

新建生成test工程,其自带HelloWorld例子结构如下图所示

点击DroolsTest.java文件,右键->Run as->Java Application控制台输出
Hello World
Goodbye cruel world

2.2 程序执行
规则文件drl介绍:
可以使用如下语句定义一个规则:
when 条件LHS then 行为RHS
测试例子的规则文件结构:
package:声明该规则文件的包名
import:声明规则在编译和运行时所使用到的Java类,默认导入package声明的Java包下全部的类和java》lang
包下全部的类
rule:一个rule包含了三个部分,分别是name、when、then,rule name ,
代码实例:
规则文件中可包含多条规则,此处仅列举其中一条规则
package com.sample
import com.sample.WME;
rule “rdfs2”
when
c1 : WME( aaa:subject,predicate==WME.DOMAIN, xxx : object)
c2 : WME( yyy:subject,predicate== aaa , zzz:object)theninsert(newWME( yyy, WME.TYPE, xxx));endc1WMEWMEpredicateWME.DOMAINc2WMEWMEpredicatec1WMEsubjectthenWME()c1c2WMEc1c2 aaa : 、 xxx: aaa :、$xxx :等;在其后的then语句中可以使用这些定义的变量。
then语句执行新建一个各字段值均赋值的WME对象实例,使用insert方法插入事实实例至Working Memory中。在Working Memory中插入一个新的事实后,会重新以该事实匹配规则

规则的加载和执行
测试文件为RelationTest.java
执行步骤如下:
KieServices ks = KieServices.Factory.get();
KieContainer kContainer = ks.getKieClasspathContainer();
KieSession kSession = kContainer.newKieSession(“ksession-rules”);
kie框架先初始化一个kieservice对象,然后从classpath中读取kmodule,创建KieContainder,利用kieContainer对象创建一个新的KieSession,传入name:“ksession-rules”,此为kmodule.xml文件中定义的ksession的name。kieContainer根据kmodule.xml定义的ksession的名称找到KieSession的定义,然后创建一个KieSession的实例。
KIE相关API:
KieServices:该接口提供方法获取KieContainer
KieContainer:KieBase的容器
KieBase:知识仓库,包含若干规则、方法,执行规则KieBase中的规则需根据KieBase创建KieSession
KieSession:应用程序与规则引擎交互的通道,可通过KieContainer创建KieSession
创建KieBase会建立知识仓库,成本高,创建KieSession则成本低,KieBase会建立缓存,而KieSession则不必。

String fileName = “univ_1_part_10.rdf”;
BufferedReader reader = new BufferedReader(new FileReader(new File(fileName)));

String line = null;
while((line = reader.readLine()) != null){
if(line.isEmpty())
continue;
else {
String[] lineArray = line.split(” “);
kSession.insert(new WME(lineArray[0], lineArray[1], lineArray[2]));
}
}
按行读取文件univ_1_part_10.rdf中内容,将每行按“ ”分割按序组成字符串数组,使用kSeeion.insert方法插入事实实例至Working Memory中,并将字符串数组依次赋值到此对象实例的各字段;通过KieSession与规则引擎通讯,发起执行规则的操作。

long startTime = System.currentTimeMillis();
kSession.fireAllRules();
long endTime = System.currentTimeMillis();
long runningTime = endTime - startTime;
执行规则匹配前记录当前时间,通过kSession.fireAllRules方法来通知规则引擎执行规则匹配,匹配完毕记录结束时间,计算匹配耗时。

最终输出测试结果

你可能感兴趣的:(知识推理)