【管理精品】0104023一个知识库系统与外部数据源接口的研究
一个知识库系统与外部数据源接口的研究
摘要 本文论述了一个知识库系统与外部数据源接口的描述定义和程序实现
方法。
关键词 知识库系统 数据库 数据源
1 引言
随着智能决策支持系统应用领域的不断扩大,原来由模型库系统完成的部分定量分析任务,将归并到知识库系统中。即要求知识库中,不仅有专家的定性知识,而且也应该具有计算知识,形成一个广义的知识库系统。在广义知识库系统中,要求推理机不仅要具有一般的推理功能,而且能够从外部数据源获取数据,对数学模型进行求解的功能。如何从外部数据源获取数据,是使推理机具有模型求解功能的关键技术之一。笔者在生产成本管理知识库系统的开发过程中,使用Visual c++6.0 成功地研究开发了该知识库系统与外部数据源的接口,拓宽了推理机的功能,收到了比较好的效果。外部数据源主要是指文本数据文件、数据库和Excel电子表。由于受篇幅限制,本文主要针对知识库系统与文本数据文件、数据库接口的设计实现问题进行讨论。知识库系统与Excel电子表的接口问题,笔者将另撰文介绍。
2 接口的描述定义
在生产成本管理知识库中,以知识数据块的形式对外部数据源进行如下描述定义。
2.1 文本数据文件接口的定义格式
DATAFILE //可以定义多个文件的接口。
<文件句柄>=OPEN(<文件名称>)//在一个接口中,可以定义任意个输入数据文件。
<变量>=READ(<文件句柄>,行号,列号)//可以有多行。
| //或
WITH <文件句柄>
<变量>=READ(行号,列号) //可以有多行。
END WITH
END DATAFILE
337
2.2数据库接口的定义格式
DATABASE //在一个知识库中可以定义多个这样的接口
CONNECTION
=<连接字符串> //可以同时定义多个连接对象
INPUTTABLE //每个接口只能定义一个输入块。
RECORDSET =,CONNECTION
//可以定义多个记录集对象名。
〈变量〉=.FIELDS(字段序号)//可以有多行
| //或
WITH 〈ADO记录集对象名>
<变量 >= .FIELDS(字段序号) //可以有多行
END WITH
END INPUTTABLE
OUTPUTTABLE //定义与存储结果数据表的接口,每个接口最多可以定义一个输出块。
RECORDSET =,;
.FIELDS(字段序号)=〈变量〉;
| //或
WITH
(FIELDS(变量序号)=<变量>;
END WITH
END OUTPUTTABLE
END DATABASE
在上述格式中,〈变量〉是指计算表达式及模型中需要用户提供值的参数,或存储表达式及模型的求解结果。“//”表示注释。此外,笔者在生产成本管理知识库系统开发工具中,开发了知识库与外部数据源接口定义的辅助工具,用户利用这些工具可以十分方便地完成接口的描述定义工作。
3 接口程序的实现
在推理机运行之前,首先将知识库读入内存,并且转换成计算机的内部表现形式。接口程序再根据知识库与外部数据源接口的定义,将外部数据源的数据读入内存缓冲区后,最后在进行推理。
为了便于查找知识库与外部数据源接口的定义语句,首先定义如下数据结构: struct LineText //存储知识库语句行文本。
{ CString Text;//存储知识库语句行文本
struct linetext *pNextLine;//下一行指针
} *pLineTextHead; //知识库语句首行指针。
struct DataObject //知识数据块对象索引表
{ CString ObjecType;//对象类型
338
struct LineText *pTextLine;//对象首行在LineText中的指针
struct DataObject *pNextObject;};//指向下一个知识数据块对象。
struct KnowClsName //存储知识类名称定义语句文本
{ CString ClsName;//知识类名称
struct KnowClsName *pNextCls;//下知识类名称的指针
struct LlineText *pTextLine;//知识类名称在LineText中的指针
struct DataObject *pFirstObject;//指向知识类中第一个知识数据块对象的指针 struct Method *pFirstMethod;//指向知识类中第一个知识方法的指针
}*pClsHead;//指向知识类的头指针。
根据上述数据结构的定义,接口程序总体实现的程序
流程
快递问题件怎么处理流程河南自建厂房流程下载关于规范招聘需求审批流程制作流程表下载邮件下载流程设计
如图1所示。在图1中,当pDo->ObjectType等于“DATAFILE“或“DATABASE”或“EXCEL”时,系统分别调用从文本数据文件、数据库和EXCEL电子表获取数据的接口函数。其中:文本数据文件接口函数的程序流程如图2所示,数据库接口函数的程序流程如图3所示。“OTHER”表示知识库中的其它知识数据块对象。
开始pCls,pClsHead
No Yes pDo=pCls,,pFirstObject 终止 pCls=NULL?
,, Yes No
pDo,,ObjectType=? pDo=NULL,
pCls=pCls,, pNextCls B A C DATABASE EXCEL OTHER DATAFILE
pDo=pDo,,pNextObject
图1 接口程序总体实现的程序流程
3.1 数据文件接口函数程序的实现
为了存储从外部数据文件获取的数据,定义如下数据结构:
struct DataFileBuffer //数据文件缓冲区
{ CString VariableName;/变量名称
double DataValue;//从文本文件获取的变量值
struct DataBuffer *pNextPata;//指向下一个变量的指针
}*pDataBufferHead,*pDataBufferTail;//缓冲区的头指针和尾指针。
据此,绘出从外部数据文件获取数据的接口函数的程序流程如图2。由于受篇幅限制,图2仅给出了程序的主要算法流程。在编程时,还必须考虑具体实现的细节,例如:如何从一个数据行中,确定数据项数量,找到Col列;如何创建DataFileBuffer的链表结构
339
等。
3.2 数据库接口函数程序的实现
根据上述知识库与数据库接口的定义格式以及知识库内部存储结构,可以绘制出数据库接口函数程序总体流程如图3所示。其中:D表示输入数据表接口程序流程,如图4所示;E表示输出数据表接口程序流程。
3.2.1 输入数据表接口程序的实现
为了存储从输入数据表获取的数据,定义数据结构如下:
struct InputDataBuffer //存储从数据库获得的数据,每一个变量建立一个数据区 { _variant_t DataValue;//可以存储不同类型的数据;
struct InputDataBuffer *pNextDataValue;};
struct PremiseVariableBuffer //前提变量(自变量)集区,接受来自数据库的数据 { CString VariableName;
struct InputDataBuffer *pInputDataBufferHead;//指向数据区头指针。 struct PremiseVariableBuffer *pNextVariable;//指向下一个变量。 }*pPremiseVariableBufferHead,pPremiseVariableBufferTail;
据此,可以绘制出知识库从外部数据库获取数据的接口程序流程如图4所示。
A
定义变量、初始化pTL1=pDo,,pTextLine pTL2=pTL1;nFind1=pTL2->Text。Find(”OPEN”) pTL1=pTL1,,pNextLine No Yes nfind1>-1? No 找出文件名称、文件句柄名称,并且打开数据文件pTL1,,Text=”END Yes (设对象名为MyFile)。Ptl2<=PTL2->pNextLine DATAFILE” ? Yes 返回 Yes pTL1=pTL1->pNextLine Ptl2->Text=”END DATAFILE”, pTL2<=pTL2-在Ptl2->Text中,找出变量名称 VariableName,行号 >pNextLine No (Row)和列号(Col);MyFile(SeekToBegin();Bool flag=MyFile(ReadString(mDataLine);设MyFile当前 Yes No 行nLine=1; 在Ptl2->Text中是 否存在“READ” No Yes 和文件句柄名称, Flag=False?
Row=nLine? 在mDataLine中找Col列 显示消息通知用户 No Yes 存在错误 No flag=MyFile.ReadStirng(mD找到否, ataLine);nLine++; 将数据和VariableName采用 Yes DataFIleBuffer结构存入内存
图2 从外部数据文件获取数据的接口函数程序流程
340
nFind1=pTL1->Text(Find(“CONNECTION”) B
定义变量、初始化pTL1=pDo,,pNextLine No nFind1>-1? pTL1=pTL1,,pNextLine Yes 找出ADO连接对象名称和连接字符串,并打开连接
pTL1->Text=”END pIT=pTL1-pNextLine;pOT=pTL1->pNextLine DATABASE” Yes No
返回 pIT-pTL1=pTL1->pNextLine >Text=”INPUTTABLE” Yes pIT=pIT->pNextLine No D pOT=pOT->pNextLine Yes No pIT->Text=”END pOT-DATABASE”? No >Text=”OUTPUTTAB?LE ” No Yes E pOT->Text=”END DATABASE”?
Yes
图3 数据库接口程序实现的总体流程
返回 D
pIT=pIT->pNextLine Yes
pRec->Text=”END Yes pIT->Text=”END ”? INPUTTABLE No No INPUTTABLE”? pRec=pIT;
No 在pRec->Text中,查找记录集对象名称 找到否, RecName、已经打开的连接对象名称conName, pRec=pRec->pNextLine
从pRec->Text截出SQL命令字符串,执行。 Yes
Yes pField->Text=”END 在pField->Text中 INPUTTABLE”? 找RecName pField=pRec->pNextLine No 将第nField字段值存入 InputDataBuffer内存缓冲区 pField=pField->pNextLine Yes 找到否, RecName(MoveNext() No Yes
No 在pField->Text中截出变量名,并RecName.GetadoEOF(), 且存入PremiseVariableBuffer缓 冲区;截出字段序号nField
341
图4 从外部数据库获取数据的接口程序流程
3.2.2 输出数据表接口程序的实现
输出数据表用来存储推理机对表达式或模型的求解结果。因此,需要在推理机运行之前,根据输出数据表接口描述的定义,准确地建立结果变量与打开数据表的记录集对象之间以及记录集对象与连接对象之间的链接关系,使得推理完成后,系统能够正确地连接数据库和打开数据表,将求解结果存入到数据表中。为此,定义如下数据结构: struct OutputDataBuffer//推理机将结果写入该区域
{ CString ConclVariableName;//推理完成以后,按变量名称排序
_Varian_t DataValue;//可以存储不同类型的数据;
struct OutputDataBuffer *pNextDataValue;
}*pOutputDataBufferHead,*pOutputDataBufferTail;
struct ConclVariableBuffer //结果变量缓冲区
{ CString VariableName;
CString ConObjectName;//排序 可以减少连接数据库的次数
CString RecObjectName;//排序 可以减少打开记录集的次数
int nField;//字段序号
struct OutputDataBuffer *pOutputDataBuffer;//指向输出数据区的指针
struct ConclVariableBuffer *pNextVariableName;
}*pConclVariableHead,*pConclVariableTail;
struct ConnecObjectName //连接对象缓冲区
{ CString ObjectName;
CString ConnectionString;
struct ConnecObjectName *pNextConnecObjectName;
}*pConnecObjectNameHead;
struct RecObjectName //记录集对象缓冲区
{ CString ObjectName;//记录集对象名称
CString RecString;//SQL语句字符串
struct RecObjectName *pRecObjectName;
}*pRecObjectNamehead;
程序实现流程与图4相类似,不同之处是:在初始化阶段,不需要连接数据库和打开数据表,将找出的结果变量与打开数据表的记录集对象之间以及连接对象之间的对应关系,存到上述结构所定义的链表中。推理机在推理完成以后,通过指向结果变量缓冲区的头指针获得整个链表的入口,将结果数据存入输出数据表中。
4 结束语
本文开发的知识库系统与外部数据源的接口作为生产成本管理知识库系统开发工具的重要组成部分,目前正在两个不同类型的企业进行试运行,已经收到了比较好的效果。应
342
用实践证明,该系统运行稳定可靠,接口描述定义格式简单实用。我们准备将接口程序转
为ActiveX DLL 组件形式,便于在不同的知识库系统中使用,以获得更好的效果。
参考文献
1 Eugene Olafsen等著, 王建华等译. MFC Visual C++6编程技术内幕. 机械工业出版社, 2000年版
2 熊范纶等. 雄风专家系统开发工具. 清华大学出饭社, 1999年版
3 王永庆. 人工智能原理与方法. 西安交通大学出版社, 1998年版
The Study on Interface
of a Knowledge Base System and External DataSource
Ma Jinping Xing jun
(Manangement Department QingDao University , 266071)
Abstract This paper discussed describe definition and program implementation method on
interface of a Knowledge Base System and External DataSource.
Key words Knowledge Base System DataBase DataSource
343
344