`
jefferson
  • 浏览: 279732 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

规则引擎以及blaze 规则库的集成初探之三——Blaze规则引擎和SRL

阅读更多

在上面介绍利用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的规则引擎的介绍继续……)

 

分享到:
评论

相关推荐

    springboot ice规则引擎

    Easy Rules,Drools,Aviator表达式求值引擎,Rule Book、Oracle Rules SDK、Blaze (fico)、IBM Decision Manager,DTRules,DSL规则引擎 规则引擎由三部分 事实(Fact):已知对象,比如以上刷卡的行为,即成事实...

    前端开源库-meteor-blaze

    Blaze 扩展了 Handlebars,添加了事件处理、条件语句、循环以及数据上下文等功能,使模板更加灵活和强大。 ### 数据上下文与实时绑定 在 Blaze 中,数据上下文是模板中可访问的数据对象。当你在模板中引用一个属性...

    前端开源库-meteor-blaze-tools

    本文将深入探讨一款名为“Meteor Blaze Tools”的前端开源库,它是基于Meteor框架的一个强大工具集,专为Blaze模板引擎设计,旨在简化前端开发流程,提升用户体验。 一、 Meteor与Blaze概述 Meteor是一个全栈的...

    Blaze AI Engine 1.9.8 unitypackage最新

    Blaze AI 是一款快速、高度可定制的强大通用敌人 AI 引擎,价格实惠!如果您想在游戏中加入任何类型的敌方 NPC,Blaze 将构建您选择的任何模型,并为您的游戏打造智能、逼真和具有挑战性的模型。它可以通过单击按钮...

    Blaze implement handbook

    在上述知识点的基础上,手册似乎还提供了一个详细的实践教程,旨在帮助用户熟悉Blaze Advisor的界面和操作流程,包括如何新建模板、管理文件夹、编译规则集、生成编译文件、预览、重命名、打印、生成报告以及进行...

    blaze

    blaze

    Java RuleJava Rule.docx

    文档中还提到了一些已知的规则引擎实现,包括ILOG JRules、BlazeSoft Blaze、Drools等,以及一些开源选项,如JRuleEngine、InfoSapient和JEOPS。这些引擎各自具有不同的特性和适用场景,例如JRuleEngine遵循JSR94...

    【UnityAI引擎插件】Blaze AI Engine 轻松实现高效的人工智能

    Blaze AI Engine 是一款专为 Unity 开发者设计的 AI 引擎插件,旨在简化和增强游戏中的 AI 行为和决策系统。它提供了一套强大而灵活的工具,用于创建复杂的敌人行为、NPC(非玩家角色)交互、路径寻路以及各种智能...

    blaze:Meteor Blaze是一个功能强大的库,用于创建实时更新的用户界面

    相反,熟悉的模板指令(例如{{#if}}和{{#each}}与“透明React性”和数据库游标集成在一起,以便DOM自动更新。Blaze有两个主要部分: 模板编译器,可将模板文件编译为针对Blaze运行时库运行JavaScript代码。 此外,...

    flex的Blaze

    在Web开发领域,Flex以其强大的图形用户界面(GUI)组件库和ActionScript编程语言而闻名,而Blaze则为Flex提供了更为高效和优化的运行环境。 Blaze.war文件是一个Web应用程序归档(WAR)文件,它是Java Web应用程序...

    cpp-Blaze一个超快的Elasticsearch数据导出器

    cpp-Blaze是一个针对Elasticsearch设计的高效数据导出工具,主要由C++语言编写,...通过深入理解cpp-Blaze的原理和使用方法,你可以更有效地管理和利用Elasticsearch中的数据,进一步提升数据分析和业务处理的效能。

    Java和Flex通过Blaze 通信

    Java和Flex是两种在开发富互联网应用程序(RIA)时常用的技术。Java以其强大的后端处理能力和跨平台特性闻名,而Flex则是一种基于ActionScript的前端框架,用于构建交互性强、图形丰富的用户界面。两者结合,可以...

    TI Blaze EVM design scheme

    TI OMAP4470 Blaze 开发板是一款高度集成的评估与开发平台,主要面向移动计算、消费电子和工业应用等领域。该开发板采用OMAP4470处理器,具备高性能、低功耗等特点。原理图中详细列出了各个功能模块及其连接方式,...

    Blaze Decision

    标题“Blaze Decision”指向的是一款名为Blaze Decision System的决策引擎系统。决策引擎是指通过计算机程序设计来实现决策支持的系统,它能够根据输入的数据,通过预定的逻辑规则,自动作出决策。 描述中提到的...

    【Unity精品插件】Blaze AI Engine v3.1.7 最新版

    Blaze AI Engine是一款专为Unity引擎设计的行为AI工具,它通过提供先进的AI算法和易于使用的接口,帮助开发者创建出更加智能和动态的游戏角色。无论是简单的NPC行为还是复杂的战术决策,Blaze AI Engine都能够提供...

    Vcpkg安装稀疏矩阵工具Blaze所需程序包.7z

    这样,编译器就能找到Blaze的头文件和库文件。Vcpkg会提供一个示例项目来演示如何正确配置。 4. **使用Blaze**: 在你的代码中,可以包含Blaze的头文件,如`&lt;blaze/StaticMatrix.h&gt;`或`&lt;blaze/SparseMatrix.h&gt;`,...

    blaze-material-ui, blaze的材质用户界面组件.zip

    blaze-material-ui, blaze的材质用户界面组件 blaze-material-ui这是一个阿尔法版本,所以在你自己的风险下使用它。 有关在生产中使用这里应用程序的应用程序的列表,请参见 below安装meteor add codefights:blaze-...

    Blaze AdvisorTM 业务规则管理系统.pdf

    一个针对金融银行业务规则引擎的规则管理系统,银行的业务确实比较重,比较多,设计比较复杂,需要一套很好的业务规则进行管理。

    ios Blaze VideoCell

    2. **视频播放器集成**: Blaze VideoCell通常会集成常见的视频播放器框架,如AVFoundation或者第三方库如AVPlayerViewController,以实现在单元格内的视频播放。AVFoundation是Apple提供的多媒体处理框架,包含了...

    blaze-html, Haskell的blazingly快速HTML组合库.zip

    blaze-html, Haskell的blazingly快速HTML组合库 BlazeHtml 什么BlazeHtml是一个库,它旨在在Haskell中快速生成 HTML 。 它现在处于一个非常实验的状态,因为不同的想法和设计被尝试。 有关更多信息,请参考网站。...

Global site tag (gtag.js) - Google Analytics