规则引擎以及blaze 规则库的集成初探之三——Blaze规则引擎和SRL
原文地址:http://jefferson.iteye.com/blog/68604
在上面介绍利用JSR94的api使用的章节中,我们使用的具体引擎的实现是一个商业产品,如果想了解Drools的使用,这里有一份入门的参考文章:http://blog.csdn.net/tigerflower/archive/2006/09/06/1185922.aspx。由于关于blaze的文章很少,这里根据经验,简单介绍一下它的实现。
blaze是由blazeSoft公司提供的产品,由于是商业产品,因此专门IDE非常强大,现在流行的版本是Blaze Advisor5.5和Blaze Advisor6.x.。blaze的开发模式有编程式开发的好处,也有声明式开发的好处。在开发的IDE,你看到的是一般传统的编程式编程的IDE一样,保存后的原代码是xml格式的文件。看过DRool 的规则语言,它有一些固定的xml标签,有不同的含义,你必须掌握,而在blaze的编程里面,你就像写java代码一样。
在介绍blaze的建立和开发之前,现简单介绍一下规则语言的语法。规则语言,名称SRL (全称为Standard Rule Language),据自称,是一个类English的语言,也就是让业务人员也看得懂的语言。我们看一个例子:theAccount's balance is between $00.00 and $500.00 。在java中的表示是theAccount.balance>=00 and theAccount.balance<=500,当然,在srl里面也支持像前面那句在java中的类似用法。看另外一个例子,是一个类的声明:
a Vehicle is an object;其实,它的语法规则很简单,也易学,学习代价非常小。在使用中我们可以发现,它一样是一个面向对象的语言,提供了原子类型、基本的类库和内置的方法等等,与java的兼容好,java代码的嵌入方便。
现在来看看具体的用法:
类的声明,当然包括属性:
a Vehicle is an object with {
a speed : a real,
a size : a string,
a unit_price : a real }.
在java中的使用是:
class Vehicle
{
public double speed;
public String size;
public double unit_price;
}
过过瘾,举一个声明一个对象实例的例子:
就刚才Vehicl类为例:
a vehicle1 is some Vehicle initially a vehicle1 initially{
set speed to 10.0,size to 20,unit_price to $100000.00}
或者更加简洁的:
myCar is a Vehicle initially{
speed=10.0,size="2m" ,unit_price=$100000.00}
非常灵活,而且你不必担心语法的松散带来许多错误,IDE可以识别所以的语法错误。
对象数组:
Accounts is a fixed array of 4 Account
initially { it[0] = checkingAccount. }
这里声明了一个对象数组,名为Accounts,数组的类型是Account,大小为4,其中第一项指向的对象引用是checkingAccount.
同样我们看另外一个例子:
itinerary is an array of city
initially { it.append(city2),
it.append(city3),
it.append(city4).
}.
利用了array的内置方法append,it代表当前对象,相当于java中的this关键字。
声明数组的其他例子,数组下标可以是string类型,也可以是整数类型等等,随意定义,这像java类库的Map及其子类,可谓功能强大。
airports is an association from
string to string initially
{ it["New York"] = "JFK",
it["San Francisco"] = "SFO",
it["Los Angeles"] = "LAX".
}.
这段话什么意思呢?解释一下前半部分。
airports是对象名,也就是对象数组名,an association from是关键字,from后面的string是数组的key的类型,to后面的string是制定这个数组是属于string类型的数组。
为了增加感性认识,再举一个例子:
Products is an association from
integer to Product initially {
it[094] = someProduct. }
对象属性的声明:
a speed : a real,
a size : a string,
a unit_price : a real
....
如果属性是数组,则为an address : some array of string。
对象的初始化,上面的介绍中,大家也大概清楚了,且看代码段:
initially { temp = 98.6, firstName = "Bill" }
initially { it.setTemp(98.6),
firstName = "Bill" }
initially { Deposit(newAccount, amount) }.
第二个代码段,调用了类内部的方法。第三个代码段,调用了Deposit方法。
Enumeration,声明为:a[n] enumerationName is one of { itemName,
itemName[, itemName ]... } .
例如:a color is one of { red, green, blue }.
有必要说说Enumeration的作用。
上面定义了一个Enumeration,名为color,那么在application中定义了一个属性,为color,如下:
an application is an object with {
a customer : a string,
a color,
an amount: an integer }
initially { amount = 0, color = red }.
那么,这个application的对象的属性color将有三个标准值: red, green, blue,你可以初始化指定为red。挺像一个有值约束的自定义类型。
Pattern的声明:
且看例子:
theCustomer is any Customer.
theAccount is any Account in accountArray.
seniorMale is any person such that
(it.age > 65 and it.gender is male).
我们知道,一个类可以有多个instance,我们可以制定一个对象,它的值限制在某个对象或者对象数组的某个或者某几个对象实例,那么可以定义一个patten。这就是典型的条件匹配,简化成一种类型。
上面的例子,theCustomer指定是任何一个Customer的对象,theAccount指定为accountArray数组中的任何一个Account对象,seniorMale指定为年龄大于65并且为女性的person对象。
这种模式匹配,就像我们用到的正则表达式一样,用起来威力无穷矣:
说一个例子:
假定有一个类Account,在某个ruleset中,拥有n个Account的对象:a1,a2,...,an,,那么你可以声明一个patten如下:
accountPattern is any Account.
在rules中的条件匹配,你可以这样使用:
if accountPattern.balance > 0
then accountPattern.positiveBalance = true
那么它的作用相当于:
if a1.balance > 0
then a1.positiveBalance = true
if a2.balance > 0
then a2.positiveBalance = true
...
if an.balance > 0
then an.positiveBalance = true
最后看看原始类型的声明:
i is an integer.
startDate is a date initially '1/31/99'.
Today is a date.
Today = calendar().currentDate().
price is a money initially $1684.37.
再看看具体的变量声明为Enumeration的话,应为:sample is a color initially blue.
color为上述的a color is one of { red, green, blue }.
常用的也就这些,象event阿,ruleset的定义自看文档,在GUI中不用srl去定义。
现在说说,rule也就是规则匹配吗,主要用到的是条件匹配句式。且看:
if theForm’s name starts with "req" then...
if theForm’s name ends with "req" then...
if theApplicant’s lastName is blank then...
else ……
上述的就是if-then-else句式,没什么特别。其中theForm’s name,theForm对象的属性 name是string类型,因此对string类型的操作 从句子中可以看到。
if 语句中的boolean操作有:not | or | and
比较操作符有:is | = | <> | < | > | <= | >=
对数字的操作有:+ | - | * | / | div | mod 例如:
19 / 5 = 3.8
19 div 5 = 3
19 mod 5 = 4
其他流程控制语句:
case语句:
select countryofOrigin of product
case China : apply ChinaTariffRules
case Japan : apply JapanTariffRules
case Thailand : apply ThailandTariffRules
otherwise : print("No tariffs apply.").
迭代for语句:
for each customer such that (it.balance > 10000)
do { print(it.name " qualifies for promotion.").
apply PromotionRuleset. }
for each Invoice in customer.invoices
such that it.balance
do { sum += it.amount. }
While_Do语句:
while (portfolioValue = unavailable)
do { portfolioValue = promptReal("What
is the value of your portfolio?") }
Until do语句:
until (productsRemaining = 0)
do { apply CheckPriceRuleset(product).
productsRemaining -= 1. }
异常的捕捉和处理:
try Statement_Block
catch a[n] exceptionClassName with Statement_Block
[finally Statement_Block]
例如:
try { customer.addAccount(payment) }
catch an accountException with
{ print("Account not created because " it).}
其实,都跟java相似,没多少区别。
(blaze的规则引擎的介绍继续……)
规则引擎以及blaze 规则库的集成初探之三——Blaze规则引擎和SRL的更多相关文章
- 规则引擎以及blaze 规则库的集成初探之二——JSR94 的规则引擎API和实现
http://jefferson.iteye.com/blog/67839 规则引擎以及blaze 规则库的集成初探之二——JSR94 的规则引擎API和实现
- 项目实践之工作流引擎基本文档!Activiti工作流框架中流程引擎API和服务详解
流程引擎的API和服务 流程引擎API(ProcessEngine API)是与Activiti打交道的最常用方式 Activiti从ProcessEngine开始.在ProcessEngine中,可 ...
- 《Drools7.0.0.Final规则引擎教程》之Springboot集成
本来准备按部就班的一章一章更新Drools相关教程,怎奈QQ群组(593177274)有朋友急需Springboot与Drools的集成demo,于是抽出时间写了一个,现在拿出来分享一下.加入群组可免 ...
- Node.js-视图引擎【1】-Swig集成express的安装与配置
node.js视图引擎,选来选去发现Swig最符合我的胃口哈哈. 一.安装Swig视图引擎 npm install -g swig 二.在node.js代码中配置如下 var app = requir ...
- iptables规则的删除-怎么删除一条已有的iptables规则
语法是: iptables -D chain rulenum [options] 其中: chain 是链的意思,就是INPUT FORWARD 之类的定语 rulenum 是该条规则 ...
- Scalding初探之三:Hadoop实战
Java版本 如果在Scala工程中混入Java类导致java版本不match,可能会抛错 java.lang.UnsupportedClassVersionError: XXX Unsupporte ...
- ASP.NET MVC 2 验证
来源:http://www.cnblogs.com/jhxk/articles/2612885.html 只为把自己觉的好的存起来 对用户输入的验证以及强制业务规则/逻辑是大多数web应用的核心需求 ...
- 关系型数据库——MySQL
[MySQL架构图] MySQL简要架构图如下图所示,引擎层以插件方式集成了不同的存储引擎,它们共用Server层对外提供服务. 连接器:用于连接管理,进行身份认证及权限相关的管理.(登录MySQ ...
- drools规则引擎初探
https://www.cnblogs.com/yuebintse/p/5767996.html 1.drools是什么 Drools是为Java量身定制的基于Charles Forgy的RETE算 ...
随机推荐
- css中的一些兼容问题
浏览器兼容 为什么会有兼容问题? 由于市场上浏览器种类众多,而不同浏览器其内核亦不尽相同,所以各个浏览器对网页的解析就有一定出入,这也是导致浏览器兼容问题出现的主要原因,我们的网页需要在主流浏览器上正 ...
- matlab中使用fuzzy工具箱
4步教你学会使用matlab模糊控制工具箱 Matlab模糊控制工具箱为模糊控制器的设计提供了一种非常便捷的途径,通过它我们不需要进行复杂的模糊化.模糊推理及反模糊化运算,只需要设定相应参数,就可以很 ...
- 让dede运行php代码和mysql语句
一.dede运行php代码 举例1: {dede:name runphp='yes'} $str = "hello ";@me = $str;@me .= "world& ...
- BizTalk动手实验(十四)AS2传输非EDI消息
1 课程简介 本课程通过AS2协议完成XML文件的传输过程,传输之后同步接收MDN确认信息.通过本课程熟悉AS2传输解决方案的基本开发与配置方法. 2 准备工作 为了模拟实际的B2B交互过程,本实验需 ...
- 百度开源富文本编辑器 UEditor配置:图片上传和文件上传独立使用方法
使用UEditor编辑器自带的插件实现图片上传和文件上传功能,这里通过配置UEditor单独使用其内置的第三方插件swfupload来实现图片和文件的上传,通过对UEditor配置轻松实现图片批量上传 ...
- Color Space: HSV
HSV(hue,saturation,value)颜色空间的模型对应于圆柱坐标系中的一个圆锥形子集,圆锥的顶面对应于V=1. 它包含RGB模型中的R=1,G=1,B=1 三个面,所代表的颜色较亮.色彩 ...
- Linux内存管理基本概念
1. 基本概念 1.1 地址 (1)逻辑地址:指由程序产生的与段相关的偏移地址部分.在C语言指针中,读取指针变量本身值(&操作),实际上这个值就是逻辑地址,它是相对于你当前进程数据段的地址.( ...
- java环境搭建系列:JDK从下载安装到简单使用
最近,问的比较多的问题居然是jdk的问题,对于新手来说这确实有点难度,毕竟一个人经常上网浏览新闻和观看视频的人,一下子开始一门编程语言的环境搭建.这中间需要一个慢慢适应的过程.回想当初我在这个阶段也很 ...
- eclipse创建web项目
总结为3步: 必备环境: Eclipse jee Tomcat 1.创建services 2.创建dynamic web project项目 3.WebContent路径下创建index.jsp 运行 ...
- 《linux内核设计与实现》读书笔记第三章
第3章 进程管理 3.1 进程 1.进程 进程就是处于执行期的程序. 进程包括: 可执行程序代码 打开的文件 挂起的信号 内核内部数据 处理器状态 一个或多个具有内存映射的内存地址空间 一个或多个执行 ...