首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

使用 Excel 表单辅助 AQL 规则定义和开发(2)

使用 Excel 表单辅助 AQL 规则定义和开发(2)

实现部分AQL 运行环境AQL 以 module 为单位,提供编译接口对 module 进行编译,编译文件为 tam 文件,可以被其他程序使用,而 AQL 源文件本身不能被直接调用。
AQL 支持 java 程序和 JAQL 程序调用,提供两种 API。这两种 API 都分别包括编译 API 和调用 API。
AQL 基本语法AQL 作为一种类 SQL 语言,基本的组成单元为 view、dictionary、table 和 function。这里我们主要介绍一下 view 和 dictionary。
在详细介绍之前,需要注意以下几个限制:
  • 所有的名称不能包含”.”。
  • module 的名称不能保护关键字和保留字。
  • 当使用 select 语句时,必须列出所有需要的列名,而不能使用通配符“*”。
  • Document 为保留字,表示输出的文本参数,不可以作为输出的 view。
  • 所有的语句均以“;”结束。
AQL dictionary顾名思义,dictionary 为字典,如图 2 所示的 preg_1 规则中定义的所有“不包含”以及“包含”列,每一列的单词构成一个字典。字典可以分为内部的 dictionary 和扩展的 dictionary。
由于 AQL 的 module 需要在编译后才能被使用,因此编译后的 module 不具备动态扩展性,而扩展的 dictionary 解决了这个问题。扩展的 dictionary 是指在 AQL 定义时不指定字典内容,仅仅是声明一个扩展的 dictionary,而在 AQL 调用时再指定字典内容。因此,根据调用时指定的 dictionary 不同,AQL 的 module 可以提供不同的功能。扩展的 dictionary 声明如清单 1 所示。
清单 1. 可扩展的 dictionary 声明
1
2
3
4
create external dictionary <dictionary-name>
allow_empty [true|false]
[with] [language as '<language codes>']
[and] [case (exact | insensitive )];




而内部的 dictionary 则是一般常用的 dictionary 声明方式,其提供两种声明,一种方式直接将字典的内容写在 create dictionary 语句中,另一种则使用一个后缀为 dict 的文件来包含字典的内容,在 create dictionary 语句中指定该字典所使用的 dict 文件。
将字典内容写在 AQL 文件的 create dictionary 语句中,如清单 2 所示。
清单 2. 字典内容硬编码在 AQL 文件中
1
2
3
4
5
create dictionary preg1_att_exclude_dict
with language as ‘en’
as
(“if”,“when”,“hope”,“wish”)
;




将字典内容写在单独的 dict 文件中,而在 AQL 文件中声明该字典,如清单 3 所示。
清单 3. 以独立的 dict 文件声明的字典
1
2
3
4
5
6
7
8
9
10
//首先创建一个 dict 文件,名为 preg1_att_exclude.dict,内容如下:
if
when
hope
wish
//其次,在 aql 文件中声明 dictionary
create dictionary preg1_att_exclude_dict
from file ‘preg1_att_exclude.dict’
with language as ‘en’
;




一般情况下,我们会使用第二种方法创建内部 dictionary。根据经验,当 AQL 脚本完成后,后期的维护一般都是对 dictionary 内容的调整,而将 dictionary 内容放在单独的文件中,可以避免对 AQL 文件本身的误操作。
AQL viewAQL 语言最基本的组成单位为 view,也是最常见的组件。‘create view’语句有三种基本的形式:
  • create view <viewname> as <select or extract statement>;
  • create view <viewname> as (<select or extract statement>) union all (<select or extract statement>)...;
  • create view <viewname> as (<select or extract statement>) minus (<select or extract statement>);
第一种为基本形式,而后两种为 view 的组合形式。
基本的‘create view’语句
一个基本的‘create view’语句包含了一个 view 名称,和一个 select 或 extract 短语。一个 view 只能包含一个 select 或一个 extract 短语,二者不能并存。select 或 extract 短语都是用来指定这个 view 的过滤条件的,不同的情况可以使用不同的子句,但大多数时候两个子句可以实现相同的功能。
select 语句的基本语法如清单 4 所示。一个 select 语句包含一组 item,如 f1,f2,一组 view,如 V1,V2,和一组可选的 where 条件。基本用法和 SQL 语言类似,从不同的 view 中根据 where 条件选择目标列。consolidate 子句的作用是用来去除相同项。
清单 4. select 语句的基本语法
1
2
3
4
5
6
7
8
9
10
11
12
13
select
v1.f1 [as f1 '],
v2.f2 [as f2 '],
...
from
V1 v1 ,
V2 v2 ,
...
[where
condition1 ,
condition2 ,
...
consolidate on ...]




extract 语句的基本语法如清单 5 所示。
清单 5. extract 语句的基本语法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
extract
v1.f1 [as f1 '],
<regual expression>,
<doctionaries>,
<pattern >,…
from
V1 v1 ,
...
[having
condition1 ,
condition2 ,
...
consolidate on ...
Limit <maximum>]




相较与 select 语句,extract 语句支持更多的子句:正则表达式、字典以及 pattern 子句。正则表达式子句表示 V1 中所选的项需要满足<regular expression>才能被获得。字典子句则表示 V1 中所选的项需要包含字典中的至少一个词才能被获得。而 pattern 子句则提供了一组过滤方式,该子句是 extract 一个重要的属性,通过该子句,extract 才可以实现与 select 子句相同的功能。以清单 6 为例说明 pattern 子句的用法:
清单 6. pattern 子句示例
1
2
3
4
5
6
7
Create view love_color as
extract
pattern (<L.love>) <Token>{0,2} (<C.color>)
return group 0 as match
and group 1 as love
and group 2 as color
from love_view , color_view C;




love_color 视图是根据 love_view 视图和 color_view 视图组合而成的,love_color 视图将会提取这样的句子:
  • 该句子包含 love_view 视图中的 love 字段,由‘(<L.love>)’表示。
  • 该句子包含 color_view 视图中的 color 字段,由‘(<C.color>)’表示。
  • 该句子中 love 字段与 color 字段中间所间隔的单词数不能超过 2,由‘<Token>{0,2}’表示,其中 {0,2} 用来表示两个字段的中间间隔字符数。
return 子句是 pattern 的一部分,用来返回 pattern 的结果。group 0 表示被匹配到的整个从 love 到 color 的子字符串,group 1 表示匹配到的 love 字段,而 group 2 表示匹配到的 color 字段。如果 pattern 还有其他需要匹配的字典,则 group 按顺序编码。
返回列表