开发决策服务,第 2 部分: 规则开发流程

第 1 部分介绍了智慧城市场景和用例需求。我们介绍了决策子系统的角色,以及选择 IBM WebSphere® ILOG® JRules 作为业务规则管理系统 (BRMS) 来实现决策子系统的理由。第 2 部分将介绍规则开发流程的操作技巧。

Raj Rao, 决策管理高级解决方案架构师, IBM

Rajesh (Raj) Rao在专家系统和业务规则管理系统方面有 20 多年的工作经验,在这期间,他应用业务规则技术跨越各个领域,比如制造、运输和金融业,来构建诊断、日程安排、资格证书和配置应用程序。他在 IBM 工作已经快 2 年了。他有 Artificial Intelligence 背景,感兴趣的领域包括 Natural Language Processing 和 Semantic Web。



Sandeep Desai, 企业 IT 架构师, IBM

Sandeep Desai 是 IBM WebSphere 的 Business Partner Technical Professional 团队的一位经过认证的资深企业 IT 架构师。他与从创业企业到大公司的各种战略业务合作伙伴合作,指导他们为其解决方案启用 SOA。他就 IBM 软件平台对合作伙伴进行推广、培训和支持。Sandeep 是 Open Group 杰出认证 IT 架构师、IBM 认证的资深企业 IT 架构师和 IBM 认证的 SOA 解决方案设计人员。



2013 年 4 月 23 日

规则应用程序开发

技术开发人员使用 Rule Studio(一个基于 Eclipse IDE 的工具)来创建基础的规则工件,包括 Java™ 开发和规则项目开发。本文不是一个详细的教程,只是对开发流程的介绍。您可使用完整的工作区跟随我们进行操作,请参见 下载 部分。作为前提条件,您应在工作站上安装 IBM WebSphere ILOG JRules Rule Studio 7.1.1。

本系列的第 1 部分已提到,规则应用程序开发在初始化阶段的规则发现和分析之后发生。从总体上讲,规则应用程序开发由以下步骤组成:

  1. 创建项目
  2. 设计规则结构,包括规则包和规则流
  3. 编写业务规则

创建项目

使用 Rule Studio,开发人员首先创建一个常规的 Eclipse 工作区,然后在其中创建各种类型的项目,包括 Java 项目和规则项目。这些项目构成了执行对象模型 (XOM)、业务对象模型 (BOM) 和规则集。图 1 描绘了项目创建流程。

图 1. 项目创建流程
项目创建流程

创建 XOM 项目

XOM(可能是一组 Java 类或 XSD 文件)表示物理数据模型,也就是在执行期间传给决策服务和从中传出的实际数据。在我们的场景中,Common Alerting Protocol (CAP) XSD(参见 参考资料 下的 OASIS CAP 10 月份更新)构成 XOM。我们创建了一个名为 “ccc-xom” 的简单项目来包含 XSD,如 图 2 所示。

图 2. 包资源管理器中的 XOM 项目
包资源管理器中的 XOM 项目

在我们的用例中,我们从 XOM 创建一个 BOM。在这种自底向上的方法中,全面理解 XOM 的结构和元素至关重要,因为它们形成了 BOM 和规则字典的基础。在 CAP XSD 中,一个 Alert 包含多个 InfoTypes,后者进而包含一个或多个 ParameterTypesEventCodeTypesParameters 指定了数据值,比如在最近 12 小时内观察到的降雨量。图 3 描绘了这些 XOM 元素。

图 3. XSD 示意图
XSD 示意图

(查看 图 3 的更大版本。)

创建 BOM 项目

WebSphere ILOG JRules BRMS 的优势在于,它允许使用自然语言基于业务术语来编写业务逻辑,而不使用编程语言。对于此任务,您创建一个 BOM,它是业务领域的一个逻辑模型,描述了您的决策所基于的数据。规则创建者可看到的每个 BOM 元素会被分配一种自然语言表达。决策的所有元素都使用这个词汇表的术语来编写。

