drools 语法

合集下载

[Drools]JAVA规则引擎(非常好的一篇教程)

[Drools]JAVA规则引擎(非常好的一篇教程)

[Drools]JA V A规则引擎(非常好的一篇教程)Drools是一个基于java的规则引擎,开源的,可以将复杂多变的规则从硬编码中解放出来,以规则脚本的形式存放在文件中,使得规则的变更不需要修正代码重启机器就可以立即在线上环境生效。

本文所使用的demo已上传/source/30022131、Drools语法开始语法之前首先要了解一下drools的基本工作过程,通常而言我们使用一个接口来做事情,首先要穿进去参数,其次要获取到接口的实现执行完毕后的结果,而drools也是一样的,我们需要传递进去数据,用于规则的检查,调用外部接口,同时还可能需要获取到规则执行完毕后得到的结果。

在drools中,这个传递数据进去的对象,术语叫Fact对象。

Fact 对象是一个普通的java bean,规则中可以对当前的对象进行任何的读写操作,调用该对象提供的方法,当一个java bean 插入到workingMemory中,规则使用的是原有对象的引用,规则通过对fact对象的读写,实现对应用数据的读写,对于其中的属性,需要提供getter setter访问器,规则中,可以动态的往当前workingMemory中插入删除新的fact对象。

规则文件可以使用.drl文件,也可以是xml文件,这里我们使用drl文件。

规则语法:package:对一个规则文件而言,package是必须定义的,必须放在规则文件第一行。

特别的是,package的名字是随意的,不必必须对应物理路径,跟java的package的概念不同,这里只是逻辑上的一种区分。

同样的package下定义的function和query等可以直接使用。

比如:package com.drools.demo.pointimport:导入规则文件需要使用到的外部变量,这里的使用方法跟java相同,但是不同于java的是,这里的import导入的不仅仅可以是一个类,也可以是这个类中的某一个可访问的静态方法。

DROOLS语法详解

DROOLS语法详解

①package com.sample包名,不可以与关键字冲突。

一个包通过名称空间描绘,这样很好的保持了一组规则的独立性。

②import标记就像java中的含义一样。

对于任何要用在规则中的对象,你需要指定完整的路径和类型名。

Drools从同名的java包中自动导入类。

③global如果多个包定义了同样名称的全局变量,它们必须使用同样的类型,并且全部指向同一个全局值。

全部变量通常用来返回数据,获得提供数据或服务给规则使用。

为了使用全局变量,你必须:在规则文件中声明全局变量并使用它,如:在working memory上设置全局变量的值。

最好是在将fact插入working memory之前设置④function相对于正常的java类,函数是在你的规则代码中放置语言代码的方法。

它们不可能做任何超过你可以在帮助类(在java中定义,被设置入规则的Working Memory中的类)中做到的事情。

使用函数的优点是可以将逻辑保存在一个地方,并且你可以在需要的时候改变函数(这样做各有优缺点)。

函数最大的用处是被规则的推论(then)部分中的行为所调用,特别是当一个行为操作需要反复被调用时(将公用代码抽取出来成为一个函数)。

⑤rule 名称可以在“”下取任何名字。

属性列表:⑥LHS (when) 条件元素为了能够引用匹配的对象,使用一个模式绑定变量如‘$c’。

变量的前缀使用的$是可选的,但是在复杂的规则中它会很方便用来区别变量与字段的不同。

第一个有两个约束而第二个组有一个约束,可以通过圆括号来改变求值的顺序。

单值约束Matches 操作字符串约束字符串约束是最简单的约束格式,将字段与指定的字符串求值:数值,日期,string或者boolean。

绑定变量约束变量可以绑定到Fact和它们的字段,然后在后面的字段约束中使用。

绑定变量被称为声明。

有效的操作符由被约束的字段类型决定;在那里会进行强制转换。

绑定变量约束使用'=='返回值约束返回值约束可以使用任何有效的Java元数据类型或对象。

drools规则语法

drools规则语法

drools规则语法1、基本的匹配规则1.1变量drools使⽤匹配的⽅式对Fact进⾏⽐对,⽐如MVEL代码1. account : Account(balance > 100)这个规则的含义就是在Fact中找到类型为Account,且balance属性值⼤于100的所有Account实例。

