具体实施方式
下列各节描述结构化自然语言查询和知识系统、改进的对象相关查询语言,和对象相关代数,它示出了各种发明的特征。如将认识到的,这些特征中的数多特征可在给定的系统中实现而无需其它系统。例如,结构化自然语言查询系统可连同一般数据平台一起实现,不需要用改进的对象相关查询语言或用对象相关代数来实现。此外,各种发明特征可用不同于这里描述的方法来实现。这样,下列说明只用来说明而不是限制本发明的范围。
A.结构化自然语言查询和知识系统
图1是结构化自然语言查询和知识系统100的一个实施例。结构化自然语言查询系统100允许没有编程能力的用户以优先实时操作创建结构化自然语言查询来操作数据库。系统100也允许用户把相关数据库变换成面向对象的数据库。结构化自然语言查询可包括动词作为指令和零个、一个或多个形容词短语作为限定。可变的定义短语也可包括在结构化自然语言查询内。词“查询”在这里被广泛定义为不仅包括指令,它选择或显示数据,也包括创建、更新或删除数据的指令。系统100的一个实施例以Java编程。系统100也可用C,C++或其它的语言,操作平台或应用软件包编程。
如图1所示,系统100包括动词短语定义模块110和形容词短语定义模块120。动词短语定义模块110允许编程员定义相应于形式查询文本的动词短语,形容词短语定义模块120允许编程员定义相应于形式查询文本的形容词短语。形式查询文本可以是方法、功能、子程序,过程,SQL查询文本,或上述的组合。系统100也包括结构化自然语言编排模块130,它允许用户用定义的动词短语和形容词短语编排结构化自然语言查询。系统100进一步包括翻译模块140,以把结构化自然语言查询变成形式查询文件,和形式查询处理模块150,它处理变换的形式查询文本为从基本数据库160返回查询结果,后者可以是商业数据库系统。
系统100也包括可选的对象模式定义模块101。模块101允许用户或程序员定义对象类,包括属性号和对对象类的每一属性类型。如果用于系统100的基本数据库160是相关数据库,对象模式定义模块101允许用户或程序员把对象类与相关数据库中的表联系起来,这样,允许用户或程序员依照对象定义相关数据库表之间的相互关系。
例如,程序员或用户可定义类“polygon(多边形)”与相关数据库中的表“POLYGON”相联系。表“POLYGON”包括“VERTICES”列,类“polygon”从文本串型的“ID”属性和“顶点集”型的“vertices”属性定义。另一类“vertex”与相关数据库中的表“VERTEX”相联系。类“顶点”以文本串型的“名称”属性,数字型的“X座标”属性,和数字型的“Y座标属性”定义。对象模型定义模块101储存相互关系,它表示“POLYGON”表中“垂直”列的每一单元是“VERTEX”表中行的名称。一组“VERTEX”元组和“POLYGON”元组可作为分层的结构化“多边形”对象类一起处理。于是程序员或用户可定义与“多边形”对象类相关的动词短语和形容词短语。如果在这些表之间没有结构的相互关系,那么,每一表作为独立的对象类处理,以每一相关元组作为没有分层结构的“平面”对象。在任何事件中,用户仍然可以在结构化自然语言中定义动词短语和形容词短语。
如果用于系统100的基本数据库是对象相关或面向对象的数据库,那么对象模型定义可简单地从下面的数据库导入。
关于结构化自然语言查询,一个例句是:
Create a group from rangel whose name is“cc”(查询A1)
Who are diagnosed to have disease“mild AD”and who respond tomedication“aericept”。
在上面的查询例中,“Create a group from rangel whose name is‘cc’”是查询的动词短语,“Who are diagnosed to have disease‘mild AD’”是查询的形容词短语,“who respond to medication‘aericept’”是查询的另一形容词短语。在动词短语内,“create a group”是指令,“from range 1”是指令的变元,“whose name is‘cc’”是指令操作的结果名。在每一形容词短语内,“Who are diagnosed to have disease”和“who respond to medication”是条件,“mildAD”和“aericept”是条件的参数。
查询和知识系统100也可包括结构化自然语言规则编排模块131,规则翻译模块141,和形式规则处理模块151。模块131,141和151联系规则在下面说明。
在图1中,每一模块101-151优先用由一个或多个通用计算机执行的软件来实现。一些或全部模块可在规定应用的硬件内,整体或部分交替实现。我们将了解到,这些模块并不需要在同一计算机上运转或驻留。例如,模块101-141可集成在用户端的部件中,它在用户计算机上运转,而形式处理模块150和151可在远地服务器上运转,它提供网络为基础的对数据库的访问。此外,翻译模块140和141可作为服务器端的部件实现,它翻译在网络上从用户收到的自然语言查询和规则。系统100的模块可以以相同的或不同的计算语言,操作平台或应用软件包来实现。
图2是计算机实现的定义动词短语的方法的一个例子。在方块210,系统100提示程序员定义指令名称。指令名称是文本串,如“创建组”,“联合两个组”,“从两个组中寻找类似的起源”,“表示组的单元”,“储存”,等等。指令优先以自然语言短语的外形定义,这样容易为没有编程技术的用户所理解。
在块220,提示程序员对指令定义变元数目,例如,“创建组”指令典型地有1个参数,“从两个组中寻找相似的起源”指令典型地有2个变元。程序员也可对每一变元定义选择范围,例如,对于病人名的一个变元可以是任何用户输入的文本串,对指定保险人名字的另一变元必须是预先确定的数值表中的值。在方块230,提示程序员定义每一指令变元的数据类型。数据类型可以是原语数据型,如整数,浮点数,日期或文本串,或其它由用户或程序员确定的数据类型。新的数据类型可以定义作给定数据类型的对象集。例如,给定定义的数据类型“顶点”,新数据类“顶点集”可这样定义,使“顶点集”数据类型的每一对象是顶点集。从方块230,优先于方块240处理,那里提示程序员创建相应于定义的动词短语的形式查询文本。
词“形式查询文本”被广泛地应用于本发明中,以包括查询语言格式的文本,计算机码的集合名(例如方法),功能,过程或子程序,或宏指令名。例如对于条件“(一种基因)类似于(另一种基因)”,方法,功能,过程或子程序可以是“Var0.similar(Var1)”,“Var0”和“Var1”分别代表条件的两个参数。作为另一个例子,对于指令“从两个组中寻找类似的基因”。方法,功能,过程或子程序可以是“find similar genes(argument1,argument2),”“argument1”和“argument2”分别代表指令的两个变元。计算机码的集合存储在程序库(未示出)。如下面所述,宏指令是对查询组、规则组、或一个或多个查询组和一个或多个规则的逻辑单元。
示于图2的处理过程可以别的次序来实现,例如,在一个实施例中,程序员首先被提示对要定义的动词短语创建形式查询文本,系统100分析该形式查询文本,并确定对动词短语的变元数和对每一变元的数据类型,然后程序员被提示来定义对动词短语的指令名。
图3是计算机实现的定义条件的方法的一个例子。在方块310,系统100提示程序员定义条件名,条件名的例子包括“谁要看病”和“谁负责药物”。然后,过程推进到方块320,那里,程序员被提示定义对该条件的参数数目。在方块330,提示程序员定义对每一参数的数据类型,例如文本,整数等等。程序员还被提示定义参数是否是输入参数或输出参数。在方块340,提示程序员创建相应于所定义条件的形式查询文本,例如在查询语言中打印文本,指定宏指令名,或指定计算机码集合名,例如方法名,功能名,过程或子程序名。计算机码集合存入系统程序库中。
例如,对于条件“谁要看病”,形式查询文本的例子可以是“<argument1>.diagnosed(<parameter)”或“<argument1>.diagnosed=<parameter>”。在这一例中,“<argument1>”代表有关动词短语的指令变元,“<parameter>”代表要由用户输入的条件参数值。
图3的方法可以以别的次序来实现,例如,在一个实施例中,首先提示程序员创建对要定义的条件的形式查询文本,然后系统100分列形式查询文本并确定对该条件的参数数和每一参数的数据类型,然后提示程序员定义条件名。
动词短语和形容词短语可定义为对应复杂查询,例如,条件“谁要看所有的病”可定义作包括一组参数,它列出疾病表。用这一条件查询是寻找要看疾病表中各种病的病人。另一条件“谁至少要看一种病”可定义作包括一组参数,它列出疾病表,用这一条件查询是寻找要看疾病表中至少一种病的病人。在另一安排中,只定义条件“谁要看病”,并包括只允许一种病名的参数。如果用户要找到有两种病A和B的病人,用户要把两种这样的形容词短语“谁要看A病”和“谁要看B病”联合起来。
应注意到,动词短语和形容词短语在一定范围内可互相交换定义和使用,例如附加指定的动词短语“找要看病的病人”可以作为附加的一般动词短语“找病人”和形容词短语“谁要看病”的组合来达到同样目的。如果查询须常由用户来实行,那么优先定义作为动词短语查询,并不需要附加的形容词短语。定义专门的和一般的动词短语两者也是可行的,且允许用户既可使用专门的动词短语,也可使用结合形容词短语的动词短语。
在一实施例中,结构化自然语言查询可以以问题的形式创建,例如,“哪些病人要看‘mild AD’病和谁负责治疗‘aericept’?’”。它等效于查询“显示要看‘mild AD’病的病人和谁负责治疗‘aericept’”。在以问题形式查询中,“哪些病人”或“哪些病人是”作为动词短语。
结构化自然语言查询可以包括变量定义短语。例如,如下面B节中所描述的,如果B节中改进的对象相关查询语言与系统100结合使用,变量定义短语可以是“range of<Variable>is polygon:abc”。它意味着<Variable>的值从名为“abc”的对象集合中获得,集合的元素限制于类型“polygon”。可变定义短语可包括一个或多个可变定义。
虽然非程序员用户也可定义动词短语和条件,但词“程序员”与图2和图3联系使用,因为创建相应于动词短语或条件的形式查询文本可能并不需要某些编程技术。
图4表示编排结构化自然语言查询计算机实现方法的一个例子,在优选例中,查询用B节中描述的改进的对象相关查询语言编排。在方块410,该方法确定变量是否由用户定义。如果要定义变量,则该方法进入方块420,那里,该方法提示用户指定变量定义短语。应理解,变量定义短语,指令和条件无需以任何特殊的次序指定,换句话说,变量定义短语无需在指定指令之前指定,指令无需在指定条件之前指定。
图5是屏幕例,它提示用户或程序员指定变量定义短语。如图5所示,在根据下面B节中描述的改进的对象相关查询语言的实施例中,用户或程序员被提示在“对象名”部分510创建对象名。用户或程序员也在“类型”部分520被提示识别创建的对象的变量类型,这些创建的对象是从类型表,如“range”,“temp”,“set”和“bag”中选择。用户或程序员被进一步提示识别从“对象表”部分530选择的对象而创建的对象的数据类型,以继承被选对象的数据类型,或从原语数据型的“原语表”部分540选择。用户或编程员被提示在“数据源单元”部分550中指定用于创建的对象的数据源单元。数据源单元是同一类型的对象集。
在另一实施例中,使用C节的对象相关代数,方块410-430没有了,用户不被提示定义变量,变量是由程序员预先定义的,用户直接进到方块440。为了说明两种选项,图6A和8A作为屏幕例示出,它并不显示变量的定义,而图6B和8B作为显示变量定义的屏幕例示出。
变量定义短语也能根据所选的指令和条件自动产生。在下面B节所述的两个对象类“多边形”和“顶点”中,条件“包含”要求两个多边形作为输入,且如果第一个多边形包含第二个多边形,则返回真值。系统100储存规范,它表示“包含”条件要求二个多边形类的输入参数。当条件“包含”由用户选择时,系统100产生变量定义短语,以定义两个作为多边形类范围变量的输入参数。在另一例子中,条件“相交”要求多边形类的两个输入参数和作为两个输入多边形的相交多边形的输出参数。当用户选择“相交”条件时,系统100自动产生变量定义短语,以定义两个输入参数和输出参数。两个输入参数优先定义作范围变量,输出参数优先定义成临时变量。如果输出参数用作另一条件的输入参数,那么,其它条件的输入参数并不需要再定义。
在方块440,提示用户从定义的指令表中选择指令。在一个实施例中,提示用户从定义的指令表中选择,它可用于变量定义短语中定义的对象。例如,如果变量定义短语定义变量“多边形”,那么用户可从用于“多边形”变量的指令中选择,例如“放大”,“缩小”,“旋转”,“测量面积”,等等。图6A和图6B是用户界面屏幕的例子,它提示用户从指令表610选择指令。与图6A相比,图6B包括附加的部分620,它显示定义的变量。定义的变量也显示在句子部分630中。
返回参看图4,从方块440,过程推进至方块450,那里提示用户为选择的指令选择一个或多个变元。在方块460,在优先使用C节的对象相关代数的一个例中,用户被提示有选择地指定所选指令的结果名。指令、变元和选择结果名形成动词短语,图7是屏幕例,它提示用户选择指令变元和选择的名字结果。依据对指令定义的变元的数目和类型,可提示用户识别一个或多个变元。如图7所示,在根据C节中所述的对象相关代数的一个实施例中,对指令“创建组”,用户被提示从部分710选择数据类型,从部分720选择数据源单元,和在部分730中选择性地命名指令的结果。
再回到图4,如果用户要想选择条件,那么过程从方块470推进到方块480,那里提示用户从定义的条件表中选择条件。在一个实施例中,用户被提示从可用于变量定义短语中定义的对象所定义的条件表中选择,例如,对于变量“多边形”,像“包含”,“相交”和“是方形”这些条件都可用于“多边形”变量。图8A是屏幕例,它提示用户从条件表中选择。定义的动词短语显示在部分810,且作为句子部分830中的结构化自然语言句子的一部分。用户从部分820中的条件表选择条件。图8B是提示用户从条件表中选择的另一屏幕例,与图8A相比,图8B包括附加的部分840,它显示定义的变量。该定义的变量定义短语和动词短语,作为句子部分830中的一部分显示。
再回到图4,在方块490,提示用户指定所选条件的参数。在一个实施例中,允许多个条件共享同样的条件名,但有不同的参数数目。图9是提示用户指定所选条件参数数的屏幕例。如图9所示,对于条件“谁被诊断有”,用户可在部分910键入疾病名,或从部分920的疾病表中选择。被选的条件和参数形成形容词短语。在一个实施例中,编排模块130自动地在指令变元指定的值、命名结果和条件参数旁加引号。如果该条件有一个或多个输出参数,则用户也可通过定义初始条件的输出参数作为附加条件的输入参数来指定附加的条件。于是,附加条件根据初始条件产生的输出来评估条件。
再回到图4,在方块495,提示用户指出是否有更多的条件输入。如果有更多的条件输入,那么过程回到方块480,否则过程进入端块498。如果过程回到方块480来指定另一个形容词短语,那么用户也被提示指定连接器,如“与”,“或”或“与非”,来连接两个形容词短语。
如上所述,图5-9是一个实施例的屏幕例,它提示用户从定义的指令和条件表中选择。用户选择图6A和6B中的指令,对图7中的该指令选择变元,选择在图8A或图8B中的条件,对图9中的该条件指定参数。在另一实施例中,用户或程序员也定义图5中的变量。
指定的动词短语和形容词短语形成编排的结构化自然语言查询。图10是屏幕例,它表示在部分1040中编排的结构化自然语言查询句子,包括部分1020中的动词短语和部分1030中的形容词短语。在图10中,查询以强制性句子的优先形式出现。查询也可包括变量定义短语,如示于部分1010和1040的短语“范围1的范围是情况:情况”。也可给用户直接键入结构化自然语言查询于系统100中的选择,如图11的句子部分1110所示。有经验的用户可优先这种选择。用户也可使用直接键入和屏幕选择的联合,例如键入他们熟悉的条件或指令并从菜单选择其它条件或指令。然后,编排的查询被送到翻译模块140翻译。
翻译模块140分列编排的查询,以识别动词短语,形容词短语和选择的变量定义短语。在优先例中,翻译模块140寻找指示定义的动词短语和形容词短语的关键词。例如,在一个实施例中,所有条件都以词“谁”和“谁的”开头,翻译模块140搜索词“谁”和“谁的”,并识别任何表有该开头的这种形容词短语词。但是,如果词“谁”和“谁的”封闭在编排好查询的问号内,那么就要考虑代替这种条件的开头,用参数,命名结果或参数值来代表。翻译模块140也搜索逻辑连接器“与”,“或”,“或非”和“与非”。逻辑连接器指示一个形容词短语结束和另一个形容词短语开始。借助于搜索条件标号和逻辑连接器,模块140就能识别形容词短语,与查询的其它内容分开,且与别的形容词短语分开。
翻译模块140所定义条件的关键词以识别条件,例如,翻译模块140搜索如“看病”或“负责”这样的关键词,作为识别条件“谁看病”或“谁负责诊断”。
翻译模块140也搜索所定义的指令的关键词以识别指令,例如,模块140搜索如“创建组”或“把单元加入组中”的关键词,以识别相应的指令。模块140也可搜索关键词“从”,以标记指令参数,和关键词“谁的名字是”,以标记命名的结果。
如果指令和条件不由用户键入,但从定义的指令和条件表选择,那么分析过程可简化。因为系统100把定义的指令和条件与其相应的形式查询文本相联系,相应的形式查询文本可在用户选择指令或条件的同时储存。所存的相应形式查询文本(或它们的识别符)由翻译模块140组合,以形成转换的形式查询文本。另一方面,如果用户用键入代替从表选择输入结构化自然语言查询,那么,分析过程首先识别动词短语和形容词短语,然后组合其相应的形式查询文本。
在优先例中,翻译模块140检测在查询中的错误,并自动纠正错误或提议对错误纠正。查询错误可包括拼音错误(例如“diagnosed”误写成“diaghoised”),少字(例如“who respond to medication”输入成“whorespond to”),结构次序出错(例如形容词短语在动词短语前出现),或其它语法错误。翻译模块140纠正这些错误,并把其变成正确的查询。在一个布置中,翻译模块140向用户返回检测的错误和提议的纠正的查询,并要求用户确认纠正的查询是否是用户想要的查询。
翻译模块把相应的动词短语的形式查询文本与结构化自然语言查询的形容词短语联合起来,以形成转换的形式查询文本,用户指定的指令参数值和条件参数值结合到转换的形式查询文本中。形式查询处理模块150接收翻译的形式查询文本并在基本数据库上处理该文本以得到结果。
基本数据库160可以是相关、面向对象或对象相关。对于相关基本数据库,如果翻译的形式查询文本已经是一个或多个SQL查询,那么形式查询处理模块150直接在基本相关数据库上执行SQL查询。如果翻译的形式查询文本不是SQL查询格式,那么,形式查询处理模块1 50把翻译的查询文本变成一个或多个变换的SQL查询,并在基本相关数据库上执行翻译的查询。同样,对于对象或对象相关基本数据库,查询处理模块150直接执行翻译的查询文本,或把翻译的查询文本变成一个或多个变换的查询,它能直接在基本数据库上执行。
如果查询处理模块150不能直接执行翻译的查询文本和不能变换翻译的查询语境,那么查询处理模块150仍然处理翻译的查询文本,以返回从基本数据库160查询的结果。例如,在一个有相关基本数据库的实施例中,用B节描述的改进的对象相关查询语言,第一变量“t”定义作五个多边形对象的第一数据源单元的范围变量,第二变量“s”定义作三个多边形对象的第二数据源单元的范围变量。对于限定“t和s何处相交”,翻译的查询文本“t.intersect(s)”不可能直接在相关基本数据库上执行。查询处理模块150例举两种数据源单元的多边形对象的15种组合来确定哪一种限定是真。除了所有可能组合的平滑估计以外,最佳化方法,如重新布置限定中条件的次序,也可被采用。
在一个优先例中,结构化自然语言系统100结合改进的对象相关查询语言(B节中所描述的)工作。例如,图10中用户创建变量定义短语“范围1的范围是情况:情况”,来作为B节中改进的查询语言的范围变量定义范围1。第一个“情况:情况”中的“情况”代表数据类型,第二个“情况”代表数据源单元。另外,系统100提示用户从数据类型表,数据源单元表中选择定义变量作为范围,时间,集或元包变量。但是,结构化自然语言系统100也能与一般相关,面向对象,和对象相关数据库一起工作。改进的对象相关查询语言或对象相关代数将扩大允许查询的范围,但不是对结构化自然语言系统的先决条件。
规则也可以结构化自然语言形式编排,并用于系统100用于数据集成和其它目的。例如,规则可以以这样的形式来表示:
“On<event>If<qualification>then<command>”,“On<event>If<qualification>then<command>otherwise<command2>,或On<event>If<qualification>then<qualifcation2>”。作为医疗应用的计算机系统的一个例子,规则可用来保证输入该系统的病人年龄大于零,如果知道病人对青霉素过敏,就不能用青霉素,两种有相反作用的药物不能用于同一病人,等等。规则的范围可定义作应用于单个对象,一类的所有对象,或所有对象。在一个实施例中,结构化自然语言系统100允许用户用指定规则的限制和指令来定义规则。当事件发生时(例如,当病人体温变化时),如果限定(例如,病人体温超过102华氏度)被满足,那么指令(例如,发警告给护士或内科医生)按规则激活。在某些实施例中,事件和限制可交互便用。
结构化自然语言查询和结构化自然语言规则典型地用于不同的语境中,例如,系统的全天候监视限定和规则的可选事件,并当满足限定和事件时执行规则的指令。另一方面,查询典型地依据用户指令执行。此外,规则总是以“if qualification…then command[else command2]”或“ifqualification1 then qualification2”的形式显示,而查询总是以“command[qualification]”的形式显示。但是,因为结构化自然语言规则和结构化自然语言查询每个都包括指令和限定,因而交互使用规则和查询是很方便的。在一个实施例中,用户选择定义的查询作为规则,或选择定义的规则作为查询。
图12表示以结构化自然语言句子的形式显示规则的屏幕例。规则包括可选的变量定义短语,动词短语(指令)和一个或多个形容词短语(限定)。规则也可包括一个或多个事件。规则可以有相应于当限定为假时行动的第二动词短语。在图12中,部分1220显示限定“any ofPatient.CurrentVisit treatments interact”,和部分1230显示指令“displaymessage string‘treatment check:interact’”。部分1210显示形式查询文本,它相应于规则。限定和指令不由用户指定,例如图6A-9的屏幕。
一组规则可组成称为“宏指令”的逻辑单元。用户或程序员能指定宏指令内规则之间的相关,使用在标号后的“goto”陈述来调用其它规则。标号识别其它要调用的规则,例如,批准或拒绝借款申请的宏指令可包括下列规则。
ifhouse-or-rent=“house”then goto(rule-house);else goto(rule-rent);
rule-house:if house-value >500,000 and income >40,000 thenreturn(true);else goto(rule-house2);
rule-house2:if house-value >5,000,000 then return(true);elsereturn(false).
Rule-rent:if income >60,000 then return(true);else return(false).
在上面例中,“goto(rule-house)”代表评估由标号“rule-house”识别的另一规则,“Return(true),”代表返回批准借款申请的决策。代替返回“真”或“假”逻辑值,规则也可返回对象或数据源单元(DSE)作为输出。
在实际应用中,规则可远比上面的例子复杂得多,宏指令和“goto”允许用户或程序员指定规则间的相互关系。用户或程序员被提示对宏观指令签宏观指令名。此外,规则或看指令也可作为条件或查询中的指令或它们规则使用。
一组查询,或一个或多个规则和一个或多个查询的联合也可组合到宏指令中。查询可由标号识别,标号后的“goto”可用来调用其它查询或规则,宏指令可与对象或对象类相连系。
类似于编排结构化自然语言查询的状态,用户可以以结构化自然语言形式编排规则,类似于查询句子,规则句子有一个或多个形容词短语,来指定规则限定,动词短语,来指定当限定为真时采取的行动。规则句子可有相应于当限定为假时采取行动的第二动词短语。规则句子还有一个或多个可选事件短语,每个相应于一事件。
参考图1,规则编排模型131提示用户选择一个或多个形容词短语作为限定,一个或多个运行短语作为指令,和选择性形容词短语作为事件来编排规则。用户也可以指定规则和/或查询的宏指令,并指定宏指令内规则和/或查询之间的相互关系。规则翻译模块141把规则翻译成形式查询文本。在一个实施例中,规则翻译模块141也能直接把规则转换成系统100的主机编程语言中的功能、过程或子程序,这种语言如Java,C,C++,等等。规则处理模块151评估限定并随后执行相应于限定的指令。此外,模块151监视规则可选事件的发生。
B.改进的对象相关查询语言
在改进的对象相关查询语言下的查询或规则可表示成如下形式:
Variable specifier
…
variable specifier
command
[where qualification]
对于变量说明符中定义的每一可能变量值,如果它满足限定,那么执行指令。方括号[]指示限定是可选的。限定包括一个或多个条件(每一条件由方法或宏指令代表)和条件的参数。指令包括方法或宏指令和指令的变元。变元可以是常量或变量。返回布尔真或假值的方法是逻辑法。返回布尔真或假值的宏指令是逻辑宏指令。另外,方法/宏指令被称为通用方法或通用宏指令。方法或宏指令可有一个或多个输入参数或输出参数。如果通用方法/宏指令用作条件,那么该条件一旦被执行就被认为是真,与由方法/宏指令返回的值无关。在最简单情况下,限定由一个带有参数的方法或宏指令组成,该限定可循环建立如下:
如果α或β是限定,那么(α和β)是限定。
如果α和β是限定,那么(α和β)是限定。
如果α是限定,那么(非α)是限定。
(a)Range of<variable-id>is<data-type>:<DSE>
(b)Temp of<variable-id>is<data-type>
(c)Set of<variable-id>is<data-type>:<DSE>
(d)Bag of<variable-id>is<data-type>:<DSE>
(e)Set Temp of<variable-id>is<data-type>
(f)Bag Temp of<variable-id>is<data-type>
上述形式中“Data-type”代表数据值的格式,例如整数,浮点,逻辑,文本,日期,和用户定义的数据格式。“DSE”代表“数据源单元”。数据源单元可以是用户定义的对象,表,类,电子表格文件等集,后者包括一组数据行,其值为集的对象的属性,返回对象集的方法,如上面(c)所示的集变量,如上面(d)所示的元组变量,前面查询的结果,如下面C节详细说明的对象相关表达式,等等。
此外,DSE可以是一组结构化数据,例如树,不对称图形(DAG)或半结构化数据集,例如扩展的标志语言(XML)文件。数据类型可以各种方法限于DSE。DSE的子集可作为结合数据类型的另一DSE来形成。例如,假定树“T”有两个称为“人”和“组织”的子集,结合人:T可定义“T”的人节点的集合作为新DSE。数据类型也可借助于标签的使用限于XML文本。例如,结合类A(a:整数,b:数据串)于下面的XML文件中,导致A型对象A1的DSE,A型对象的值是(10,“America”)。标签<A1>和</A1>可以不管,因为对象A1可以从属性a和b导出。
<ROOT>
<A>
<A1>
<a>10</a>
<b>America</b>
</A1>
</A>
</ROOT>
此外,数据源单元可动态产生,以包含从一个或多个前面的查询中得到的结果。以上述(a)形式定义的变量是范围变量,以(b)形式定义的变量是临时变量,以(c)形式定义的变量是集变量,以(d)形式定义的变量是元组变量,以(e)形式定义的变量是临时集变量,以(f)形式定义的变量是临时元组变量。
范围变量从它有关的DSE中获得其可能的值,元组集变量的值是由有关DSE识别的集,与只含有特殊值(如{1,2,3,4})的集不同,元组可包含重复值,例如{1,2,3,4,1,3}。集变量和元组变量可用来建立范围变量域或临时变量域。集和元组变量也可用于聚集对象以形成需要集或元组作为参数的方法的参数。临时变量典型地用作通用方法的输出变量。临时变量的值在相应于对查询的方法或宏指令评估的同时计算,临时集或元组变量的值是由有关的DSE识别的集,并在相应于对查询的方法或宏指令评估的同时计算。
上述形式说明改进的对象相关查询语言的优先语法。其它语法形式也可使用而不背离本发明的精神和范围。例如,在其它语法形式中,变量用下列形式说明:
<variable-id>datatype:<data-type>,variabletype:<variable-type>,dse:<DSE>
<variable-type>指示范围、临时,集、元组,临时集或临时元组变量的变量类型。
下面的一些例子更清楚地说明本发明。回到优先语法,数据库例以两类定义,“顶点”和“多边形”,多边形对象由标点集定义,顶点对象由两个坐标定义。
Class vertex(name:string,x:integer,y:integer)key:name
Class polygon(name:string,vertices:set of vertex)key:name
与类多边形有关,定义两个条件,“相交”和“含有”。“相交”条件取两个多边形作为输入,且如果输入多边形对相互相交,则返回真值。“含有”条件取两个多边形作为输入,且如果第一个多边形含有第二个多边形,则返回真值。
下面给出了用改进的对象相关查询语言查询的一些例子。下面的查询从数据源单元abc寻找所有多边形的顶点:
Range of t is polygon:abc
Retrieve(t.name,t.vertices) (查询B1)
下面的查询从数据源单元abc寻找一个多边形包含另一多边形的所有多边形对:
Range of t is polygon:abc
Range of s is polygon:abc
Retrieve(t.name,s.name)
Where t.contains(s) (查询B2)
在上述查询中,“Where t.contains(s)”是限定。对于这一限定,“s”是条件“包含”的参数。
下面的查询表示数据源单元abc中包含在多边形C内的所有多边形,且它们与多边形E不相交,其大小超过5:
Range of t is polygon:abc
Range of s is polygon:abc
Range of r is polygon:abc
Var u is float
s.show() (查询B3)
Where t.name.eq(“C”)和t.contains(s)和r.name.eq(“E”)和(notr.intersect(s))和s.size(u)和u.gt(5)。
下面的查询表示数据源单元abc与多边形E相交的所有多边形,相交点是一个正方形,其大小超过5,顶点包括一个正方形,其大小超过10∶
Range of t is polygon:abc (查询B4)
Range of s is polygon:abc
Set u is vertex
Set w is vertex:s.vertices
Var u is float
s.show()
Where t.name.eq(“E”)和s.intersection(t,u,v)和is-square(u)和v.gt(5)和.is-suqare(w)和w.size(x)和x.gt(10)。
在上面的查询中,交点是与多边形有关的通用方法。它提取另一个多边形作为输入,并返回交点(一组顶点)和交点的区域作为输出。限定“t.name.eq(“E”)和s.intersection(t,u,v)和is-square(u)和v.gt(5)和.is-suqare(w)和w.size(x)和x.gt(10)”包括由逻辑连接符“and”连接的几种条件。条件“is-square”应用到一组顶点,确定顶点的集合是否形成正方形。
改善的对象相关语言在某些方面类似于ANSI SQL-99。例如,查询3可写成SQL-99的形式:
Select s.show()
From t abc,s abc,r abc
Where t,name=“C”and r.name=“E”and t.contains(s) and notr.intersect(s) and s.size() >5.
但是,改进的对象相关语言比ANSI SQL-99有许多优点,例如,查询B4在SQL-99中不能重写。与改进的对象相关语言相比,ANSI SQL-99只允许“范围”型变量,不允许集,元组,临时,临时集或临时元组变量。在SQL-99下,变量范围是由其“范围”类型确定的,且不能是任意数据源单元。此外,SQL-99下的条件不能产生任何不同于逻辑真或假值的值,所以,通用方法不能用作条件或变元。改进的对象相关语言没有了这些限制。
改进的对象相关查询语言可表示成如下形式:
variable specifier
…
variable specifier
[On event][if qualification then]command[else command2].
Or
variable specifier
…
variable specifier
[On event][if qualification 1 then]qualification2
在第二种形式中表示的规则“[On event][if qualification1 then]qualification2”等效于第一种形式的规则“[On event][if qualification then]command[else command2]”。但是,第二种形式在某些情况对用户更友好,例如,第二种形式的下列规则:
If the patient has prescription x then the patient cannot have prescriptiony等效于第一种形式的规则:
If the patient has prescription x and the patient has prescription y thenreport(“constraint violation”)
可选择地,规则也包括标记,它用来识别规则,一个或多个输入参数和一个或多个输出参数。输入参数是其值用在规则限定中的值。输出参数是其值由规则的指令或条件计算返回的值。在改进的对象相关查询语言中宏指令可表示成如下形式:
[On event:][Object Type]Macro Macro-Name ([parameter],…[parameter])
global Variable specifier
…
global variable specifier
[label1:]rule/query1;
…
[label2:]rule/query2;
在上述例中,“objecttype”涉及可选返回值的数据类型。“parameter”涉及宏指令的输入或输出参数。“label1”代表标号,它识别规则或查询,“rule/query1”,“label2”代表识别规则或查询“rule/query2”的标号。事件可以是附加的新对象,对象的删除或修改,或用户定义的事件。由标号识别的规则或查询可被有“goto”陈述的其它规则或查询调用。
C.对象相关代数
对象相关代数优先具有如下特点:
1.DSE是对象相关表达式(此后“表达式”用在C节中)
2.表达式是“类型约束”的,如果表达式的所有单元具有同样的非原语型的话。另外它是“无类型”的。无类型表达式代表像平面文件或一组记录的关系,其字段是原语值,如整数,浮点数和文本串。
3.如果E是类型的约束表达式,那么σP(E)是约束类型表达式,其中P是限定。操作符σ(称为“选择”操作符)返回E中满足P的结果对象。P可包括与表达式类型有关的条件,与表达式对象的属性有关的条件,或两者。如果E是无类型表达式,那么σP(E)是无类型表达式,其中P是限定。操作符σ(称为“选择”操作符)作为结果返回E中满足P的对象。
4.如果E是表式,那么IIS(E)是无类型表达式,其中S是属性集。操作符II(称为“项目”操作符且来自E的项目)把满足S中指定属性的E对象从每个E对象中移走,并作为结果返回不满足S中指定属性的其它E对象。在极少情况下,IIS(E)可以是类型约束表达式
5.如果E和F是表达式,那么:
E×F是表达式。操作符(卡笛尔乘积)计算集{(x,y)|x∈E,y∈F};
E∪F是表达式,操作符(合并)计算两表达式的合并;和
E-F是表达式,操作符(差)计算两表达式之差。
6.如果E是表达式,那么SGA(E)是无类型表达式。操作符G(称为“聚合”操作符)根据S中指定的属性集(其形式为:attribute,attribute,……)把E对象聚集起来,并对每一聚集以aggregate-function(attribute)或aggregate-function(object)的形式计算聚集功能集。聚集功能可包括原语功能,如最小,最大,平均,方差,中值,和计数,它可用于一组原语值。聚集功能也能包括由用户或程序员定义的通用功能,它可用于非原语对象组。通用功能是用户或程序员定义的非原语功能,在非原语对象集上操作。例如,用户或程序员可定义“最佳图像”普通功能,来处理视觉图像文件的集合,并作为输出返回有最佳信噪比的视觉图像。当通用功能调来操作时,通用功能典型地调用程序,过程,查询。原语功能的集合,原语和通用功能的集合,或其它通用功能的集合。在极少情况下,SGA(E)可以是类型约束表达式。
7.如果f是方法或宏指令,它把DES作为其结果返回,那么f(arguments)是表达式。f(arguments)是否是无类型或类型约束的,由DSE中的单元类型确定。如果DSE的所有单元属于同一类型,且该类型不是原语的,则该表达式是类型约束的;否则是无类型的。
一些对象相关表达式的例子与对象类别“病人”和被定义的数据源单元“医院”一起表示于下面。
为检索要看轻AD病的医院病人和谁负责治疗“Aericept”,调用集S1:
S1 σP1(hospital),where P1=diagnosed(“mild AD”)andrespond_to(“Aericept”) (查询C1)
为了检索要看中度AD病的医院病人和谁负责治疗“Aericept”调用集S2
S2 σP2(hospital),where P2=diagnosed(“moderate AD”)andrespond_to(“Aericept”) (查询C2)
为了计算S1和S2的和,调用结果S:
SS1∪S2 (查询C3)
为了求S中男、女性病人的平均年龄:
genderGavg(age)(S) (查询C4)
为了提取S1中病人的基因档案,调用G1:
G1 IIgene-profile(S1) (查询C5)
为了提取S2中病人的基因档案,调用G2:
G2 IIgene-profile(S2) (查询C6)
为了比较G1和G2,并画出结果:
Compare_profile_and_plot(G1,G2) (查询G7)
查询可以以多种方法联合起来,例如,查询C1至C4可联合成一种查询,如:
genderGavg(age)(σP1(hospital)) (查询C8)
与一般的相关代数相比,对象相关代表能操作复杂的对象。在相关代数下,数据源单元是简单的相关,例如平面文件或其字段为原语值的记录。此外,如上面背景技术部分所述,“选择”操作符的条件被限于原语值的简单比较。此外,方法不允许是相关代数下的表达式。最后,一般相关代数下的聚集功能限于像最小、最大、中值、方差、和、计数等功能,它只可用于原语值。对象相关代数把这些限制取消,并提供比一般相关代数有效的优点。
虽然本发明以某些优先例的形式作为描述,业内人士明白还可有其它的实施例。此外,有其它组合、省略、替代和修改也是明显的。例如,结构化自然语言查询系统100的模块可联合起来或分成或多或少的模块,流程图中的某些行为可平行执行、依次执行或不同次序执行。因此,本发明并不限于所描述的实施例,而取决于权利要求书的内容。
下表列出了本系统的一个实施例中某些样本方法。应理解,它不是本发明系统中所需的所有方法,并可以定义附加的方法,
系统提供的方法
样本逻辑方法
方法名 |
变元 |
返回值 |
注释 |
Gt |
(第一变元:单第二变元:单) | 布尔 |
如果单一类型且第一变元>第二变元,返回真 |
Ge |
(第一变元:单第二变元:单) | 布尔 |
如果单一类型且第一变元≥第二变元,返回真 |
Lt |
(第一变元:单第二变元:单) | 布尔 |
如果单一类型且第一变元<第二变元,返回真 |
Le |
(第一变元:单第二变元:单) | 布尔 |
如果单一类型且第一变元≤第二变元,返回真 |
Eq |
(第一变元:单第二变元:单) | 布尔 |
如果单一类型且第一变元=第二变元,返回真 |
Ne |
(第一变元:单第二变元:单) | 布尔 |
如果单一类型且第一变元!=第二变元,返回真 |
Gt |
(第一变元:整数第二变元:整数) | 布尔 |
如果整数类型且第一变元>第二变元,返回真 |
Ge |
(第一变元:整数第二变元:整数) | 布尔 |
如果整数类型且第一变元≥第二变元,返回真 |
Lt |
(第一变元:整数第二变元:整数) | 布尔 |
如果整数类型且第一变元<第二变元,返回真 |
Le |
(第一变元:整数第二变元:整数) | 布尔 |
如果整数类型且第一变元≤第二变元,返回真 |
Eq |
(第一变元:整数第二变元:整数) | 布尔 |
如果整数类型且第一变元=第二变元,返回真 |
Ne |
(第一变元:整数第二变元:整数) | 布尔 |
如果整数类型且第一变元!=第二变元,返回真 |
Gt |
(第一变元:串第二变元:串) | 布尔 |
如果第一变元比(第二变元)比较结果大于0,则返回真比较结果是Java数据串类的方法 |
Ge |
(第一变元:串第二变元:串) | 布尔 |
如果第一变元比(第二变元)比较结果大于0,则返回真比较结果是Java数据串类的方法 |
Lt |
(第一变元:串第二变元:串) | 布尔 |
如果第一变元比(第二变元)比较结果大于0,则返回真比较结果是Java数据串类的方法 |
Le |
(第一变元:串第二变元:串) | 布尔 |
如果第一变元比(第二变元)比较结果大于0,则返回真比较结果是Java数据串类的方法 |
Eq |
(第一变元:串第二变元:串) | 布尔 |
如果数据串型且第一变元和第二变元相同,返回真 |
Ne |
(第一变元:串第二变元:串) | 布尔 |
如果数据串型且第一变元和第二变元不同,返回真 |
样本通用方法
方法名 |
参数 |
返回 |
注释 |
as |
(第一变元:单s第二变元:单s) | 布尔 |
如果单一类型,且第一变元赋于第二变元,返回真 |
add |
(第一变元:单s第二变元:单s第三变元:单s) | 布尔 |
对于单一类型,把第一和第二变元相加,将该值代入第三变元,返回真 |
sub |
(第一变元:单s第二变元:单s第三变元:单s) | 布尔 |
对于单一类型,从第一变元减去第二变元,将该值代入第三变元,返回真 |
mult |
(第一变元:单s第二变元:单s第三变元:单s) | 布尔 |
对于单一类型,把第一变元与第二变元相乘,将该值代入第三变元,返回真 |
div |
(第一变元:单s第二变元:单s第三变元:单s) | 布尔 |
对于单一类型,把第一变元与第二变元相除,将该值代入第三变元,返回真 |
as |
(第一变元:整数i,第二变元:整数I) | 布尔 |
如果整数类型且第一变元赋于第二变元,返回真 |
add |
(第一变元:整数i第二变元:整数i第三变元:整数I) | 布尔 |
对于整数型,把第一变元与第二变元相加,将该值代入第三变元,返回真 |
sub |
(第一变元:整数I第二变元:整数i第三变元:整数I) | 布尔 |
对于整数型,把第一变元减去第二变元,将该值代入第三变元,返回真 |
mult |
(第一变元:整数I第二变元:整数i第三变元:整数I) | 布尔 |
对于整数型,把第一变元与第二变元相乘,将该值代入第三变元,返回真 |
div |
(第一变元:整数i第二变元:整数i第三变元:整数i) | 布尔 |
对于整数型,第一变元被第二变元除,将该值代入第三变元,返回真 |
as |
(第一变元:数据串s, |
布尔 |
如果数据串型,且第一变元 |
|
第二变元:数据串s) | |
赋于第二变元,返回真 |
max |
(第一变元:数据源单元DSE,第二变元:数据串字段名,第三变元:单结果) | 布尔 |
对于整数型,第一变元数据源单元,和第二变元数据串(指定的字段名),置最大值于结果,返回真 |
max |
(第一变元:数据源单元dse,第二变元数据串字段名,第三变元:整数结果) | 布尔 |
对于整数型,第一变元数据源单元,和第二变元数据串(指定的字段名),置最大值于结果,返回真 |
min |
(第一变元:数据源单元dse,第二变元:数据串字段名,第三变元:整数结果) | 布尔 |
对于单类型,第一变元数据源单元,和第二变元数据串(指定的字段名),置最小值于结果,返回真 |
min |
(第一变元:数据源单元dse,第二变元:数据串字段名,第三变元:整数结果) | 布尔 |
对于整数型,第一变元数据源单元,和第二变元数据串(指定的字段名),置最小值于结果,返回真 |
avg |
(第一变元:数据源单元dse,第二变元:数据串字段名,第三变元:单结果) | 布尔 |
对于单类型,第一变元数据源单元,和第二变元数据串(指定的字段名),置平均值于结果,返回真 |
count |
(第一变元:数据源单元dse,第二变元:整数结果) | 布尔 |
对于整数型,第一变元数据源单元,和第二变元数据串(指定的字段名),置计数值于结果,返回真 |
union |
(第一变元:数据源单元dse,第二变元:数据源单元dse) |
数据源单元 |
使用第一变元数据源单元和第二变元数据源单元设置值并返回到数据源单元 |
Unionall |
(第一变元:数据源单元dse, |
数据源单元 |
使用第一变元数据源单元和第二变元数据源单元设置值 |
|
第二变元:数据源单元dse) | |
并返回数据源单元 |
dereference |
(第一变元:数据源单元dse,第二变元:数据源单元dse) | 数据源单元 |
使用第一变元数据源单元和第二变元数据源单元设置值并返回数据源单元 |
关于日期的样本逻辑方法
方法名 |
参数 |
返回值 |
注释 |
Before | (第一变元:发生日期) | 布尔 |
只有当时间点在发生对象的时间点之前,返回真 |
After | (第一变元:发生日期) | 布尔 |
只有当时间点在发生对象的时间点之后,返回真 |
附加的样本方法
方法名 |
参数 |
返回值 |
注释 |
isNull |
无 |
布尔 |
如果零,返回真 |
cast |
(第一变元:(原语数据型dt) | 布尔 |
为原语数据型值时,返回真 |
gt |
(第一变元:整数或[数据串,整数,短整型,长整型单数,实数]) | 布尔 | 如果值>第一变元,返回真 |
ge |
(第一变元:整数或[数据串,整数,短整型,长整型单数,实数]) | 布尔 | 如果值≥第一变元,返回真 |
lt |
(第一变元:整数或[数据串,整数,短整型,长整型单数,实 | 布尔 |
如果值<第一变元,返回真 |
|
数]) | | |
1e |
(第一变元:整数或[数据串,整数,短整型,长整型单数,实数]) | 布尔 | 如果值≤第一变元,返回真 |
eq |
(第一变元:整数或[数据串,整数,短整型,长整型单数,实数]) | 布尔 | 如果值=第一变元,返回真 |
ne |
(第一变元:整数或[数据串,整数,短整型,长整型单数,实数]) | 布尔 | 如果值!=第一变元值,返回真 |
as |
(第一变元:整数或[数据串,整数,短整型,长整型单数,实数]) | 布尔 | 赋于第一变元值并返回真 |
add |
(第一变元:整数或[串,整数,短整型,长整型单数,实数]第二变元:整数或[串,短整型,长整型,单数,实数]) | 布尔 | 把第一变元与第二变元相加其值代入第二变元,返回真 |
sub |
(第一变元:整数或[短整型,长整型,单数,实数],第二变元:整数或[短整型,长整型,单数,实数]) | 布尔 | 从第一变元减去其值,把该值代入第二变元,反回真 |
mult |
(第一变元:整数或 |
布尔 |
该值与第一变元相 |
|
[短整型,长整型,单数,实数],第二变元:整数或[短整型,长整型,单数,实数]) | |
乘,将该值代入第二变元,返回真 |
div |
(第一变元:整数或[短整型,长整型,单数,实数],第二变元:整数或[短整型,长整型,单数,实数]) | 布尔 | 该值用第一变元除,将该值代入第二变元,返回真 |
getAllMatches |
(第一变元:数据串模式) | 布尔 |
搜索变元模式作为匹配模式,返回结果的REMateh型阵列 |
getMatch |
(第一变元:数据串模式) | 布尔 |
搜索变元模型作为匹配,返回第一匹配 |
isMatch |
(第一变元:数据串模式) | 布尔 |
搜索变元模型作为匹配,如果匹配返回真 |
hasMoreElements |
(第一变元:数据串模型) | 布尔 | 正规的表达式模型 |
hasMoreMatches |
(第一变元:数据串模型) | 布尔 | 正规的表达式模型 |
ends With |
(第一变元:数据串后缀) | 布尔 |
确定是否以指定的后缀为数据串结束 |
EqualsIgnoreCase |
(第一变元:数据串另一数据串) | 布尔 |
把数据串与别的数据串比较 |
Starts With |
(第一变元:数据串后缀) | 布尔 |
确定是否从指定后缀为数据串开始。 |