在 Rules Studio 中,使用一种自底向上的方法,通过导入 XOM 来创建 BOM。在创建 BOM 项目之前,切换到 Rule Studio 中的规则透视图。然后使用一个通过 File - New - Rule Project 调用的向导创建 BOM 项目。指定 capAlertMessage1_1.xsd 作为 BOM 的动态绑定。图 4 演示了从一个 XSD XOM 创建 BOM 项目时所使用的步骤顺序。要创建 BOM 项目,执行以下步骤:

  1. 选择 File – New – Rule Project
  2. 在打开的窗口中,选择 Rule Project with a BOM 作为模板并单击 Next
  3. 在接下来的窗口中,指定 “ccc-bom” 作为项目名称并单击 Next
  4. 单击 Next
  5. 使用 Rule Project XOM Settings 中的 Dynamic Bindings 选项卡中的 Add XSD 按钮选择 capAlertMessage1_1.xsd,然后单击 Finish
图 4. 创建 BOM 项目
创建 BOM 项目

(查看 图 4 的更大版本。)

这组步骤为 XOM 中的所有元素创建 BOM 条目,使用默认的语言表达来访问和设置每个 BOM 元素。图 5 显示了 Rule Explorer 中的一些 BOM 元素和包。

图 5. Rule Explorer 中的 BOM 项目
Rule Explorer 中的 BOM 项目

默认的语言表达在大部分情况下已足够了。例如,为 EventCodevalue 的设置和获取所生成的语言表达可在 BOM 编辑器中看到,只需双击 BOM 元素即可,如 图 6 中所示。

图 6. BOM 编辑器中的语言表达
BOM 编辑器中的语言表达

(查看 图 6 的更大版本。)

扩展 BOM 并细化词汇表

规则词汇表是一组可用于准确定义一条业务规则的词汇。这些词汇是 BOM 的语言表达。我们常常需要增强 BOM,添加元素或方法来简化规则的编写。例如,Parametervalue 在输入模型中显示为一个字符串。为了将此值与规则中的数字值对比,我们定义在 BOM 类 Parameter 中定义了一个 “虚拟” 或 “合成” 方法 getNumericValue,它从字符串提取一个双精度值并为它提供一种语言表达。这一步使我们能够编写如下这样的规则:

if the numeric value of this parameter is at least 15 
then …

每个 BOM 元素需要最终映射回可执行的 XOM。对于没有相应的 XOM 实现的 “虚拟” 方法,此映射通过 BOM 到 XOM 的映射来完成。在运行时,规则引擎分析规则集,使用 BOM 到 XOM 的映射访问 XOM。

图 7 在 BOM 编辑器中显示了虚拟方法。要定义此虚拟方法,在 BOM 编辑器中执行以下步骤:

  1. Name 设置为 getNumericValue
  2. Type 设置为 java.lang.Double。
  3. Member Verbalization 区域,将 Navigation 设置为 {this} 的 {numeric value}
  4. 在 BOM to XOM Mapping 区域,输入以下代码:
		Double d = 0;
		try {
			d = Double.parseDouble(this.value);
		} catch (Exception e) { }
		return d;
图 7. 添加一个虚拟方法
添加一个虚拟方法

(查看 图 7 的更大版本。)

除了虚拟方法,我们还添加了一些虚拟类来实现合成的对象。图 8 突出显示了这些虚拟类。(参见 参考资料 获取更多细节。)

图 8. 实现合成对象的虚拟类
实现合成对象的虚拟类

创建一个规则项目

从技术上讲,ccc-bom 项目也是一个可包含业务规则的规则项目。但是,我们建议将 BOM 放在它自己的项目中,将业务规则放在不同的项目中。此方法支持在未来将 BOM 重用于其他规则集。因此,我们使用新建规则项目向导来创建一个名为 ccc-rules 的独立规则项目。

图 9 描绘的一系列步骤可用于将规则项目创建为一个引用 ccc-bom 规则项目的标准规则项目。要创建规则项目,执行以下步骤:

  1. 选择 File – New – Rule Project。
  2. 在打开的窗口中,选择 Standard Rule Project 作为模板并单击 Next
  3. 在接下来的窗口中,指定 “ccc-rules” 作为项目名称并单击 Next
  4. 选择 Rule Project Reference 中的 ccc-bom 并单击 Finish
图 9. 创建规则项目
创建规则项目

(查看 图 9 的更大版本。)


规则设计