可以指定变量来描述⼀个类型或者⼀个映射⼀个类的属性,⽐如MVEL代码1. $account : Account($type : type)使⽤$Variable来定义⼀个变量,这⾥定义了两个变量,$account表⽰定义⼀个类型为Account的变量,⽽$type映射Account类型中的type属性。

定义变量是为了在后续的规则中使⽤。

MVEL代码1. $account : Account(balance >100)2. Customer(account == $account)这个就是说要找到⼀些Custom类型的Fact,且其account属性必须满⾜前⾯定义的balance>100的条件。

1.2类型drools⽀持各种java数据类型String:字符串MVEL代码1. Customer(name == "john")正则表达式:MVEL代码1. Customer(name matches "[A-Z][a-z]+")表⽰Customer类型的name属性必须满⾜⾸字母为⼤写A-Z,且第⼆位以后有⼀个或者多个⼩写的a-z组成。

Date:⽇期类型MVEL代码1. Account(dateCreate > "01-Feb-2009")⽇期的格式默认是"dd-mmmm-yyyy",可以更改。

Boolean:布尔类型1. Transaction(isApprove == true)Enum:枚举类型MVEL代码1. Account(type == Account.Type.STUDENT)1.3注释单⾏注释://或者#多⾏注释: /* */1.4包MVEL代码1. package com.kingsun.drools.rules声明该规则⽂件所属的包,是⼀种namespace组织⽅式,和java的包类似,物理上不需要存在相应的⽬录结构,它只是逻辑上的划分。

drools 的高级语法

drools 的高级语法

drools 的高级语法Drools的高级语法。

Drools是一个基于规则引擎的开源项目,它提供了一个强大的规则引擎和业务规则管理系统。

Drools规则引擎使用一种称为DRL (Drools Rule Language)的领域特定语言来描述业务规则。

DRL 语言具有丰富的高级语法,使得用户可以更加灵活地描述规则和条件。

1. 规则定义。

在DRL中,规则的定义是使用关键字“rule”开头,后面跟着规则的名称和条件。

例如:rule "Discount Rule"when.$order : Order(total > 1000)。

$order.applyDiscount(0.1);end.在上面的例子中,我们定义了一个名为“Discount Rule”的规则,当订单总金额大于1000时,就会触发该规则,给订单应用10%的折扣。

2. 条件语法。

DRL语言提供了丰富的条件语法,包括逻辑操作符、比较操作符、集合操作符等,使得用户可以更加灵活地描述规则条件。

例如:rule "Age Rule"when.$person : Person(age > 18 && age < 60, gender == "male")。

$person.setCategory("Adult Male");end.在上面的例子中,我们定义了一个名为“Age Rule”的规则,当人的年龄在18到60之间且性别为男性时,就会触发该规则,将该人员的类别设置为“成年男性”。

3. 函数和方法调用。

DRL语言还支持在规则中调用函数和方法,这使得用户可以更加灵活地处理规则逻辑。

例如:rule "Tax Rule"when.$order : Order()。

then.$order.calculateTax();end.在上面的例子中,我们定义了一个名为“Tax Rule”的规则,当订单被匹配时,就会触发该规则,调用订单的计算税金方法。

Drools规则文件——语法属性

Drools规则文件——语法属性

Drools规则文件——语法属性1.salience功能:设置规制执行的优先级值:数字(数字越大执行优先级越高)示例:rule "rule1"salience 1wheneval(true)thenSystem.out.println("rule1");end2.no-loop功能:控制已经执行的规则条件再次满足是否再次执行值:true/false示例:rule "rule1"no-loop truewhen$customer:Customer(name=="张三")thenupdate($customer);System.out.println("customername:"+$customer.getName()); End3.activation-group功能:若干个规则划分成一个组值:分组名称示例:rule "rule2"activation-group "test"salience 10wheneval(true)thenSystem.out.println("rule2 execute");endrule "rule1"activation-group "test"salience 9wheneval(true)thenSystem.out.println("rule1 execute");endnote:如果同一组规则,谁的salience高就执行谁,没有则按顺序执行最后同组最后那个规则4.declare作用:Drools除了可以接受用户在外部向WorkingMemory当中插入现成的Fact对象,还允许用户在规则文件当中定义一个新的 Fact对象。

