最近一直在研究案例推理,看到好多论文都在大谈CBR理论,很是崇拜。不过一直有一个问题没有搞懂,就是案例(case)到底是怎么存储的呢?

       CBR的大师们如Schank、Koldner等人一般用动态存储模型

Dynamic Memory Model,如

Ray Bareiss者一般采用 类别&案例模型(The Category & Exemplar Model),中科院史忠植教授也提出了自己的一种由于以网络发展而来的方法。大师们的境界非我一AI菜鸟所能领悟,大师们的方法也非我能够掌握。幸好看到国内外有几篇论文比较浅显,说可以用关系型数据库来存储,一笔带过,很是潇洒,但我更加一头雾水了。

       迷糊了半个月,在高济教授等编著的《人工智能基础》(高等教育出版社,2002)第三章看到了语义网络表示方法,文中同时给出了如何将语义网络转换为一阶 谓词表示的方法,因此茅塞顿开,有了《EMC-CBR故障诊断研究(一)》一文中的成果。但一阶谓词逻辑又该如何存储到数据库呢?

        在《人工智能基础》一书的第122页作者给出了一个简单的语义网络和该语义网络的一阶谓词表示,书中阐述了一种将谓词作为数据表的列的一种存储方法。但是 思来想去该方法存在一个问题,一旦语义网络比较复杂(显示问题中随便一个问题的语义网络表示都很复杂),数据表中的列将迅速膨胀;更严重的问题是,对于不 同的EMC故障案例而言,用于描述该案例的谓词数目是不确定的,因此数据表的列数也无法确定,这在关系型数据库中是不可能实现的!我再次陷入迷茫。

       God bless us!今天终于想出一种存储方法。思路就是将一阶谓词作为一个对象来进行存储。一阶谓词的属性可以作为数据表中的列,而谓词函数以及谓词的参数作为行来存储。表的设计如下:

CBR

列号

列名

数据类型

能否为NULL

说明

1

predicate_no

smallint

Not Null

谓词编号,主键,标识,种子1,增量1

2

case_no

varchar(15)

Not Null

案例号,一般为case+数字

3

predicate

varchar(30)

Not Null

谓词

4

predicate_property

varchar(30)

Not Null

谓词属性,取值范围fault_character, phisical_structure, causation, settlement

5

param_nums

tinyint

Not Null

谓词参数的个数,取值范围12,默认为2

6

param1

varchar(50)

Null

谓词函数的第一个参数

7

is_param1_digit

bit

Null

param1是否为数字类型,默认0

8

param1_unit

varchar(8)

Null

param1的单位,如果param1为数字类型,则该项一般不为Null

9

param2

varchar(50)

Null

谓词函数的第二个参数

10

is_param2_digit

bit

Null

param2是否为数字类型,默认0

11

param2_unit

varchar(8)

Null

param2的单位,如果param2为数字类型,则该项一般不为Null

12

has_sub_predicate

bit

Null

谓词函数是否以别的谓词作为参数,默认为0

13

sub_predicate_no

smallint

Null

作为参数的谓词的编号

本案例库采用SQL Server2005 Express Edition来实现:

如果要查询案例6EUT的物理结构特征,可以用如下查询语句:

SELECT predicate, param1, param2

FROM Cases

WHERE (predicate_property = 'phisical_structure') AND (case_no = 'case6')

查询结果如下:

【注】:版权归作者所有,转载或引用请注明出处。