规则集的设计包括识别规则集的输入和输出,识别规则在一个规则项目中的组织方式,以及创建规则流来编排规则集中的规则的执行。图 10 显示了规则设计流程,我们将在后续小节中详细介绍。

图 10. 规则设计流程
规则设计流程

设置规则集参数

规则集参数指定决策服务的输入和输出,进而定义决策服务与调用客户端之间的接口。

要设置规则集参数,右键单击 ccc-rules 并选择 Properties。在我们的场景中,我们收到一个 Alert 作为输入,返回一个扩充的 Alert 作为输出。它们分别表示为 “请求” 和 “响应,如 图 11 所示。

图 11. 规则集参数
规则集参数

创建规则包

规则包简单来讲是一些可在其中创建规则的文件夹和子文件夹。规则包有助于在一种分层结构中组织规则。

基于我们的规则分析,我们断定不同的天气模式具有不同的规则,比如 “起雾” 和 “强降雨”。这一区别形成了我们的顶级规则包。对于每个包,我们拥有针对评估规则和指令规则的子包。图 12 显示了规则项目中使用的规则包的一个子集。

图 12. 规则包
规则包

创建规则流

规则流定义一个更大决策的上下文中的规则工件执行顺序。对于调用应用程序,可调用规则集来制定单个业务决策。但是,这个业务决策通常会分解为一系列更小的决策。使用一个规则流,您可将更小的决策标识为规则任务并以过渡的形式路由逻辑。

规则流中的第一个规则任务是初始化,其中会创建一个框架式响应 Alert。在这之后,基于发出的指令来进行评估。

图 13 显示了这个规则流。

图 13. 主要规则流
主要规则流

与一个规则任务关联的规则在规则任务的属性中指定。对于规则任务 heavy rainfall,在执行此规则任务期间考虑规则包 heavy rainfall.evaluations 中的所有规则。图 14 显示了规则任务 heavy rainfall 的属性视图,其中选择了关联的规则。

图 14. 强降雨规则任务的规则选择
强降雨规则任务的规则选择

请注意,规则流控制着规则组或规则任务的执行顺序。不同于过程编程中使用的方法,这里您不指定各个规则的顺序。许多拥有过程编程模式背景的新手倾向于过度使用规则流。例如,最初的倾向可能是使用规则流,通过与一个 Alert 关联的不同 InfoType 对象来使用控制循环。但是,这不是推荐的方法,我们将在下一节中看到如何使用规则来自然地执行这一循环。


业务规则创作

规则开发人员通常创建初始规则集并执行单元测试,以确保规则项目为业务用户提供了一个牢固的基础。此外,技术开发人员可创建规则模板来简化业务用户对新业务规则的创作。图 15 描绘了规则创作流程。

图 15. 规则创作流程
规则创作流程

编写初始规则集

一位规则开发人员使用 Rule Studio 创建初始规则集。我们在本系列的第 1 部分中已看到,在我们的场景中,这些规则分为两个类别:评估规则和指令规则。

评估规则

评估规则基于传入的警报,将评估结果作为中间事实发布。处理降雨事件的评估规则在 heavy rainfall.evaluations 包中创建。如果在最近 12 小时内观察到了超过 150 毫米的降雨量,下面的示例将发布一个 HEAVY RAINFALL 评估事实。当规则的所有条件都已满足后,将执行规则操作或规则的 “then” 部分;此操作创建一个评估事实并将它发布到工作内存。

此规则如 清单 1 所示。

清单 1. 基于最近 12 小时的降雨量的示例规则

点击查看代码清单

清单 1. 基于最近 12 小时的降雨量的示例规则

definitionsset'rainfallInfo'toaninfoin the infos of requestwhere the event of this info is "HeavyRainfall"and the certainty of this info is "Observed"and the severity of this info is "Severe";ifthereisnofactwhere the type of this fact
is HEAVY RAINFALL, 
	 andthereisatleastoneparameterin the parameters of rainfallInfowhere the value name of this parameter is "RainfallLevel12H"and the numeric value of this parameter is at least 150, 
then 
	create an assessment of HEAVY RAINFALL using rainfallInfo;

可以看到,一个规则表示为一个 if-then 语句。但是,规则不同于传统过程语言(比如 Java 或 C)中的 if-then 语句。让我们分析一下这个规则,更多地了解一下规则编程。表 1 给出了一个业务操作语言规则的不同部分并从开发人员角度解释了它的含义。