语法:declare Address熟悉名 : 类型end示例:package com.demo.factdeclare Addresscity : StringaddressName : String endrule "rule1"salience 2wheneval(true);thenAddress add = new Address();add.setCity("中国上海");add.setAddressName("中国上海松江区");insert(add);end5.date-expires功能:当系统时间<=date-expires后才会触发值:日期默认格式为dd-MMM-yyyy可以设置其它时间格式如yyyy-MM-dd,需在代码设置系统时间格式System.setProperty("drools.dateformat", "yyyy-MM-dd");示例:rule "rule1"date-expires"2009-09-27"wheneval(true);thenSystem.out.println("rule1 isexecution!"); end。

drools语法规则

drools语法规则

drools语法规则Drools是一个规则引擎,它允许开发人员以声明性的方式定义和执行业务规则。

Drools语法规则定义了规则的结构、语义以及如何使用它来编写规则。

Drools规则由两个部分组成:左手边(LHS)和右手边(RHS)。

LHS 用于规定规则的前置条件,而RHS用于规定规则的操作。

在Drools中,规则以关键字“rule”开头,后跟规则的名称。

规则的格式如下:```droolsrule "rule_name"attributeswhenconditionsthenactionsend```规则的名称是可选的,如果没有提供名称,Drools将自动生成一个唯一的名称。

以下是Drools规则中常见的语法元素:1. 属性(attributes):规则可以具有一些可选的属性,用于配置规则的行为。

这些属性在规则的名称之后,条件之前定义。

例如:```droolsrule "rule_name"salience 10when...```2. 前置条件(conditions):前置条件指明了规则的触发条件。

这些条件必须为真才能使规则执行相应的操作。

条件语句通常使用基于模式的匹配来匹配事实。

例如:```droolsrule "rule_name"when$person : Person(age > 18)...```在上面的例子中,条件`$person : Person(age > 18)`匹配具有年龄大于18的Person对象。

3. 规则操作(actions):规则操作指定了规则满足条件时要执行的动作。

这些动作可以修改规则中使用的事实(数据对象),可以插入或者删除事实,或者执行其他的操作。

例如:```droolsrule "rule_name"then$person.setEligible(true);update($person);...```在上面的例子中,RHS中的操作调用了`setEligible(true)`方法来修改了`$person`对象的状态,并使用`update`方法通知规则引擎对对象进行更新。

drools基本语法list

drools基本语法list

drools基本语法list一、什么是drools基本语法Drools是一个基于Java的规则引擎,它提供了一种声明式的方式来定义业务规则,并根据这些规则进行推理和决策。

drools基本语法是指在使用Drools规则引擎时所需了解的语法规则和语法元素。

二、Drools基本语法概述在Drools中,规则是由条件和动作组成的。

条件用于描述规则的触发条件,而动作则是在规则满足条件时要执行的操作。

Drools基本语法包括了条件语法和动作语法两部分。

2.1 条件语法条件语法用于描述规则的触发条件,它由多个条件语句组成。

条件语句通常由一个或多个条件表达式组成,条件表达式由事实和操作符组成。

2.1.1 事实事实是指在规则中要处理的数据或对象。

在Drools中,事实可以是一个Java对象,也可以是一个关系数据库中的数据。

事实可以通过定义全局变量或使用事实模型来引用。

2.1.2 操作符操作符用于比较事实的值或属性的值。

Drools支持多种操作符,包括相等、不相等、大于、小于、大于等于、小于等于等。

2.2 动作语法动作语法用于描述规则满足条件时要执行的操作。

动作可以是修改事实的值,也可以是插入或删除事实。

2.2.1 修改事实的值通过动作语法,可以修改规则中事实的值。

修改事实的值可以通过赋值操作符来实现,也可以通过调用方法来实现。

2.2.2 插入和删除事实在规则满足条件时,可以通过动作语法插入新的事实或删除已有的事实。

插入事实可以通过调用Drools提供的API来实现,删除事实可以通过调用事实的retract方法来实现。

三、Drools基本语法示例下面是一个使用Drools的基本语法的示例:rule "Discount Rule"when$order : Order(total > 1000)then$order.setDiscount(0.1);update($order);end在这个示例中,我们定义了一个规则,名称为”Discount Rule”。

