本发明涉及一种规则动态化方法,具体涉及一种实现规则引擎动态化的方法。
背景技术:
aviator是一个高性能、轻量级的java语言实现的表达式求值引擎,主要用于各种表达式的动态求值。现在已经有很多开源可用的java表达式求值引擎,为什么还需要avaitor呢?
aviator的设计目标是轻量级和高性能,相比于groovy、jruby的笨重,aviator非常小,加上依赖包也才537k,不算依赖包的话只有70k;当然,aviator的语法是受限的,它不是一门完整的语言,而只是语言的一小部分集合。
其次,aviator的实现思路与其他轻量级的求值器很不相同,其他求值器一般都是通过解释的方式运行,而aviator则是直接将表达式编译成jvm字节码,交给jvm去执行。简单来说,aviator的定位是介于groovy这样的重量级脚本语言和ikexpression这样的轻量级表达式引擎之间。
aviator的特性:
1、支持绝大多数运算操作符,包括算术操作符、关系运算符、逻辑操作符、位运算符、正则匹配操作符(=~)、三元表达式(?:)
2、支持操作符优先级和括号强制设定优先级
3、逻辑运算符支持短路运算。
4、支持丰富类型,例如nil、整数和浮点数、字符串、正则表达式、日期、变量等,支持自动类型转换。
5、内置一套强大的常用函数库
6、可自定义函数,易于扩展
7、可重载操作符
8、支持大数运算(biginteger)和高精度运算(bigdecimal)
9、性能优秀
在计算机科学中,抽象语法树(abstractsyntaxtree,ast),或简称语法树(syntaxtree),是源代码语法结构的一种抽象表示。它以树状的形式表现编程语言的语法结构,树上的每个节点都表示源代码中的一种结构。之所以说语法是“抽象”的,是因为这里的语法并不会表示出真实语法中出现的每个细节。比如,嵌套括号被隐含在树的结构中,并没有以节点的形式呈现;而类似于if-condition-then这样的条件跳转语句,可以使用带有两个分支的节点来表示。
在计算机科学和语言学中,语法分析(英语:syntacticanalysis,也叫parsing)是根据某种给定的形式;
文法对由单词序列(如英语单词序列)构成的输入文本进行分析并确定其语法结构的一种过程。
语法分析器(parser)通常是作为编译器或解释器的组件出现的,它的作用是进行语法检查、并构建由输入的单词组成的数据结构(一般是语法分析树、抽象语法树等层次化的数据结构)。语法分析器通常使用一个独立的词法分析器从输入字符流中分离出一个个的“单词”,并将单词流作为其输入。实际开发中,语法分析器可以手工编写,也可以使用工具(半)自动生成。
语法分析器的任务主要是确定是否可以以及如何从语法的起始符号推导出输入符号串(输入文本),主要可以通过两种方式完成:
自顶向下分析:根据形式语法规则,在语法分析树的自顶向下展开中搜索输入符号串可能的最左推导。单词按从左到右的顺序依次使用。
自底向上分析:语法分析器从现有的输入符号串开始,尝试将其根据给定的形式语法规则进行改写,最终改写为语法的起始符号。
现有的方法是对所有的规则进行遍历,由于这些规则是针对同一批数据,在规则数量越大的情况下,相似的条件会有很多,即相同的模式会出现多次,在这种情况下,会产生针对同一规则的多次计算。造成较大的资源浪费和时间消耗。
因此,需要对现有技术进行改进。
技术实现要素:
本发明要解决的技术问题是提供一种高效的实现规则引擎动态化的方法。
为解决上述技术问题,本发明提供一种实现规则引擎动态化的方法,包括以下步骤:
1)、使用语法解析技术解析规则,规则解析成语法树;
2)、从语法树中提取最简模式,得到最简模式矩阵;
3)、对最简模式矩阵构建网状结构。
作为对本发明实现规则引擎动态化的方法的改进:
步骤2为使用矩阵方法来对表达式化简。
作为对本发明实现规则引擎动态化的方法的进一步改进:
步骤2包括:
2.1)、如果当前语法节点是叶子节点,生成当前节点的一阶析范矩阵,
2.2)、如果当前不是叶子节点;
2.3)、获取第一个子节点和第二个子节点;
2.4)、根据与,或规则进行计算;
2.5)、使用吸收,化简矩阵;
2.6)、根节点的矩阵就是化简结果。
作为对本发明实现规则引擎动态化的方法的进一步改进:
步骤3为:将步骤2得到的最简模式矩阵中的子规则共用相同的子表达式,将多个管道混合在一起,共用管道的节点,这样组成一个网络结构来描述优化后的所有规则。
作为对本发明实现规则引擎动态化的方法的进一步改进:
还包括步骤4:为数据加上规则标志。
作为对本发明实现规则引擎动态化的方法的进一步改进:
步骤2中对于子表达式,建立一个全局缓存空间存储,同时会对子表达式做全局唯一性检查;
对于矩阵的顺序做调整,调整规则可以是子表达式的名称顺序,复杂度顺序或是其他可扩展的排序方法。
本发明实现规则引擎动态化的方法的技术优势为:
本发明是从规则中提取出模式,将模式组合成网状结构,以提高对数据的消费速度,降低资源的重复浪费。网状结构可以保证同一条数据,每个模式只经过一次计算。规则提取技术则保证了,原始规则和处理后的规则有同样的语义,保证了执行结果的正确性。
本发明方法优势在于:
1、提高了计算资源的利用效率;
2、提高了引擎的处理性能。
附图说明
下面结合附图对本发明的具体实施方式作进一步详细说明。
图1为语法解析技术解析规则的示意图;
图2为对模式构建网状结构示意图。
具体实施方式
下面结合具体实施例对本发明进行进一步描述,但本发明的保护范围并不仅限于此。
实施例1、实现规则引擎动态化的方法,如图1-2所示,包括以下步骤:
a)、使用语法解析技术解析规则:
这一步将规则解析成语法树。这里的规则是由aviator语言描述的,规则在语言中表现为布尔表达式。所以根据布尔表达式的特征,可以将规则细分为几种小规则:
1、表示与的规则:这种规则有两个子规则,当子规则都为真时,该规则是真。若两个规则任一个是假或都是假,那么该规则为假。
2、表示或的规则:这种规则有两个子规则,当子规则都为假时,该规则是假。若两个规则任一个是真或都是真,那么该规则为真。
3、表示非的规则:这种规则有一个子规则,当子规则为真时,该规则是真。当子规则是假时,该规则是假。
4、原子规则:上面3种规则之外的规则,视为不可分规则。
根据上面的划分方法,可以对于每条规则都构建一颗语法树,树枝是与或非三种规则,叶子节点是原子规则。
例如解析成的语法树如图1所示:((((x0&x1)&!(x2))|(x3&x0))|x3);
b)、从规则中提取最简模式。
构建完成语法树后,需要从语法树中提取最简模式的规则,便于后续的进一步处理。
最简模式是对布尔表达式的化简,这里使用矩阵方法来对表达式化简。
设表达式出现的所有布尔变量为xi(i=1,2…n),n为布尔变量的个数,m为表达式的最小项个数。
例如x1x3x5+x2x4+x1x2x4x5可以写成:
10101
01010
11011
单个布尔变量可以看成一个特殊的析取范式,只有一个最小项,且最小项只有一个布尔变量。
将步骤a中的语法树化简后得到(x0&x1&(!x2))|x3。
下面说下关于矩阵的运算规则:
1、析范矩阵的或运算:
表达式a与表达式b的或运算,只需要将a和b的矩阵各行合并在一起,就可以得到结果
其中n为a和b使用的布尔变量个数,m为a中最小项个数,g为b中最小项个数。
2、单行析范矩阵的与操作
对于两个单行析范矩阵,他们的与操作也是一个单行析范矩阵,该矩阵的元素分别是两个矩阵对应元素的计算结果:
[a1a2...an]*[b1b2...bn]=[a1b1a2b2...anbn]
3、析范矩阵的与操作
布尔表达式a与布尔表达式b进行与操作,只要将a与b的矩阵的各行两两进行单行析范矩阵的与操作。
4、析范矩阵的吸收操作:
在矩阵中,如果某行含有另一行的所有非0元素,那么这行要被删除。
例如:
5、如何从语法树生成析范矩阵;
5.1)、如果当前语法节点是叶子节点(atom或者notatom),生成当前节点的一阶析范矩阵,
5.2)、如果当前不是叶子节点;
5.3)、获取第一个子节点和第二个子节点;
5.4)、根据与,或规则进行计算;
5.5)、使用吸收操作,化简矩阵;
5.6)、根节点的矩阵就是化简结果。
6、上述的是现有布尔化简的算法简述,在规则引擎中还需要处理一些具体的工程优化,得到优化处理后的最简模式矩阵:
6.1)、对于子表达式,建立一个全局缓存空间存储,在步骤c中使用,同时会对子表达式做全局唯一性检查。若唯一性检查不成立,会抛出异常。
6.2)、对于矩阵的顺序做调整,调整规则可以是子表达式的名称顺序,复杂度顺序或是其他可扩展的排序方法。
c)、对模式构建网状结构。
在获得上一步骤,所述的优化处理后的最简模式矩阵后,该矩阵任意一行都表示了当前规则的一个子规则,并且这个子规则是可以表示成多个模式的管道。
涵义为x1x3x5+x2x4+x1x2x4x5的最简矩阵如下:
10101该行表示一个子规则x1x3x5
01010
对于子规则x1x3x5,实质上的涵义是数据经过模式x1,再经过模式x3,经过模式x5。将多个管道混合在一起,共用管道的节点,这样,可以组成一个网络结构来描述优化后的所有规则。
步骤1:将各个子规则中的子表达式(x1,x3,x5)作为节点,然后使用带方向的管道将节点依次连接,这就代表了一个子规则x1x3x5
步骤2:对所有规则的子规则进行上述步骤1操作,可以得到一个网络结构,这个结构就是所有规则的优化结果。
假设有另一个化简后表达式是(x0&x1&(!x3)),可以和(x0&x1&(!x2))|x3共用子表达式x0&x1。如图2所示;对于x0x1!x2和x0x1!x3,可以将多个管道混合在一起,共用管道的节点,先计算数据是否匹配x0,x1,再分别计算是否匹配!x2和!x3,也就是对于数据和x0x1仅计算了一次。这样就提高了计算效率。
d)、为数据加上规则标志。
在上一步中通过管道构建了规则网络,需要在每个管道的结束节点中添加对规则的处理,为数据加上标志(以区分数据符合的规则)或是进一步加工。
术语:
rules:规则,由一到多个条件构成。一般用and或or连接conditions。
conditions:条件,规则的组成部分,指对象之间及对象属性之间的关系。
module:模式,模式就是指不能继续分割下去的最小的原子条件。
最后,还需要注意的是,以上列举的仅是本发明的若干个具体实施例。显然,本发明不限于以上实施例,还可以有许多变形。本领域的普通技术人员能从本发明公开的内容直接导出或联想到的所有变形,均应认为是本发明的保护范围。