表 1. 规则部分和它们的含义
规则部分含义
设置一个规则变量的 rainfallInfo 代码 此代码设置一个名为 rainfallInfo” 的规则变量。此规则变量匹配传入的 Alert 中每个满足以下条件的 InfoType:事件为 HeavyRainfallcertainty 为 “Observed”,severity 为 “Severe”。如果传入的一个警报包含 3 个不同的 InfoTypes,它们的事件都为 “HeavyRainfall”,但只有两个的确定性为 “Observed”,第三个为 “Possible”,那么此规则变量仅使用两个 “Observed” InfoTypes 来实例化。在规则执行之前,也必须满足规则中指定的其他条件。
启动其他规则条件集合的代码 此代码启动其他规则条件集合。
检查 HEAVY RAINFALL 评估是否未执行的代码 为了避免重复评估,使用此代码进行检查,以确保 HEAVY RAINFALL 评估还未执行。
此条件检查是否至少有一个名为 RainfallLevel12H 的参数一个 InfoType 对象可有多个参数。此条件检查是否只有一个名为 “RainfallLevel12H”(表示最近 12 小时内的降雨量)且值不低于 150 毫米的变量。
此代码创建一个名为 HEAVY RAINFALL 的评估并将 rainfallInfo 与它关联如果规则的 definitionsif"\ 部分中指定的所有条件都已满足,那么将执行规则。在此规则中,此代码创建一个名为 HEAVY RAINFALL 的评估 并将 rainfallInfo 与它关联。

另一个评估规则检查在最近 1 小时和 12 小时内观察到的降雨量值,如果最近 1 小时内的降雨量不低于 10 毫米且最近 12 小时内的降雨量不低于 100 毫米,则执行 HEAVY RAINFALL 评估。此规则如 清单 2 所示。

清单 2. 基于多个参数的示例规则

点击查看代码清单

清单 2. 基于多个参数的示例规则

definitionsset'rainfallInfo'toaninfoin the infos of requestwhere the event of this info is "HeavyRainfall"and the certainty of this info is "Observed"and the severity of this info is "Severe";ifthereisnofactwhere the type of this fact
is HEAVY RAINFALL, 
	 andthereisatleastoneparameterin the parameters of rainfallInfowhere the value name of this parameter is "RainfallLevel1H"and the numeric value of this parameter is at least 10, 
	 andthereisatleastoneparameterin the parameters of rainfallInfowhere the value name of this parameter is "RainfallLevel12H"and the numeric value of this parameter is at least 100, 
then 
	create an assessment of HEAVY RAINFALL using rainfallInfo;

指令规则

指令规则与评估值相匹配来生成操作项,比如使用来自关联的 InfoType 对象的信息的通知和指令。任意数量的事件都可能导致 “HEAVY RAIN” 评估值,但只会基于此评估值创建一组操作项。

清单 3 演示了一个指令规则。

清单 3. 创建操作项的规则

点击查看代码清单

清单 3. 创建操作项的规则

definitionssetheavyRainfalltoafactwhere the type of this fact is HEAVY RAINFALL ;setinfoto the param of heavyRainfall; 
if
	true
then
	setnew_infoto create new info;
	set the sender name of new_info to "CityCommandCenter-BRE";
	set the event of new_info to "AlertLevelRainfallAssessment";
	set the language of new_info to "en-US";
	add "Safety" to the categories of new_info;  
	set the certainty of new_info to the certainty of info; 
	set the audience of new_info to "CityWaterDomain CityPublicSafetyDomain";
	add event code <name> "Type" <value> "Notification" to
new_info; 
	set the headline of new_info to "Level Rainfall Assessment";   
	set the description of new_info to "Heavy rainfall expected; 
          Assessing rainfall vs. sewer capacity";
	set the contact of new_info to "ccc@rotterdam.com"; 
	setnew_resourceto create new resource; 
	set the resource desc of new_resource to "888001";
	add new_resource to the resources of new_info; 
	foreachareain the areas of info:
	- add this area to the areas of new_info; 
	remove <area #> 1 from the areas of new_info; 
	set the urgency of new_info to "Immediate"; 
	set the severity of new_info to "Severe";  
	 
	add new_info to the infos of response;