Drools高级语法

Drools高级语法

Drools⾼级语法1. Drools⾼级语法前⾯章节我们已经知道了⼀套完整的规则⽂件内容构成如下:关键字描述package包名,只限于逻辑上的管理,同⼀个包名下的查询或者函数可以直接调⽤import⽤于导⼊类或者静态⽅法global全局变量function⾃定义函数query查询rule end规则体本章节我们就来学习其中的⼏个关键字。

1.1 global全局变量global关键字⽤于在规则⽂件中定义全局变量,它可以让应⽤程序的对象在规则⽂件中能够被访问。

可以⽤来为规则⽂件提供数据或服务。

语法结构为:global 对象类型 对象名称在使⽤global定义的全局变量时有两点需要注意:1、如果对象类型为包装类型时,在⼀个规则中改变了global的值,那么只针对当前规则有效,对其他规则中的global不会有影响。

可以理解为它是当前规则代码中的global副本,规则内部修改不会影响全局的使⽤。

2、如果对象类型为集合类型或JavaBean时,在⼀个规则中改变了global的值,对java代码和所有规则都有效。

下⾯我们通过代码进⾏验证:第⼀步:创建UserService类package com.itheima.drools.service;public class UserService {public void save(){System.out.println("UserService.save()...");}}第⼆步:编写规则⽂件/resources/rules/global.drlpackage testglobal/*此规则⽂件⽤于测试global全局变量*/global ng.Integer count //定义⼀个包装类型的全局变量global erService userService //定义⼀个JavaBean类型的全局变量global java.util.List gList //定义⼀个集合类型的全局变量rule "rule_global_1"whenthencount += 10; //全局变量计算,只对当前规则有效,其他规则不受影响userService.save();//调⽤全局变量的⽅法gList.add("itcast");//向集合类型的全局变量中添加元素,Java代码和所有规则都受影响gList.add("itheima");System.out.println("count=" + count);System.out.println("gList.size=" + gList.size());endrule "rule_global_2"whenthenuserService.save();System.out.println("count=" + count);System.out.println("gList.size=" + gList.size());end第三步:编写单元测试KieServices kieServices = KieServices.Factory.get();KieContainer kieClasspathContainer = kieServices.getKieClasspathContainer();KieSession kieSession = kieClasspathContainer.newKieSession();//设置全局变量,名称和类型必须和规则⽂件中定义的全局变量名称对应kieSession.setGlobal("userService",new UserService());kieSession.setGlobal("count",5);List list = new ArrayList();//size为0kieSession.setGlobal("gList",list);kieSession.fireAllRules();kieSession.dispose();//因为在规则中为全局变量添加了两个元素,所以现在的size为2System.out.println(list.size());1.2 query查询query查询提供了⼀种查询working memory中符合约束条件的Fact对象的简单⽅法。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

drools 语法
Drools 是一种基于 Java 环境的规则引擎框架,用于构建专家
系统。

它由一个可编辑的规则和事实数据库组成,可以支持自然语言
条件和动作以及复杂的语法表达式。

Drools 允许开发者使用基于规则
的编程模型,并使用表格中指定的条件,以更方便的方式分析数据,
从而检查规则和给出结论。

Drools 语法有很多种,用于表达规则。

它们可以描述规则的每
个组成部分,从而使这些组成部分可以进行各种操作。

其中一种语法
是 if-then 威胁,它可以用来将一组特定的条件表达为两个部分:第
一个部分定义了应用规则的情况,第二个部分定义了系统执行的动作。

还有另一种语法叫做类型,这种语法可以用来定义一系列类型,这些
类型可以用来定义规则中涉及的数据的类型。

其他的语法也都是对应
此类规则的,例如:NamedWindows、Query、Imports 等等。

总的来说,Drools 语法能够帮助开发人员有效地通过规则表达
式来实现专家系统。

它支持规则的编写,包括命名、因果链接等,从
而更容易理解所表达的规则。

同时,它还支持复杂的数据类型,有效
地支持复杂的表达式,并且可以根据人们需要自由地编写新的规则。

因此,Drools 可以很好地实现专家系统,且其应用有着重要的意义和
价值。

相关文档
最新文档