清单 3 中所示的规则中,基于工作内存中是否存在 HEAVY RAINFALL 事实,使用了通知来创建一个新 Info 对象并添加到响应中。

创建规则模板

要简化具有类似结构的规则的创建,开发人员可创建规则模板,它们是已编写了一部分的业务规则。这些规则可用作创建多个具有类似内容和结构的规则的起点。

在我们的场景中,我们注意到评估规则首先匹配观察到的 info 对象列表中的一个 info 对象,然后下钻到 parameters,同时确保 assessment 事实还不存在。此结构通过 清单 4 中所示的规则模板创建。带下划线的项是规则创建者为定义规则而填写的占位符。

清单 4. 评估规则的规则模板
definitions
set infoEvent to ▼ an info in the infos of request 
        where the event of this info [±] is ▼ <enter a string> [±] 
            and the certainty of this info [±] is Observed [±] 
            and the severity of this info [±] is Severe [±] 
if
there is no fact [from/in] 
        where the type of this fact is <an object> 
              
    and there is at least one parameter in the parameters of infoEvent 
        where the value name of this parameter [±] is ▼ <enter a string> [±] 
            and the numeric value of this parameter [±] is at least ▼ <enter a
            number> [±] 
             
then
create an assessment of <an assessment type> using infoEvent

使用此模板,业务用户可轻松地创建新评估规则,填充模板所提供的空白。


对规则执行单元测试

业务规则的单元测试是创建健全的规则应用程序的非常重要的一步。在采用敏捷开发方法时尤其如此。技术开发人员执行单元测试来验证初始规则集,更重要的是要确保 BOM 和 XOM 没有错误。单元测试可像使用 Rule Studio 运行配置来运行测试这么简单,也可以是使用基于 JUnit 的测试框架的更详细的测试套件。

在我们的场景中,我们使用一个简单的运行配置来运行和调试规则。通过右键单击规则项目并选择 Run As - Rule Project,将创建 Run As Configuration,然后可修改它来使用 WebSphere ILOG JRules 函数创建一个输入请求。图 17 显示了此场景。

图 17. 规则项目运行配置
规则项目运行配置

我们用来创建 Alert 作为请求的 WebSphere ILOG JRules 函数如 清单 5 中的代码所示。

清单 5. WebSphere ILOG JRules 函数
oasis.names.tc.emergency.cap._1_1.Alert result 
	= new oasis.names.tc.emergency.cap._1_1.Alert();
result.sender = "UNIT_TEST";
result.identifier = "TEST";
result.sent = new ilog.rules.xml.types.IlrDateTime(new java.util.Date());
result.infoList = new java.util.Vector();
oasis.names.tc.emergency.cap._1_1.Alert.Info info 
	= new oasis.names.tc.emergency.cap._1_1.Alert.Info();
result.infoList.add(info);
info.certainty = "Observed";
info.severity = "Severe";
info._event = "HeavyRainfall";
info.parameterList = new java.util.Vector();
oasis.names.tc.emergency.cap._1_1.Alert.Info.Parameter param 
	= new oasis.names.tc.emergency.cap._1_1.Alert.Info.Parameter();
info.parameterList.add(param);
param.valueName="RainfallLevel1H";
param.value="16";
return result;

当在调试模式运行此配置时,我们可在规则流和规则中创建断点,查看触发的规则,以及浏览工作内存中的对象。通过以此方式运行一些场景,规则开发人员可断言 BOM 和初始规则集没有错误。规则开发人员可与业务用户紧密合作来确保规则的有效性。


结束语

我们已看到 WebSphere ILOG JRules 是一个强大的工具,为规则应用程序开发提供了丰富的向导和加速器。使用一个案例分析,我们介绍了一个常用的规则开发流程,它可供技术开发人员用于创建规则和测试在初始化期间发现的规则。在本系列的下一篇文章中,我们将介绍使非技术性业务用户能够编写和测试规则的任务。


下载

描述名字大小
cccrules_pif_051811.zip---

参考资料

学习

获得产品和技术

讨论

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Industries, WebSphere
ArticleID=877334
ArticleTitle=开发决策服务,第 2 部分: 规则开发流程
publish-date=04232013