执行关系数据库搜索的系统和方法

文档序号:6557445阅读:431来源:国知局
专利名称:执行关系数据库搜索的系统和方法
技术领域
本发明一般涉及电子数据库。尤其是,本发明涉及优化关系数据库系统中的查询表达式,以改善查询响应时间。
背景技术
许多组织和企业提供了计算机化的目录服务,用于定位该组织中的成员并用于获取关于这些成员的信息。典型地,雇员定位器或寻人应用程序的用户把被寻找个人的名字的一部分或其他相关信息输入到搜索字段中。然后,用户通过激活所显示的用于该目的的图形用户接口按钮来发起该搜索。应用程序然后基于用户提供的输入生成查询表达式,并将该查询提交给目录系统。在该目录系统内,该查询所寻求的信息可能存在于多个异类数据存储库(data store)(或知识库(repository))中。
运行在异类知识库上的目录系统一般提供一个应用程序接口(API),用于搜索虚拟知识库(例如,多个异类数据存储库和实例的抽象)。然而,客户应用常常要承受查询构造的复杂性。例如,客户应用可能需要使查询表达式和专有查询对象模型相一致,该专有查询对象模型难以处理并受查询构造人造物(artifact)的限制,例如无法以括号表达求值的优先顺序,或者无法指定逻辑OR运算。在这样的系统中,构建简单的查询可能涉及过多的程序代码。
此外,程序员常常需要指定在数据存储库中的位置(例如,客户应用需要知道各知识库的表及列名,必须在水平知识库间重复查询,然后针对垂直知识库指定联结条件)。这样,客户应用必须知道属性位置,发出多个查询,并手工联结由查询返回的数据。其他目录系统实现无法与异类数据存储库(例如,LDAP—轻量级目录访问协议)一起工作或支持查询结果的水平及垂直联盟(federation),并且其他系统仍旧不能提供属性的动态定义。
目录系统的实现常常包括关系数据库。关系数据库典型地把相同数据类型的属性值存储在相同的表中,并把每个值和一属性标识符关联在一起。例如,在关系数据库中,和对象相关联的串(string)属性存储在串属性表中,整数属性存储在整数属性表中,日期属性存储在日期属性表中。在每种类型的表中,属性标识符占据行。构建表模式(schema),以便属性标识符按行出现,而不是按列组织属性或为每个属性创建一个不同的表(如在某些LDAP实现中所做的),这方便了支持动态定义新属性。尽管如此,包含具有相同数据类型的属性名称的查询可能需要具有许多自联结子查询的查询表达式(即,SQL语句)。具有许多自联结子查询的SQL语句会性能很差,因为每个联结都涉及计算语句中引用的所有表的笛卡儿积。

发明内容
在一个方面,本发明包括一种用于执行关系数据库的搜索的计算机化的方法。提供了一种表示基于串的搜索表达式的表达式树。表达式树具有多个节点,包括逻辑节点。表达式树的逻辑节点具有第一子节点和第二子节点。每个子节点表示基于串的搜索表达式的子表达式。逻辑节点表示逻辑算符,其用于结合由逻辑节点的子节点所表示的子表达式。逻辑节点的第一子节点的子表达式中的属性被确定为与逻辑节点的第二子节点的子表达式中的属性相比具有相同的数据类型,并和关系数据库中相同的表相关联。
将表别名和表相关联。生成基于子节点的子表达式和逻辑节点的逻辑算符的子查询表达式。该子查询表达式是将用于查询关系数据库的知识库特定查询表达式的一部分。如果逻辑节点是一个逻辑OR算符,那么子查询表达式第一子节点的子表达式的转换中和在第二子节点的子表达式的转换中使用相同的表别名。
在另一个方面,本发明包括一种用于执行关系数据库的搜索的计算机化的系统。该系统包括分析器(parser),其从基于串的搜索表达式中产生表达式树。该表达式树具有包括逻辑节点的多个节点。该表达式树的逻辑节点具有第一子节点和第二子节点。每个子节点表示基于串的搜索表达式的子表达式。逻辑节点表示用于组合由逻辑节点的子节点所表示的子表达式的逻辑算符。
适配器接收表达式树,并确定逻辑节点的第一子节点的子表达式中的属性与逻辑节点的第二子节点的子表达式中的属性相比具有相同的数据类型,并和相同的关系数据库中的相同的表相关联。适配器将表别名与表相关联,并基于子节点的子表达式和逻辑节点的逻辑算符生成子查询表达式。该子查询表达式是将用于查询关系数据库的知识库特定查询表达式的一部分。如果逻辑节点是逻辑OR算符,那么子查询表达式在第一子节点的子表达式的转换中和在第二子节点的子表达式的转换中使用相同的表别名。
在另一方面,本发明包括一种和计算机系统一起使用的计算机程序产品。该计算机程序产品包括已包含有程序代码的计算机可用介质。该程序代码包括用于提供表示基于串的搜索表达式的表达式树的程序代码。该表达式树具有包括逻辑节点的多个节点。该表达式树的逻辑节点具有第一子节点和第二子节点。每个子节点表示基于串的搜索表达式的子表达式。逻辑节点表示用于组合由逻辑节点的子节点所表示的子表达式的逻辑算符。
还包括用于确定逻辑节点的第一子节点的子表达式中的属性与逻辑节点的第二子节点的子表达式中的属性相比具有相同的数据类型、并和关系数据库中相同的表相关联的程序代码,用于和将表别名和表相关联的程序代码,以及用于基于子节点的子表达式和逻辑节点的逻辑算符来生成子查询表达式的程序代码。该子查询表达式是将用于查询关系数据库的知识库特定查询表达式的一部分。如果逻辑节点是逻辑OR算符,那么子查询表达式在第一子节点的子表达式的转换中和在第二子节点的子表达式的转换中使用相同的表别名。
在另一方面,本发明包括一种包含在和计算机系统一起使用的载波中的计算机数据信号,该计算机系统具有显示器并能生成用户接口,用户可以通过该接口和计算机系统相交互。计算机数据信号包括用于提供表示基于串的搜索表达式的表达式树的程序代码。该表达式树具有包括逻辑节点的多个节点。该表达式树的逻辑节点具有第一子节点和第二子节点。每个子节点表示基于串的搜索表达式的子表达式。逻辑节点表示用于组合由逻辑节点的子节点所表示的子表达式的逻辑算符。
还包括用于确定逻辑节点的第一子节点的子表达式中的属性与逻辑节点的笫二子节点的子表达式中的属性相比具有相同的数据类型、并和关系数据库中相同的表相关联的程序代码,用于将表别名和表相关联的程序代码,以及用于基于子节点的子表达式和逻辑节点的逻辑算符来生成子查询表达式的程序代码。该子查询表达式是将用于查询关系数据库的知识库特定查询表达式的一部分。如果逻辑节点是逻辑OR算符,那么子查询表达式在第一子节点的子表达式的转换中和在第二子节点的子表达式的转换中使用相同的表别名。


通过结合附图参照下列描述,可以更好地理解本发明的上述优点及更多优点,其中,相同的数字在不同附图中表示相同的结构元件和特征。附图不必是按比例的,而是把重点放在描述本发明的原理上。
图1是体现用于在异类数据存储库间生成和分配基于串的搜索表达式的本发明的系统的方块图。
图2A是示出企业范围轻量级目录访问协议(LDAP)成员全体(membership)层级结构示例的图示。
图2B是示出包括来自企业范围LDAP成员全体的子集的成员和来自关系数据库系统的成员的虚拟成员全体示例的图示。
图3是示出在构建虚拟成员全体中系统所使用的部件的实施例的图示。
图4是通过合并从异类数据存储库中获得的水平划分数据和垂直划分数据而产生的成员集合的例子。
图5A是根据本发明用于生成基于串的搜索表达式的查询生成器的实施例的方块图。
图5B是用于从用户提供的输入生成基于串的搜索表达式的过程的实施例的流程图。
图6A是用于解释搜索表达式、把搜索表达式转换成知识库特定表达式、把知识库特定表达式分配给适当知识库、以及合并搜索结果的实施例的方块图。
图6B是由搜索表达式处理器产生的表达式树的实施例的图示。
图6C是用于处理搜索表达式以产生用于执行搜索的表达式树的过程的实施例的流程图。
图7是用来描述把表达式树转换成用于搜索关系数据库的查询表达式的过程的表达式树的实施例。
图8是关系数据库中的一组表的示例。
图9A、图9B和图9C是用于转换图7的表达式树的转换过程的实施例的流程图。
图10是表达式树的另一个实施例,其用来描述当把表达式树转换成用于搜索关系数据库的查询表达式时,逻辑OR节点下表达式间表别名的重用和逻辑AND节点间新表别名的使用。
图11是在执行搜索中由表达式树执行的过程的实施例的流程图。
具体实施例方式
体现本发明的系统和方法可以基于用户提供的输入的词法结构,生成基于串的搜索表达式。客户应用将用户提供的输入记号化(tokenize),并基于该输入的词法结构来选择模板。客户应用把从用户输入得出的记号(token)代入模板内的指定位置,从而产生基于串的搜索表达式。模板是易于修改的。通过修改模板,例如响应于增加或移除由异类知识库支持的属性,管理员可以动态地更改基于串的搜索表达式的内容。修改模板不需要对客户应用作任何更改。
此外,在一种实施例中,这些模板以及搜索表达式具有一种许多管理员和程序员都应认为是常见和直观的格式。这种格式,本文称其为一般查询语言或GQL,可以简化更改模板的过程。从左向右读,GQL格式的搜索表达式使用常见的布尔算符(AND和OR)和表示求值优先顺的括号中的子表达式。GQL格式的搜索表达式也易于转换成知识库特定查询表达式,例如LDAP过滤器表达式和SQL中的WHERE表达式,以用于具有多个异类知识库的搜索环境中,在这些异类知识库中,数据可被水平及垂直地划分。虽然在本文中主要参照搜索虚拟目录环境中的成员来进行描述,但是模板和搜索表达式的设计可以应用到个人可对其执行计算机化搜索的任何主题或主旨中。
此外,客户应用不必确定哪些知识库可以支持搜索表达式中的每一个属性,搜索表达式也不必标识出这些知识库的位置。应用服务器提供一个框架,其用于处理搜索表达式并确定哪些知识库可以支持搜索表达式中的属性。分析器基于搜索表达式构建表达式树,并通过调用表达式树的根结点发起搜索。表达式树将搜索表达式的相关部分发出给知识库适配器,适配器把这些部分转换成知识库特定查询表达式,并将所述查询表达式提交给适宜的知识库。
一种这样的知识库适配器把表示搜索表达式的表达式树转换成用于搜索关系数据库的SQL查询表达式。该知识库适配器采用比简易的(unsophisticated)转换方法产生具有更少的自联结的查询表达式的转换过程。具有较少的自联结可以改善搜索性能(例如,响应时间)。一般而言,每当两个表别名引用关系数据库中相同的物理表时,子查询表达式(在产生的查询表达式中)就执行自联结。每个联结都涉及计算子查询表达式中引用的所有表的笛卡儿积。即使一些表别名可能引用相同的物理表,但是对该计算而言,这些表别名被视为是不同的。通过减少出现在查询表达式中的表别名的数量,该转换过程减少了自联结的数量。这种自联结数量的减少可以减小用于计算笛卡儿积的表的集合,从而减少了整个处理时间以及中间结果的数量。
为了降低表别名的数量,该转换过程避免使用多个表别名来转换出现在表达式树中的逻辑OR结点。一般而言,较简易的转换方法不会认识到在逻辑OR结点之下涉及特定类型的表达式间可以重用表别名。因此,出现在产生的查询表达式中的任何自联结可归因于表达式树中的逻辑AND结点,而不归因于逻辑OR结点。使用该转换过程,搜索表达式到SQL查询表达式的全部转换发生在表达式树的单次递归下降遍历中。应用一种统计(accounting)算法来确保使表别名的数量最小。
联盟结点(如果在表达式树内存在任何联盟节点的话)可以合并从被水平及垂直划分的知识库中获得的搜索结果。有利的是,对该框架的任何更改不会影响客户应用可生成基于串的搜索表达式的方式(即,如果系统框架更改,不必重新编译客户应用)。
图1示出了用于生成基于串的搜索表达式并将其分配给一组异类数据存储库的系统10的实施例。系统10包括一个经由网络22(例如,LAN,WAN)和应用服务器18通信的Web客户应用14。在一种实施例中,该Web客户应用14是一个提供名称搜索功能的应用,例如,该客户应用使用户能搜索组织(或企业)中的个人,并查看关于这些个人的详细信息,例如,他们的名称、电话号码、职位。系统管理员可以定制客户应用14的操作,以把搜索结果以多种定制视图例如个人记录和组织图中的一种视图形式呈现给搜索者。Web客户应用14的该实施例的示例性实现是LotusWorkplace People Finder,其由位于马萨诸塞州的Cambridge的IBM/Lotus公司生产。在其他实施例中,Web客户应用14可以提供一种除名称搜索功能以外的、不同类型的搜索功能,例如,搜索股票报价、地址位置、就餐设施等,而不脱离本发明的原理。
Web客户应用14在一计算设备16上执行,该计算设备具有处理器、用户接口、显示屏、输入设备(例如,键盘、鼠标、跟踪球、触摸板、触摸屏等)、以及用于存储数据和软件程序的持久存储器。客户计算设备16的示例性实现包括、但不限于个人计算机(PC)、苹果计算机、工作站、膝上型计算机、诸如个人数字助理(PDA)和蜂窝式电话的手持设备、网络终端、以及诸如索尼的PLAYSTATIONTM的在线游戏设备。
应用服务器18包括Web服务器24,即一种能够服务于经由网络22从Web客户应用14接收到的超文本传输协议(HTTP)请求的软件程序。在一种实施例中,应用服务器18是Java2平台企业版(J2EE)应用服务器。J2EE平台的核心组件是在EJB容器28中维护的企业JavaBeans(EJBs)。应用服务器18可用于部署、集成、执行以及管理各种电子商务应用。该应用服务器18的一种示例性实现是由IBM公司生产的Websphere应用服务器。
EJB容器28中的一种企业java bean是成员管理器企业java bean32(以下称为成员管理器)。成员管理器32是应用服务器18的一个组件,其产生由客户应用14使用的用于人、组、组织以及组织单元的属性的通用模式,并执行目录查找和成员管理。Web服务器24和成员管理器32通信,以便在响应于例如HTTP请求将内容返回到Web客户应用14时进行协作。本文描述的成员管理器32用来描述本发明的特定实施例。涉及访问和搜索异类知识库的其他类型的应用也可以被设计为实现本发明。
成员管理器32包括用于认证过程的安全性软件36、轻量级目录访问协议(LDAP)适配器40、关系数据库(DB)适配器44、以及后备(LA)适配器48。每个适配器40、44、48和特定的数据存储库即诸如数据库系统、文件、或目录等存储数据的地方相关联。每个适配器被配置为把由客户应用14产生的搜索表达式转换成与该适配器相关联的知识库理解的知识库特定查询表达式。一般来说,适配器和知识库通信,以便把查询表达式提交给知识库以及接收作为响应的搜索结果。尤其是,LDAP适配器40和LDAP知识库56相通信,DB适配器44和RDB(DB)知识库60相通信,以及LA适配器48和后备(LA)知识库64相通信。
LDAP、DB和LA知识库包括一组可用于成员管理器32以便执行目录搜索和成员管理的异类知识库54。LDAP知识库56的示例性实现包括IBM SecureWay目录、Lotus Domino目录服务以及Microsoft活动目录。例如,DB知识库60可以实现例如为IBM DB2通用数据库或Oracle关系数据库。例如,LA知识库64可以实现为例如平面文件或关系数据库来。虽然图1仅示出了一个LA知识库,但是可以使用多个后备知识库。
不同知识库56、60、64组合在一起来提供虚拟知识库,该虚拟知识库包括可在知识库54集合中找到的成员的虚拟层级结构。虽然在本文中被描述为包括异类知识库,但是该虚拟知识库不必拥有不同类型的知识库。作为示例,虚拟知识库可以不是包括三种不同类型的知识库(即,LDAP56、DB60和LA64知识库),而是包括一个或多个RDB知识库。虽然如此,将虚拟知识库描述为配置有异类知识库可用来表明能够在不同类型的知识库上分配查询的优点。
成员管理器32产生成员的该虚拟层级结构。在一种实施例中,该虚拟层级结构,亦称为虚拟成员全体52,是LDAP知识库56中的成员和DB知识库60中的成员的组合。例如,图2A示出了包括节点82(仅标出了一部分节点)的企业范围LDAP成员层级结构80。一个级别的节点82’表示地理办事处(例如美国办事处、欧洲办事处,亚洲办事处),较低级别的节点82”表示每个地理部内的部门(例如人力资源、法律部、公司部),以及叶子节点82可表示这些部门的特定成员。
由成员管理器32产生的虚拟成员全体52是LDAP知识库56和DB知识库60中的成员的组合。LDAP知识库56可以支持企业范围LDAP成员层级结构80的全部节点82或节点82的真子集。一般而言,DB知识库60可以包含不存在于LDAP知识库56中(以及,很可能和LDAP知识库有某些成员重合)的、组织的成员。图2B示出了一种过度简化的虚拟成员全体52的示例实施例,该虚拟成员全体52包括企业范围LDAP成员全体80的子集84和来自DB知识库60的附加成员节点86的组合。LDAP和DB知识库都能支持多个诸如成员、组织以及组之类的对象。
图3示出了在生成虚拟成员全体/目录系统52时由成员管理器32使用的各种部件。在操作期间,成员管理器32访问配置文件100(例如,XML或扩展标记语言)。该配置文件100用来识别在开发虚拟成员全体/目录系统中成员管理器32所调用的知识库适配器。配置文件100包括一个或多个指向其他配置文件104、108、112的指针。这些其他配置文件中的每一个都和知识库适配器之一相关联。这里,例如配置文件104和LDAP适配器40相关联,配置文件108和DB适配器44相关联,以及配置文件112和LA适配器48相关联。配置文件104、108、112包括用于构建虚拟成员全体52的信息,例如由每个适配器支持的诸如成员层级结构、节点和对象类型等属性的标识。例如,参照图2B的虚拟成员全体52,LDAP配置文件104将节点82-1、82-2,82-3标识为虚拟成员全体的一部分,而DB配置文件108将节点86标识为虚拟成员全体的一部分。
配置文件104、108和112也指示哪些属性由各知识库所支持,从而提供了一种用于在被提供了搜索表达式中特定属性时,识别要被访问的知识库的手段。一般而言,LDAP和DB知识库支持一组共有属性。存储在LDAP和DB知识库中的数据可以被认为被水平划分成不相交的行集合,这些行集合能够单独地被存储和访问。
LA知识库60提供一种可以把新属性即那些在LDAP和DB知识库中没有的属性添加到虚拟成员全体52中的成员简档、而不必更改LDAP或DB知识库的模式的装置。存储在LA知识库60中的数据可以被认为是被垂直划分成不相交的列集合,这些列集合可以单独地被存储和访问。因此,通过并入一个或多个支持新属性的LA知识库,所述新属性可以即兴(adhoc)被添加到成员简档中。通过把配置文件和新的LA知识库相关联以及在配置文件100中插入一个指向该配置文件的指针,可以把该新的LA知识库“插入”到系统中。
图4示出了一个成员集合120的例子,该成员集合包括虚拟成员全体52的四个示例性成员。该成员集合120包括在异类知识库56、60和64间收集到的数据。成员124和128位于LDAP知识库56中,成员132和136位于DB知识库中。由这些知识库56、60中的每一个知识库所支持的属性包括姓(sn)、名(givenname)以及工作电话号码。任何成员都可能在其简档内拥有建筑代码(building code)。该属性由LA知识库64所包容(host)。这里,仅成员124和132具有等于5的相关建筑代码。
图5A示出了查询生成器150,该生成器包括扫描器154、表达式生成器158和多个模板162。一般而言,查询生成器150接收典型地地由用户提供的搜索输入168,并基于搜索输入168的词法结构产生搜索表达式170。在一种实施例中,该查询生成器150在客户计算装置16上执行。在另一种实施例中,查询生成器150在应用服务器18上执行(即,通过网络22传递用户提供输入168而不是基于串的搜索表达式)。
搜索输入168的内容取决于部署在应用服务器18上的搜索系统的类型。例如,对于虚拟成员全体/目录系统来说,搜索输入168典型地包括名、姓、位置信息或其组合,这些信息是搜索者认为对于在由成员管理器32(图1)提供的虚拟目录系统中找出一个或多个成员有用的。搜索输入168可以包括名字的不完整部分、通配符和某些标点符号。例如,对于股票价格和分析系统,搜索输入的内容一般涉及与股票相关的术语。
由查询生成器150产生的搜索表达式170具有基于串的格式。在一种实施例中,该格式被称为LDAP过滤器表达式格式。在一种优选实施例中,该格式是一般查询语言(GQL)表达式格式。当把搜索表达式170传递给成员管理器32时,搜索表达式170可以嵌入到查询(例如,用于搜索的调用、命令或请求)中。在一种实施例中,该查询包括如以下示例性代码所描述的内容//设定返回属性并进行对搜索的调用
StringSet returnAttrs=StringSet.Factory.getInstance(3);ReturnAttrs.add(“givenname”);//第1返回属性的例子ReturnAttrs.add(“sn”);//第2返回属性的例子ReturnAttrs.add(“buildingcode”);//第3返回属性的例子MemberSet ms=memberService.search(MemberServiceConstants.MEMBER_TYPE_PERSON,searchbases,searchexpression,StringSetreturnAttrs,searchTimeOut,maxSearchResults);在该查询表达式中,变量“searchexpression”表示传入的搜索表达式170,例如,“(givenname=Keats)OR(sn=Keats)AND(buildingcode=5)”—这是一GQL搜索表达式。搜索表达式中的搜索属性(亦称为查询属性)是“givenname”、“sn”和“buildingcode”。在该查询表达式中,返回属性(returnAttrs)和搜索属性相同,即“givenname”、“sn”和“buildingcode”。一般而言,搜索属性用于限制从知识库返回的对象(例如,成员)集合,而返回属性定义了关于每个被寻找的对象的信息。两种类型的属性实质上都是和知识库内的对象相关联的字段。返回属性和搜索属性可以有零、一或多个共有的属性。通过在层级结构中提供一个开始搜索的点,searchbases变量用来限定搜索范围。MemberType标识搜索中找到的信息的类型,例如,人、团体、组织、组织单元等。
为了接收和处理这种类型的查询表达式,成员管理器32使相应的数据类型可用(即作为API的一部分)MemberSet search(short memberType,SearchCriteria searchCriteria,StringSet resultAttributes,intsearchTimeOut,int maxSearchResults)。当搜索表达式属性和返回属性(returnAttrs)横跨水平和垂直划分的知识库,系统联合(federate)由这些知识库返回的结果。
在一种实施例中,当搜索异类知识库54(图1)的集合时,成员管理器32(图1)能够处理用于生成知识库特定查询表达式的任一种格式。成员管理器32处理LDAP过滤器表达式格式的搜索表达式的能力使客户应用能使用遗留LDAP过滤器表达式来与目录搜索系统一起工作。
GQL格式为搜索表达式提供了知识库中性的形式。GQL搜索表达式中的属性、算符和值以中缀表示法表示。括号可以出现在搜索表达式中,来指示求值的优先顺序。在一种实施例中,GQL搜索表达式一般具有(属性名称OPERATOR值)BOOLEAN OPERATOR(属性名称OPERATOR值)这样的形式。所支持的布尔算符包括AND和OR。本文所描述的原理可以扩展到其他类型的算符。
为了产生搜索表达式170,表达式生成器158和扫描器154通信,以接收从输入串168中得出的记号。表达式生成器158亦和模板162通信,以选择在构建搜索表达式170时使用的模板之一。每个模板162和用户提供输入的不同、有效的结构相关联,并提供适用于该输入结构的模板表达式。如果词法结构不和任何模板162相一致,那么模板162中的一个可以是缺省模板。对于搜索表达式170将具有GQL格式的实施例来说,模板162提供了知识库中性的(即GQL)模板表达式。
例如,考虑下列三个示例性模板。本文中,逗号(“,”)是(用户可定义的和用户可修改的)特殊分隔符(specDel),其在解释用户输入的结构时被考虑。可以使用诸如分号和冒号之类的其他特殊分隔符。另外,特殊分隔符可以包括不止一个字符。在一种实施例中,用户输入流中的记号可以包括由空格和/或特殊分隔符分隔的字母数字式文本。
事例0一个字(即记号)模板(例如,”Keats”)为具有“记号”的一般序列的输入选择模板0Template 0 expression=((cn=?0*)OR(givenName=?0*)OR(sn=?0*)OR(displayName=?0*))事例1两个字(记号)模板(例如,”John Keats”)为具有“记号记号”的一般序列的输入选择模板1Template 1 expression=((cn=?0*?1*)OR(cn=?1*?0*)OR(givenName=?0?1*)OR(sn=?0?1*)OR(givenName=?0*)AND(sn=?1*))OR((givenName=?1*)AND(sn=?0*))OR(displayName=?0*?1*))
事例2两个字(记号)、一个逗号(特殊分隔符)模板(例如,“Keats,John”)为具有“记号,记号”的一般序列的输入选择模板2—在该示例中,用户指定特殊分隔符是逗号Template 2 expression=((cn=?0*?1*)OR(cn=?1*?0*)OR(givenName=?1*?0)OR(sn=?1*?0)OR((givenName=?1*)AND(sn=?0))OR(displayName=?0*?1*)) 应理解的是,对于给定的名字搜索系统来说,可以定义少于或多于这三个模板。此外,和每个模板相关联的特定模板表达式可以不同于所描述的那些表达式。模板和模板表达式的各方面是用户可指定的和用户可修改的。这些方面包括使用户能够指定(1)模板表达式中的特定属性、算符和求值优先顺序,(2)如何记号化用户输入流,包括是否使用以及使用哪些特殊分隔符和空格来分隔记号,(3)可能包括一个或多个特殊分隔符或空格的记号序列如何映射到特定模板,以及(4)如何在选定模板的模板表达式中替换记号。因此,用户可以(动态)修改这些方面中的一个或组合,以更改为给定的用户提供的输入而生成的基于串的搜索表达式。
例如,系统可以在管理员可以用字处理器程序编辑的文件中维护模板162。作为替代,模板162也可以在分离的文件中,每个文件同样都是可修改的。或者,系统可以以另一种文件格式维护模板162,即不一定通过字处理器进行修改,但可通过图形用户接口进行访问。因此,如果管理员想要改变一个或多个模板表达式,例如增加新属性或把模板表达式中的属性名称和知识库中使用的属性名称进行匹配,则更改模板表达式不需要客户应用的任何重编译,也不需要对搜索标准对象(search criteria object)的复杂理解。一般而言,管理员和程序员很可能熟悉或可容易理解GQL表达式的直观的中缀表示法,并可以容易地增加、移除或更改属性、算符、Boolean算符以及带括号的表达式。
对于其中搜索表达式170具有LDAP过滤器表达式格式的实施例来说,模板162提供知识库特定(即LDAP)模板表达式。LDAP过滤器表达式具有前缀表示法并使用指定符号例如“&”和“|”来表示布尔操作。因此,对于更改模板的目的,对于管理员来说,LDAP过滤器表达式格式的模板表达式比GQL表达式更不直观。尽管如此,熟悉LDAP过滤器表示的管理员可以向模板表达式增加、移除或更改属性、算符、布尔算符以及括号。
一个称为位置透明性的优点是,维护和修改模板的管理员和开发查询生成器150的代码的程序员不必知道哪些知识库实际上支持各种搜索和返回属性。因此客户应用14可以调用查询操作和传递搜索表达式,而不必预知哪些知识库可以支持查询表达式中所指定的返回属性或该搜索表达式中的搜索属性。如下面所描述的,确定哪些知识库支持搜索表达式中的返回属性和搜索属性的角色属于成员管理器32。
图5B示出了用于生成搜索表达式的过程180的实施例。在过程180的描述中,也参照图5A。在步骤184,扫描器154接收并分析用户提供的输入168,以基于输入168产生记号166。在步骤188,确定用户提供的输入的词法结构(即,计数记号的数量,识别出用户输入中的任何特殊分隔符的位置)。记号166传递给表达式生成器158,该表达式生成器基于输入168的词法结构选择(步骤192)模板162之一。表达式生成器158把记号代入(步骤196)选定模板中的适当位置,以产生基于串的搜索表达式170。例如,考虑用户提供的输入“Keats,John”。从这个输入中,扫描器154产生两个记号(1)“Keats”;以及(2)“John”,并识别出这两个记号间的特殊分隔符(这里是逗号)的位置。关于上面所描述的三个示例性模板,表达式生成器158选择两个记号、一个逗号的模板(事例2),并通过把“John”代入用于记号#0的占位符和把“Keats”代入用于记号#1的占位符,产生下列基于串的搜索表达式搜索表达式=”((cn=John*Keats*)OR(cn=Keats*John*)OR(givenName=Keats*John)OR(sn=Keats*John)OR((givenName=Keats*)AND(sn=John))OR(displayName=John*Keats*))”,其中cn表示常用名,sn表示姓,且*表示通配符。
图6A示出了一种用于处理具有基于串的搜索表达式170的查询的查询处理器200的实施例,这里,该查询例如由查询生成器150产生。查询处理器200是成员管理器32(图1)的一个部件,并包括语法204和从语法204中得出的分析器208。
表1示出了语法204的一种实施例。
//语法Goal::=conditional_expconditional_exp::=conditional_o_expconditional_or_exp::=conditional_and_expconditional_or_exp::=conditional_or_exp OR conditional_and_expconditional_and_exp::=relational_exprelational_exp::=name op non_numeric_literalrelational_exp::=name IN In_expin_exp::=‘(‘stringLiteralList’)’stringLiteralList::=stringLiteralList‘,’STRING_LITERALstringLiteralList::=STRING_LITERALrelational_exp::=‘(‘conditional_exp‘)’non_numeric_literal::=STRING_LITERALname::=IDENTIFIERop::=LTop::=LTEQop::=GTop::=GTEQop::=EQop::=IN该示例性语法204一般接受以下格式的基于串的搜索表达式(attributeName OPERATOR value)AND/OR(attributeNameOPERATOR value)。基于串的搜索表达式中的括号指定求值的优先顺序。
在一个实施例中,分析器208是LR(1)分析器并和表达式树生成器212通信,以基于搜索表达式170产生表达式树216。
图6B示出了表达式树216的实施例,该表达式树具有多个节点220,包括根节点224、中间节点228-1,228-2,228-3,228-4(通称为228)和叶子节点232-1,232-2和232-3(通称为232)。该表达式树的例子对应于以下搜索表达式“(sn=Keats)OR(sn=Shakespeare)OR(buildingCode=5)”。在一个实施例中,中间节点包括逻辑节点和括号(paren)节点。叶子节点232对应于搜索表达式中的属性。此后,叶子节点亦称为属性节点。每个属性节点232具有和该属性节点相关联的属性元数据236。属性元数据236标识支持该属性节点属性的一个或多个特定知识库。例如,属性元数据236-1和236-2表明LDAP和DB知识库支持属性”sn”,且属性元数据236-3表明LA知识库支持属性“buildingCode”。另外,元数据可以包括属性名称映射(即,虚拟知识库的属性名称和实际知识库的属性名称之间的转换,例如“sn”到“lastName”)。由元数据表示的其他信息可包括属性类型信息,例如String、日期、整数等。
根节点224和中间节点228也都可以是联盟节点。联盟节点是具有这样的子子树(child sub-tree)的节点,所述子子树从不同知识库中获取其相关联的属性。例如,由于根节点224的左子子树从LDAP(56)和DB(60)知识库中获取其属性,而其右子子树从LA知识库64中获取其属性,因此根节点224是联盟逻辑节点。由于中间节点228-1的左子子树和右子子树从相同的一组知识库(这里是LDAP和DB)中获取其属性,因此中间逻辑节点228-1不是联盟节点。
图6C示出了一种用于基于从客户应用14接收到的搜索表达式执行搜索的过程250的实施例。在描述该过程250时,亦参照图6A。在一个实施例中,图5A的查询生成器150产生由图6A的查询处理器200所处理的搜索表达式。可通过除查询生成器150之外的其他手段提供搜索表达式。例如,用户可以把GQL搜索表达式或LDAP过滤器表达式直接提交到搜索栏作为用户提供的输入,从而排除了查询生成器从用户输入构建搜索表达式的任何需要。作为另一种实施方式,不同类型的查询生成器可以产生搜索表达式,而不用分析用户输入。
在步骤254,检查搜索表达式以确定其格式是LDAP过滤器表达式还是GQL表达式。如果搜索表达式是LDAP过滤器表达式形式,那么将搜索表达式转换(步骤258)成GQL表达式。在步骤262中,查询处理器200基于语法204创建分析器208。在步骤266,将搜索表达式传递到分析器208。分析器208也生成(步骤270)表达式树生成器212,即节点工厂,并分析(步骤274)搜索表达式以通过使用表达式树生成器212产生各种类型的节点,来产生表达式树216。
在表达式树216的生成中,分析器208确定哪些知识库支持搜索表达式中一个或多个属性。为了进行该确定,分析器208可以使用节点工厂,节点工厂通过参考从已安装的知识库配置文件中得出的信息,来确定哪些知识库包容一个或多个属性。分析器208将该知识库位置信息包括到表达式树中,作为和每个属性节点相关联的属性元数据。在步骤276,把表达式树216转换成对每种类型的知识库特定的查询表达式。例如,LDAP适配器40把表达式树转换成用于搜索LDAP知识库56的LDAP查询。作为另一种示例,RDB适配器44把表达式树转换成用于搜索关系数据库60的SQL语句。在步骤278,查询处理器250通过调用表达式树216(表达式树充当查询对象)的根节点,来发起搜索。在步骤282,表达式树216将从搜索各种知识库54产生的成员集合返回到成员管理器32。
图7示出了分析器208可从一般搜索表达式中产生的表达式树400的另一种说明性示例。该特定表达式树400被用于说明用来把一般搜索表达式转换成用于搜索关系数据库60的SQL查询表达式的转换过程276‘(图9A-9C)。该表达式树400传递到执行转换的RDB适配器44。在这个例子中,表达式树400表示下列搜索表达式((cn=Andrew*Jackson*)OR(cn=Jackson*Andrew*)OR((givenName=Andrew*)And(sn=Jackson*))OR((givenName=Jackson*)AND(sn=Andrew*)))
表达式树400包括5个逻辑节点402、404、406、408、410和6个属性节点414、416、418、420、422和424。典型地,表达式树400包括括号节点,但图7省略了这些节点以简化说明。
在图7中,属性cn、givenName和sn都是串类型。为了说明的目的,考虑把和这些串类型属性相关联的所有值和适当的属性标识符一起存储在关系数据库60中的相同的表中,该表这里被称为STRING_ATTRS。(图8示出了可以是关系数据库的一部分的表的示例性集合,包括STRING_ATTRS表。)转换成SQL涉及自联结,但如下面更详细描述的,在6个属性表达式的转换中仅使用了两个表别名(S1,S2)。一种简易的转换方法会为特定属性类型的每次出现提供一个新的表别名,且在上面的例子中,会产生6个表别名每个串类型属性节点一个。
图9A-9C示出了用于把表达式树400(及其所表示的一般搜索表达式)转换成查询表达式(在该例子中,也更具体地被称为SQL语句)的转换过程276’的实施例。所产生的SQL语句选择RDB知识库60中具有一些所请求返回属性的特定成员,例如其cn、givenName和sn属性值满足搜索表达式的成员。所产生的SQL语句的一般格式是具有内部子查询表达式(即,内部SELECT语句)的外部SELECT语句。每个SELECT语句包括FROM子句和WHERE子句。子查询表达式是一般搜索表达式的经翻译的表达式。外部SELECT语句从由子查询表达式产生的一组MEMBER_ID中返回唯一的MEMBER_ID。
在其转换的生成中,转换过程276’降低所需要的表别名的数量,并在所产生的查询表达式(即SQL语句)中应用适当的联结条件。这种转换降低了自联结的数量和所产生的笛卡儿积。因此,执行查询所需要的时间降低了。
作为简要概述,转换过程400以递归的自顶向底、从左向右的顺序遍历表达式树400,以形成负责与一般搜索表达式的语意一致的成员选择的SQL子查询表达式。当执行时,转换过程276’跟踪从关系表达式中使用的属性的数据类型中获取的所必需的表别名。当执行终止时,这些表别名出现在所产生的SQL语句的FROM和WHERE子句中。
在遍历表达式树400期间,转换过程400实际上转换属性节点和逻辑节点。一般而言,转换属性节点涉及确定属性类型,确定用于该属性类型的表名和表别名计数,以及如果适宜的话,修改查询表达式。在下面将更详细描述的称作“fromClause”缓冲器、“whereClauseJoinConditions”缓冲器和“whereClause”缓冲器的缓冲器此后代表可经受修改的SQL语句部分。称作MinMaxCount的缓冲器代表每种数据类型(例如,串属性,整数属性,日期属性)的最小、最大和当前表别名计数。
一般来说,转换逻辑节点需要1)转换左子,该左子一般是包括一个或多个属性节点以及零、一或多个逻辑节点的的子树;2)把在转换左子期间遇到的属性类型的集合存储在此后称作“LHS”的变量中;3)存储和给定属性类型的最小值、最大值以及计数相关联的当前值(在称作savedMinMaxCount缓冲器中);以及4)为在转换左子期间遇到的每个属性类型调整MinMaxCount值(由TypeCountManager过程管理)。这种调整基于逻辑节点是OR节点还是AND节点。如果逻辑节点是OR节点,那么把属性类型的最大值和计数值设定为等于最小值。如果逻辑节点是AND节点,那么增大最大值并把最小值和计数值设定为等于最大值。
转换逻辑节点进一步需要5)转换右子,该右子一般是包括一个或多个属性节点以及零、一或多个逻辑节点的的子树;6)把在转换右子期间遇到的属性类型的集合存储到称作“RHS”的局部集合中;7)生成一个包括LHS类型和RHS类型的集合(该集合被存储在TypeCountManager中);8)为这样的LHS类型将最小值、最大值和计数值恢复到其已存储的值中,所述LHS类型已使其相关联的MinMaxCount被调整,但未在RHS上遇到;9)将savedMinMaxCount和MinMaxCount—其由TypeCountManager管理—合并如下对于所存储的MinMaxCount中的每种属性类型来说,该属性类型的新的最小值是已存储的最小值和TypeCountManager最小值中的相对最小值,该属性类型的新的最大值是已存储的最大值和TypeCountManager最大值中的相对最大值,且该属性类型的新的计数是由TypeCountManager维护的计数。结果被存储为类型TypeCountManager MinMaxCount图(map)。
现在,参照图7的表达式树400,更具体地描述逻辑和属性节点的转换。在步骤450,转换过程276’初始化。在初始化期间,生成用于各类型的属性的计数器并用值(例如1)将其初始化。有单独计数器的属性类型的例子包括串、整数、日期(例如时间戳)。也生成了MinMaxCount缓冲器和属性类型缓冲器,它们初始被设置为空(例如null集合)。此外,为SQL语句的各部分生成缓冲器并进行初始化如下selectClause=”SELECT MEMBER_WMM.MEMBER_ID”;fromClause=”FROM MEMBER_WMM AS MEMBER_WMM”;whereClauseJoinConditions=”WHERE”;以及whereClause=”AND”.
在步骤452,转换过程276’递归地沿表达式树降低到最左叶子节点,即属性节点414。递归下降从根节点408开始,从逻辑节点404开始调用其左子(例如,用leftChild.genSearchString方法调用)。逻辑节点404然后调用其左子,即逻辑节点402;逻辑节点402接着调用属性节点414。
在属性节点414处,转换过程276‘把串类型增加(步骤454)到属性类型集合(即,属性类型={string}),将用于串类型的表名确定为STRING_ATTRS,将表别名S1和该表相关联,将用于该表的别名计数设定为等于1。使用当前别名计数构建表别名(例如,S对应于串,1是当前别名计数)。此外,将保持SQL语句各部分的当前状态的缓冲器更新如下(步骤456)fromClause=”FROM MEMBER_WMM AS MEMBER_WMM,STRING_ATTRS AS S1”;whereClauseJoinConditions=”WHERE(S1.MEMBER_ID=MEMBER WMM.MEMBER_D)”;以及whereClause=”AND((S1.ATTR_ID=cn AND (S1.STRING_VALLIKE‘Andrew%Jackson%’))”.
由于转换过程276’可能重用表别名,因此检查fromClause,看其是否已包括表别名“S1”。如果表别名S1当前已存在于fromClause,则不必增加它。转换属性节点414是表别名S1的第一次使用,所以把表别名S1增加到fromClause中。可以将属性ID(S1.ATTR_ID)和String值(S1.STRING_VAL)增加到搜索参数列表中,而不是将其增加到查询表达式中。在whereClause中,可以明确调用属性“cn”以简化子句的可读性,而不是列出实际属性ID值。
在步骤458中,表达式树400的遍历上升到属性节点414的父节点,即逻辑节点402。逻辑节点402是逻辑OR节点。转换过程把逻辑“OR”算符附加到(步骤460)查询表达式树的whereClause。制作属性类型集合的副本(属性类型={string}),并将其存储到局部变量LHS中(即,Ihs={string})。亦制作最小值、最大值和计数值的副本(savedMinMaxCount={[key=String[min=1,max=1,count=1]]})。由于逻辑节点402是逻辑OR节点,因此,将串类型属性的最大值和计数值设定为等于串的最小值(typeMinMaxCount={[key=String[min=1,max=1,count=1]]})。把别名计数设定为最小值确保了将为逻辑节点402的左子(属性节点414)和右子(属性节点416)产生相同的表别名(这里是S1)。
此外,清除属性类型集合(={})。然后逻辑节点402调用(步骤462)rightChild.genSearchString方法,以便于转换其右子。当开始转换右子时,保持有SQL语句的whereClause的缓冲器的状态如下whereClause=”AND((S1.ATTR_ID=cn AND(S1.STRING_VALLIKE‘Andrew%Jackson%’))OR”在这个例子中,逻辑节点402的右子的转换开始并结束于属性节点416。对于属性节点416,步骤454和456重复修改属性类型集合以等于{string};确定用于串属性的表名和别名计数;将表别名S1(属性类型是串,即S,且计数=1)和表名相关联;且相应地修改子查询表达式。将变量typeMinMaxCount设定为等于{[key=String[min=1,max=1,count=1]]}。
在属性节点416,由于表别名S1已存在于子查询表达式的fromClause和whereClauseJoinConditions缓冲器中,因此不增加表别名S1(即,这些缓冲器保持不变)。将为了可读性被示为属性cn而不是其对应的ID值的搜索参数增加到whereClause中。在转换的这个阶段,保持SQL语句的各部分的当前状态的缓冲器如下fromClause=”FROM MEMBER_WMM AS MEMBER_WMM,STRING_ATTRS AS S1”;whereClauseJoinConditions=”WHERE(S1.MEMBER_ID=MEMBER_WMM.MEMBER_ID)”;andwhereClause=”AND((S1.ATTR_ID=cn AND(S1.STRING_VALLIKE‘Andrew%Jackson%’))OR(S1.ATTR_ID=cn AND(S1.STRING_VAL LIKE‘Jackson%Andrew%’))”.
完成属性节点416的转换时,执行返回(步骤464)到逻辑节点402。将属性类型集合(={string})的副本存储在局部变量RHS(={string})中。确定RHS和LHS集合的并集,并将其存储到newLHS变量(={string})中。对于这样的LHS属性类型,将最小值、最大值和计数值恢复为所存储的值,所述LHS属性类型已使其相关联的typeMinMaxCount被调整,但在转换右子期间未遇到(typeMinMaxCount={[key=String[min=1,max=1,count=1]]})。将savedMinMaxCount和由TypeCountManager管理的MinMaxCount设置成等于相对最小值和最大值。
执行沿表达式树400从逻辑节点402到其父节点即逻辑节点404上升。逻辑节点404是逻辑OR节点。对于逻辑节点404,将逻辑“OR”算符附加到(步骤460)查询表达式的whereClause。制作属性类型集合(={string})的副本,并将其存储到局部变量LHS(={string})中。亦制作存储在typeMinMaxCount(typeMinMaxCount={[key=String[min=1,max=1,count=1]]})中的最小值、最大值和计数值的副本,并将其保存为savedMinMaxCount(这里,savedMinMaxCount={[key=String[min=1,max=1,count=1]]})。
另外,将用于串属性的最大值和计数值设置成等于用于串的最小值(typeMinMaxCount={[key=String[min=1,max=1,count=1]]})。这种调整是特定于逻辑OR节点的,并确保了在转换逻辑节点404的右子(子树)时初始使用相同的表别名(这里是S1)。将属性类型集合清空(={})。然后逻辑节点404调用(步骤462)rightChild.genSearchString方法,以便于转换其右子。当开始转换其右子时,保持SQL语句的whereClause的缓冲器状态被更新如下whereClause=”AND((S1.ATTR_ID=cn AND(S1.STRING_VALLIKE‘Andrew%Jackson%’))OR(S1.ATTR_ID=cn AND(S1.STRING_VAL LIKE‘Jackson%Andrew%’))OR”.
为了转换逻辑节点404的右子,执行沿表达式树400下降(步骤468)到其右子节点,即逻辑节点406。逻辑节点406是逻辑AND节点。由于这种遍历是第一次访问逻辑节点406,因此逻辑节点406调用(步骤470)leftChild.genSearchString方法,以便于转换其左子。
在属性节点418处开始转换左子(步骤472)。为属性节点418重复步骤454和456将串类型增加到属性类型集合(={string});将用于串类型的表名确定为STRING_ATTRS;将用于该表的别名计数设定为等于1(typeMinMaxCount={[key=String[min=1,max=1,count=1]]});且将表别名S1(属性类型是串,计数=1)和表名相关联。在这个例子中,由于表别名S1已存在于子查询表达式的fromClause和whereClauseJoinConditions缓冲器中,因此不再增加表别名S1(即,再一次地,这些缓冲器保持不变)。将搜索参数(为了可读性,被示为属性givenName,而不是其对应的ID值)增加到whereClause中。在转换的这个阶段,保持SQL语句的各部分的当前状态的缓冲器如下fromClause=”FROM MEMBER_WMM AS MEMBER_WMM,STRING_ATTRS AS S1”;whereClauseJoinConditions=”WHERE
(S1.MEMBER_ID=MEMBER_WMM.MEMBER_ID)”;andwhereClause=”AND((S1.ATTR_ID=cn AND (S1.STRING_VALLIKE‘ Andrew%Jackson%’))OR(S1.ATTR_ID=cn AND(S1.STRING_VAL LIKE‘Jackson%Andrew%’))OR((S1.ATTR_ID=givenName AND(S1.STRING_VAL LIKE‘Andrew%’))”.
表达式树400的遍历上升(步骤474)到属性节点418的父节点,即逻辑节点406。由于逻辑节点406是逻辑AND节点,因此将逻辑“AND”算符附加到(步骤476)查询表达式的whereClause中。制作属性类型集合的副本(={string}),并将其存储在称作LHS的局部变量中。亦制作最小值、最大值和计数值的副本(savedMinMaxCount={[key=String[min=1,max=1,count=1]]})。
对于逻辑AND节点来说,递增串属性的最大值,并把最小值和计数设置为等于最大值(即,typeMinMaxCount={[key=String[min=2,max=2,count=2]]})。将类型集合清空(types={})。然后逻辑节点406调用(步骤478)rightChild.genSearchString方法,以便于转换其右子。当开始转换其右子时,保持SQL语句的whereClause的缓冲器的状态进行如下更新whereClause=”AND((S1.ATTR_ID=cn AND(S1.STRING_VALLIKE‘Andrew%Jackson%’))OR(S1.ATTR_ID=cn AND(S1.STRING_VAL LIKE‘Jackson%Andrew%’))OR((S1.ATTR_ID=givenName AND(S1.STRING_VAL LIKE‘Andrew%’))AND”.
在这个例子中,逻辑节点406的右子的转换开始并结束于属性节点420。对于属性节点420,重复步骤454和456修改属性类型集合(={string});确定用于串属性的表名(STRING_ATTRS)和别名计数;将表别名S2(属性类型是串,计数=2)和表名相关联;并相应修改子查询表达式。将变量typeMinMaxCount设定为等于{[key=String[min=2,max=2,count=2]]}。在这个例子中,使用新的表别名S2。因此,把新的表别名S2增加到fromClause和whereClauseJoinConditions缓冲器中。将搜索参数(被示为属性sn)增加到whereClause中。在转换的这个阶段,保持SQL语句的各部分的当前状态的缓冲器如下fromClause=”FROM MEMBER_WMM ASMEMBER_WMM,STRING_ATTRS AS S1,STRING_ATTRS AS S2”;whereClauseJoinConditions=”WHERE(S1.MEMBER_ID=MEMBER_WMM.MEMBER_ID,S2.MEMBER_ID=MEMBER_WMM.MEMBER_ID)”;andwhereClause=”AND((S1.ATTR_ID=cn AND(S1.STRING_VALLIKE‘Andrew%Jackson%‘))OR(S1.ATTR_ID=cn AND(S1.STRING_VAL LIKE‘Jackson%Andrew%‘))OR((S1.ATTR_ID=givenName AND(S1.STRING_VAL LIKE‘Andrew%’))AND (S2.ATTR_ID=sn AND(S2.STRING_VAL LIKE‘Jackson%’)))”完成属性节点420的转换时,执行返回(步骤480)到逻辑节点406。将属性类型集合(={string})的副本存储在局部变量RHS(={string})中。确定RHS和LHS集合的并集,并将其存储到newLHS变量(={string})中。对于这样的LHS类型,将最小值、最大值和计数值恢复为所存储的值,所述LHS类型使与其相关联的MinMaxCount被调整,但在转换右子期间未遇到(typeMinMaxCount={[key=String[min=1,max=2,count=2]]})。将savedMinMaxCount和由TypeCountManager管理的MinMaxCount设置成等于相对最小值和最大值。
然后执行沿表达式树400从逻辑节点406到其父节点即逻辑节点404上升(步骤482),从而表明逻辑节点406的右子的转换完成。将属性类型集合(={string})的副本存储到局部变量RHS(={string})中。确定集合RHS和LHS的并集,并将其存储在newLHS变量(={string})中。对于这样的LHS类型,将最小值、最大值和计数值恢复为所存储的值,所述LHS类型使与其相关联的MinMaxCount被调整,但在转换右子期间未遇到(typeMinMaxCount={[key=String[min=1,max=2,count=2]]})。将savedMinMaxCount和由TypeCountManager管理的MinMaxCount设置成等于相对最小值和最大值。
从逻辑节点404,执行沿表达式树400上升(步骤484)到逻辑节点408,从而表明逻辑节点408的左子的转换完成。逻辑节点408是逻辑OR节点,且逻辑“OR”算符被附加(步骤460)到查询表达式的whereClause中。制作属性类型集合的副本(={string}),并将其存储到局部变量LHS(={string})中。亦制作存储在typeMinMaxCount(typeMinMaxCount={[key=String[min=1,max=1,count=1]]})中的最小值、最大值和计数值的副本,并将其保存为savedMinMaxCount(这里,savedMinMaxCount={[key=String[min=1,max=1,count=1]]})。
由于逻辑节点408是逻辑OR节点,因此将用于串属性的最大值和计数值设定为等于最小值(typeMinMaxCount={[key=String[min=1,max=1count=1]]})。将类型的集合清空(types={})。逻辑节点4088调用(步骤462)rightChild.genSearchString过程,以便于转换其右子。当开始转换右子时,保持有SQL语句的whereClause的缓冲器的状态进行更新如下whereClause=”AND((S1.ATTR_ID=cn AND(S1.STRING_VALLIKE‘Andrew%Jackson%‘))OR(S1.ATTR_ID=cn AND(S1.STRING_VAL LIKE‘Jackson%Andrew%‘))OR((S1.ATTR_ID=givenName AND(S1.STRING_VAL LIKE‘Andrew%’))AND(S2.ATTR_ID=sn AND(S2.STRING_VAL LIKE‘Jackson%’)))OR”为了转换逻辑节点408的右子,执行沿表达式树400下降到(步骤486)其右子节点,即逻辑节点410。逻辑节点410是逻辑AND节点。由于这是第一次访问逻辑节点410,因此,逻辑节点410调用(步骤488)leftChild.genSearchString方法,以便于转换其左子。
在属性节点422处开始转换(步骤490)左子。把串类型增加到属性类型集合(={string}),用于串类型的表名确定为STRING_ATTRS,用于该表的别名计数等于1(typeMinMaxCount={[key=String[min=1,max=1count=1]]});并且将表别名S1和表名相关联。由于表别名S1当前包括在fromClause和whereClauseJoinConditions缓冲器中,因此不再增加S1(即,这些缓冲器保持不变)。把搜索参数(givenName)增加到whereClause中。在转换的这个阶段,保持SQL语句的各部分的当前状态的缓冲器如下fromClause=”FROM MEMBER_WMM ASMEMBER_WMM,STRING_ATTRS AS S1,STRING_ATTRS AS S2”;whereClauseJoinConditions=”WHERE(S1.MEMBER_ID=MEMBER_WMM.MEMBER_ID,S2.MEMBER_ID=MEMBER_WMM.MEMBER_ID)”;andwhereClause=”AND((S1.ATTR_ID=cn AND(S1.STRING_VALLIKE‘Andrew%Jackson%‘))OR(S1.ATTR_ID=cn AND(S1.STRING_VAL LIKE‘Jackson%Andrew%‘))OR((S1.ATTR_ID=givenName AND(S1.STRING_VAL LIKE‘Andrew%’))AND(S2.ATTR_ID=sn AND(S2.STRING_VAL LIKE‘Jackson%’)))OR((S1.ATTR_ID=2 AND(S1.STRING_VAL LIKE‘Jackson%))”.
表达式树400的遍历上升到(步骤492)属性节点422的父节点,即逻辑节点410。由于逻辑节点410是逻辑AND节点,因此把逻辑“AND”算符附加到(步骤476)查询表达式的whereClause中。制作属性类型集合的副本(={string}),并将其存储到局部变量LHS(={string})中。亦制作最小值、最大值和计数值的副本(savedMinMaxCount={[key=String[min=1,max=1,count=1]]})。
由于逻辑节点410是逻辑AND节点,因此递增加串属性的最大值,并且将最小值和计数设定为等于最大值(typeMinMaxCount={[key=String[min=2,max=2,count=2]]})。清空属性类型集合(={})。然后逻辑节点410调用(步骤478)rightChild.genSearchString方法,以便于转换其右子。当开始转换右子时,保存SQL语句的whereClause的缓冲器的状态更新如下
whereClause=”AND((S1.ATTR_ID=cn AND(S1.STRING_VALLIKE‘Andrew%Jackson%‘))OR(S1.ATTR_ID=cn AND(S1.STRING_VAL LIKE‘Jackson%Andrew%‘))OR((S1.ATTR_ID=givenName AND(S1.STRING_VAL LIKE‘Andrew%’))AND(S2.ATTR_ID=sn AND(S2.STRING_VAL LIKE‘Jackson%’)))OR((S1.ATTR_ID=2 AND(S1.STRING_VAL LIKE‘Jackson%))AND”。
逻辑节点410的右子的转换开始并结束于属性节点424。对于属性节点424,重复步骤454和456修改属性类型集合(={string});确定用于串属性的表名(STRING_ATTRS)和别名计数;将表别名S2(属性类型是串,且计数=2)和表名相关联;并相应修改子查询表达式。将变量typeMinMaxCount设定为等于{[key=String[min=2,max=2,count=2]]}。
在这个例子中,由于表别名S2已经存在于fromClause和whereClauseJoinConditions缓冲器中,因此不再增加S2(即,这些缓冲器保持不变)。把搜索参数(属性sn)增加到whereClause中。在转换的这个阶段,保持SQL语句的各部分的当前状态的缓冲器如下fromClause=”FROM MEMBER_WMM ASMEMBER_WMM,STRING_ATTRS AS S1,STRING_ATTRS AS S2”;whereClauseJoinConditions=”WHERE(S1.MEMBER_ID=MEMBER_WMM.MEMBER_ID,S2.MEMBER_ID=MEMBER_WMM.MEMBER_ID)”;andwhereClause=”AND((S1.ATTR_ID=cn AND(S1.STRING_VALLIKE‘Andrew%Jackson%‘))OR(S1.ATTR_ID=cn AND(S1.STRING_VAL LIKE‘Jackson%Andrew%‘))OR((S1.ATTR_ID=givenName AND(S1.STRING_VAL LIKE‘Andrew%’))AND(S2.ATTR_ID=sn AND(S2.STRING_VAL LIKE‘Jackson%’)))OR((S1.ATTR_ID=2 AND(S1.STRING_VAL LIKE‘Jackson%))AND(S2.ATTR_ID=sn AND(S2.STRING_VAL LIKE‘Andrew%))))”.
当属性节点424的转换完成时,执行返回(步骤494)到逻辑节点410。
把属性类型集合(={string})的副本存储到局部变量RHS(={string})中。确定集合RHS和LHS的并集,并将其存储到newLHS变量(={string})中。对于这样的LHS类型,将最小值、最大值和计数值恢复为所存储的值,所述LHS类型已使相关联的MinMaxCount被调整,但在转换右子期间未遇到(typeMinMaxCount={[key=String[min=1,max=2,count=2]]})。将savedMinMaxCount和由TypeCountManager管理的MinMaxCount设置为等于相对最小值和最大值。
然后执行沿表达式树400从逻辑节点410上升到(步骤496)逻辑节点408,从而表明逻辑节点408的右子的转换完成。另外,当返回到逻辑节点408时,就完成了表达式树400的遍历。然后转换过程450组合(步骤498)各SQL语句缓冲器以构建作为结果的SQL子查询表达式如下SELECT MEMBER_WMM.MEMBER_IDFROM MEMBER_WMM AS MEMBER_WMM,STRING_ATTRSAS S1,STRING_ATTRS AS S2WHERE(S1.MEMBER_ID=MEMBER_WMM.MEMBER_ID,S2.MEMBER_ID=MEMBER_WMM.MEMBER_ID)AND((S1.ATTR_ID=cn AND(S1.STRING_VAL LIKE‘Andrew%Jackson%’))OR(S1.ATTR_ID=cn AND(S1.STRING_VAL LIKE‘Jackson%Andrew%‘))OR((S1.ATTR_ID=givenName AND(S1.STRING_VAL LIKE‘Andrew%’))AND(S2.ATTR_ID=sn AND(S2.STRING_VAL LIKE‘Jackson%’)))OR
((S1.ATTR_ID=2 AND(S1.STRING_VAL LIKE‘Jackson%))AND(S2.ATTR_ID=sn AND(S2.STRING_VAL LIKE‘Andrew%))))为了生成将提交给RDB知识库60的完整的查询表达式,把下列SQL语句段添加到该子查询表达式的前面SELECT MEMBER_ID FROM MEMBER_WMM WHEREMEMBER_ID IN子查询表达式出现在该SQL语句段之后的括号中。
图10示出了分析器208可以从一般搜索表达式中产生的表达式树500的另一个说明性示例。该特定表达式树500用来说明当把表达式树500转换成用于搜索关系数据库的查询表达式时在逻辑OR节点下表达式间重用表别名,以及在逻辑AND节点间使用新的表别名。在这个例子中,表达式树500表示下列搜索表达式(((cn=Andrew*Jackson*)OR(cn=Jackson*Andrew*))AND(((sn=Jackson*)OR(((birthDate=3/10/67)OR(birthDate=3/28/67))AND((description=generic)AND(location=Baltimore))))))OR(givenName=AndrewJackson*)表达式树500包括7个逻辑节点502、504、506、508、510、512、514和8个属性节点516、518、520、522、524、526、528和530。括号节点忽略。逻辑节点502、506、510和514是逻辑OR节点,而逻辑节点504、508和512是逻辑AND节点。属性节点516、518、520、526、528和530的属性是类型串(S);属性节点522和524的属性是类型日期(D)。把该表达式树500转换成SQL查询的过程产生了3个串表别名(S1,S2和S3)和1个日期表别名(D1)。
在图10中,各表别名出现在代表属性节点的矩形内。例如,表别名S1出现在逻辑OR节点502的每个子属性节点516、518中,这说明了在涉及串类型属性的表达式间重用表别名。另外,表别名S1出现在逻辑OR节点514的右子属性节点530中,这说明了在由子树所表示的表达式间对于串类型属性重用相同的表别名。类似地,表别名D1出现在逻辑OR节点510的每个子属性节点522、524中,这说明了在表达式间对于另一个属性类型(这里是日期类型属性)复0用表别名。
为了说明对于给定属性类型在逻辑AND节点间使用不同表别名,表别名S2出现在属性节点526中,而表别名S3出现在属性节点528中。通过为由属性节点520所表示的表达式使用表别名S2,也说明对于给定属性类型在逻辑AND节点间使用不同表别名—表别名S1出现在逻辑AND节点504的左子中,而表别名S2出现在逻辑AND节点504的右子中。
由于逻辑节点506是逻辑OR节点,因此在逻辑节点506的右子中可以重用表别名S2。如上面所提到的,该表别名S2出现在属性节点526中—由于逻辑AND节点508的左子没有使用串类型属性的表达式,因此逻辑AND节点508不需要在其子节点(这里是子树)间的用于串类型属性的不同表别名。
图11示出了一个用于执行异类知识库搜索的过程300的实施例。在该图中省略了括号节点的处理。作为简要概述,成员管理器32的查询处理器250从搜索表达式产生表达式树,并调用(步骤304)表达式树中节点的搜索方法(例如,node.search())。最初,该节点是表达式树的根节点。节点可具有子节点。因此,针对节点调用搜索,可相当于针对一个或多个子树调用搜索。一般来说,搜索发生在表达式树216的递归下降遍历中,也就是说,表达式树中的每个节点发出对该节点的每个子节点的搜索调用。响应于查询表达式而执行的虚拟知识库的搜索在表达式树的单次遍历中完成。
如果节点不是联盟节点(步骤308),则基于包容这些返回属性的知识库把返回属性划分(步骤312)成集合。在步骤316,生成支持搜索(例如,查询)属性的知识库列表。基于该列表,节点指导(步骤320)适宜的知识库适配器来搜索相关联的知识库。该知识库适配器把搜索表达式(或其一部分)转换成可被相关联的知识库识别的查询表达式,并从该知识库获取搜索结果。
当该知识库适配器包容所有返回属性(步骤324),并且列表中没有其他知识库(步骤328)时,则返回(步骤332)查询结果。相反,如果在列表中有另一个知识库(步骤328),那么节点指导(步骤320)和该知识库相关联的知识库适配器来执行搜索。该知识库适配器把搜索表达式(或其一部分)转换成可被该另一个知识库识别的查询表达式,并获取搜索结果。如果在列表中没有其他知识库(步骤328),则返回由知识库适配器获得的组合结果(步骤332)。
相反,如果在步骤324中,该知识库适配器不包容一个或多个返回属性,则由包容这种“未被包容”的返回属性之一的知识库适配器进行搜索(步骤336)。由于该搜索使用了从步骤320中执行的搜索返回的唯一标识符(UID)来直接识别要从支持未被包容的属性的知识库中检索出的成员,因此该搜索可以视为是有指导搜索。将该有指导搜索的结果和由步骤320获取的查询结果进行合并(步骤340)。这样,在步骤340,垂直划分的数据和水平划分的数据组合在一起。在步骤344,为每个未被包容的返回属性集合重复下述步骤搜索垂直划分的知识库,以及把垂直划分的数据和水平划分的数据合并在一起。因此,可为每个水平划分的知识库在多个垂直划分的知识库中迭代搜索过程。
相反,如果在步骤308,该节点是联盟节点,则搜索传递到(步骤348)该联盟节点的左子子树中的左子节点。在步骤304,调用该左子节点的node.search()方法。如果该左子节点也是一个联盟节点(步骤308),则搜索递归传递到该左子节点的左子子树。相反,如果该左子节点不是联盟节点,则如上面所述地获取搜索结果(即从步骤312到步骤344)。当返回这些搜索结果时(步骤332),在步骤352处搜索继续执行。
在步骤352,搜索传递到联盟节点的右子树中的右子节点。在步骤304,调用该右子节点的node.search()方法。如果该右子节点也是联盟节点(步骤308),则搜索递归传递到该右子节点的左子子树,并且针对步骤348搜索如上面所述地继续进行。相反,如果该右子节点不是联盟节点,则如上面所述地获取搜索结果(即,从步骤312贯穿到步骤344)。当返回这些搜索结果时(步骤332),在步骤356处搜索继续执行。
在步骤356,联盟节点确定是否使用逻辑OR操作来组合由左子树和右子树产生的搜索结果。如果算符是布尔OR算符,则联盟节点执行(步骤360)由左子树返回的结果和由右子树返回的结果的并集操作。否则,联盟节点获取(步骤364)由左子树返回的结果和由右子树返回的结果的交集(即,执行逻辑AND操作)。然后,联盟节点把这些结果返回(步骤324)到成员管理器(如果联盟节点是表达式树的根节点),或者调用该联盟节点的父节点。
下面的例子说明了具有特定搜索表达式的过程300。对这些例子,参照图6B。作为第一示例性说明,考虑搜索表达式是“(sn=Keats)OR(sn=Shakespeare)”。对应于该搜索表达式的表达式树如图6B中子树400所示(虚线框内),该表达式树的根节点是逻辑节点228-1。(为了该例子的考虑,忽略图6B中的表达式树216的剩余部分,即当前不讨论的表达式树部分)。当相同的一个或多个知识库包容搜索表达式中的所有属性时,表达式树没有任何联盟节点。这里,LDAP和DB知识库都支持“sn”属性,并且表达式树400没有任何联盟节点。
对于没有联盟节点的表达式树,把整个搜索表达式(在本例中,“(sn=Keats)OR(sn=Shakespeare)”)传递到负责执行搜索的LDAP和DB适配器。这些适配器把搜索表达式转换成对应的知识库特定查询表达式。这里,LDAP适配器40把搜索表达式转换成LDAP过滤器表达式,例如(&(sn=Keats)(sn=Shakespeare)),而DB适配器44把搜索表达式转换成具有包含子串例如(sn=Keats)AND(sn=Shakepeare)的WHERE子句的DB/SQL查询表达式。在该简单例子中,DB/SQL WHERE子句中的子串类似于基于串的搜索表达式,因为转换不涉及属性的任何确认和映射。
LDAP适配器40把转换过的LDAP过滤器表达式提交给LDAP知识库56,并且DB适配器44把DB查询表达式提交给DB知识库60。如上面步骤340所描述的,由于每个知识库适配器都接收整个搜索表达式,因此表达式树不必合并局部的结果。适配器40、44把所产生的成员集合返回给表达式树400,而表达式树把组合的成员集合返回给成员管理器32。
作为另一个例子,考虑图6B中的整个表达式树216。如果搜索表达式具有一个水平划分的属性和至少一个垂直划分的属性(例如由LA知识库包容的),则表达式树216具有至少一个联盟节点,即,该联盟节点的子子树具有由不同知识库支持的属性。在该例子中,搜索表达式(sn=Keats)OR(sn=Shakespeare)OR(buildingCode=5)具有一个在水平划分的LDAP和DB知识库中支持的属性(例如“sn”),以及另一个由垂直划分的LA知识库支持的属性(例如,“buildingCode”)。为该例子起见,也考虑返回属性是“sn”、“givenname”和“buildingCode”,并且LDAP和DB知识库除“sn”之外还支持“givenname”。
在搜索期间,联盟节点224发出适于每个特定适配器的子查询表达式(即,小于完整的搜索表达式),即联盟节点224仅传递那些由知识库支持的搜索属性。尽管仅把搜索表达式的适用部分发出给每个子树,但是也发出查询表达式中全部返回属性。这里,由于LDAP和DB知识库都支持“sn”,因此联盟节点224把搜索表达式的“(sn=Keats)OR(sn=Shakespeare)”部分发出给LDAP和DB适配器。这些适配器中的每个适配器都把搜索表达式的该部分转换成适用于其相关联知识库类型的查询表达式,并把该查询表达式发出给其相关联的知识库,以获得成员集合结果。
除了产生这些成员集合结果之外,每个LDAP和DB适配器为在LDAP和DB知识库的每个各自搜索期间返回的成员集合中的每个成员返回唯一标识符(UID)。例如,LDAP知识库的搜索可以发现5个满足子表达式“(sn=Keats)OR(sn=Shakespeare)”的成员,而DB知识库的搜索可以发现两个成员。因此,LDAP适配器返回5个UID,DB知识库返回2个UID。
由于查询表达式包括LDAP适配器和DB适配器都不包容的一个返回属性(这里指buildingCode),因此LA适配器使用返回的UID执行LA知识库的有指导搜索。使用前面的数字示例,从LDAP知识库获取的5个UID用于为5个对应成员从LA知识库中检索buildingCode信息。类似地,从DB知识库中获取的2个UID用于为2个对应成员从LA知识库中检索buildingCode信息。
对于每个由LDAP适配器识别的成员,将该成员的从LA知识库中检索到的buildingCode信息和该成员的从LDAP知识库中检索到的“sn”和“givenname”数据合并在一起。类似地,对于每个由DB适配器识别的成员,将该成员的从LA知识库中检索到的buildingCode信息和该成员的从DB知识库中检索到的“sn”和“givenname”数据合并在一起。因而,将从LDAP和DB知识库中检索到的水平划分的数据和从LA知识库中检索到的垂直划分的数据合并在一起。
把水平划分的数据和垂直划分的数据合并在一起的该搜索操作迭代地扩展到多于两个水平划分的知识库中。为了说明,当发生水平知识库的搜索时,该搜索产生成员集合结果和对应的UID。然后作用这些UID来执行LA知识库的有指导搜索。将从LA知识库获取的结果和水平知识库的结果组合在一起。对其他水平知识库中的每一个重复该过程,直到已使用来自水平知识库中的每一个的搜索结果来从垂直知识库中检索信息。
该搜索操作也迭代地扩展到两个或更多个垂直划分的知识库。为了说明,当发生水平知识库的搜索时,该搜索产生成员集合结果和对应的UID。这些UID用于执行垂直知识库中第一个垂直知识库的有指导搜索。然后将从该垂直知识库获取的结果和水平知识库的结果组合在一起。然后使用这些UID来执行第二个垂直知识库的有指导搜索。然后将从该第二垂直知识库获取的结果和水平知识库与第一知识库的组合结果组合在一起。对其他垂直知识库中的每一个重复该过程。另外,如果有多个水平知识库,则重复该过程,直到已使用来自水平知识库中的每一个的搜索结果来从多个垂直知识库中检索信息。
联盟代码224也把包含垂直划分属性的子表达式(即,“buildingCode=5)发出给右子子树。LA适配器48接收该搜索子表达式,并返回满足该子表达式的成员集合结果。
由于查询子表达式包括2个LA适配器不支持的返回属性(这里是sn和givenname),因此利用LA适配器返回的UID,执行LDAP和DB知识库的有指导搜索。把从LA知识库的搜索中返回的垂直划分的数据与通过LDAP和DB知识库的这些有指导搜索返回的垂直划分数据合并在一起。
然后联盟节点224把从左子子树获取的成员集合结果和从右子子树获取的成员集合结果合并起来。将从左子子树和右子子树获取的结果对于逻辑OR操作进行聚合(aggregate)或对于逻辑AND操作进行相交(intersect)。在合并了来自子子树的成员集合结果之后,联盟节点224把所产生的成员集合返回给成员管理器。成员管理器32把该成员集合传递给客户应用14,该客户应用根据预定视图显示结果。
本发明可以实现为在一个或多个制造物品上或中的一个或多个计算机可读软件程序。所述制造物品可以例如是软盘、硬盘、硬盘驱动器、CD-ROM、DVD-ROM、闪存卡、EEPROM、EPROM、PROM、RAM、ROM或磁带中的任一种或组合。一般而言,可以使用任何标准或专用的编程或解释语言来产生所述计算机可读软件程序。这类语言的例子包括C、C++、Pascal、JAVA、BASIC、Visual Basic以及Visual C++。所述软件程序可以作为源代码、目标代码、可解释代码或可执行代码存储在一个或多个制造物品中。
虽然已经参照特定的优选实施例来示出并描述了本发明,但是本领域技术人员应理解,可对本发明的形式和细节所作出各种更改,而不脱离如以下权利要求所定义的本发明的实质和保护范围。
权利要求
1.一种用于执行关系数据库搜索的计算机化的方法,该方法包括提供表示基于串的搜索表达式的表达式树,该表达式树具有包括逻辑节点的多个节点,表达式树的逻辑节点具有第一子节点和第二子节点,每个子节点表示该基于串的搜索表达式的子表达式,该逻辑节点表示用于组合由该逻辑节点的子节点所表示的子表达式的逻辑算符;确定该逻辑节点的第一子节点的子表达式中的属性与该逻辑节点的第二子节点的子表达式中的属性相比具有相同的数据类型,并和关系数据库中相同的表相关联;将表别名和表相关联;以及基于子节点的子表达式和逻辑节点的逻辑算符,生成子查询表达式,该子查询表达式是将用于查询关系数据库的知识库特定查询表达式的一部分,如果该逻辑节点是逻辑OR算符,那么该子查询表达式在该第一子节点的子表达式的转换中与在该第二子节点的子表达式的转换中使用相同的表别名。
2.根据权利要求1所述的方法,进一步包括以下步骤如果逻辑节点是逻辑AND算符,那么把所述表和不同的第二表别名相关联以用于转换所述第二子节点的子表达式。
3.根据权利要求2所述的方法,进一步包括以下步骤为转换所述第二子节点的子表达式的第二表别名重用当前包括在所述子查询表达式中的表别名。
4.根据权利要求2所述的方法,进一步包括以下步骤如果所述第二表别名对所述子查询表达式是新的,则把该第二表别名增加到该子查询表达式中。
5.根据权利要求1所述的方法,进一步包括以下步骤在所述表达式树的单次遍历中完整生成所述知识库特定查询表达式。
6.根据权利要求1所述的方法,其中所述确定步骤在遍历到所逻辑节点的第二子节点时发生。
7.一种用于执行关系数据库的搜索的计算机化的系统,该系统包括分析器,其从基于串的搜索表达式中产生表达式树,该表达式树具有包括逻辑节点的多个节点,该表达式树的逻辑节点具有第一子节点和第二子节点,每个子节点表示该基于串的搜索表达式的子表达式,该逻辑节点表示用于组合由该逻辑节点的子节点所表示的子表达式的逻辑算符;以及适配器,其用于接收该表达式树,并确定该逻辑节点的第一子节点的子表达式中的属性与该逻辑节点的第二子节点的子表达式中的属性相比具有相同的数据类型,并和相同的关系数据库中的相同的表相关联,该适配器把表别名和该表相关联,并基于子节点的子表达式和逻辑节点的逻辑算符生成子查询表达式,该子查询表达式是将用于查询该关系数据库的知识库特定查询表达式的一部分,如果该逻辑节点是逻辑OR算符,那么该子查询表达式在该第一子节点的子表达式的转换中和该第二子节点的子表达式的转换中使用相同的表别名。
8.根据权利要求7所述的系统,其中,如果所述逻辑节点是逻辑AND算符,那么所述适配器把所述表和第二表别名相关联,以用于转换所述第二子节点的子表达式。
9.根据权利要求8所述的系统,其中,所述适配器为用于转换所述第二子节点的子表达式的第二表别名重用当前包括在所述子查询表达式中的表别名。
10.根据权利要求8所述的系统,其中,如果所述第二表别名对所述子查询表达式是新的,则所述适配器把该第二表别名增加到该子查询表达式中。
11.根据权利要求8所述的系统,其中,所述适配器在所述表达式树的单次遍历中完整生成所述知识库特定查询表达式。
全文摘要
本发明描述了一种用于搜索关系数据库的系统和方法。表示基于串的搜索表达式的表达式树具有带第一子节点和第二子节点的逻辑节点。每个子节点表示搜索表达式的子表达式。逻辑节点表示用于组合由子节点所表示的子表达式的逻辑算符。确定第一子节点的子表达式中的属性与逻辑节点的第二子节点的子表达式中的属性相比具有相同数据类型,并和关系数据库中相同的表相关联。将表别名和表相关联。基于子节点的子表达式和逻辑节点的逻辑算符,生成子查询表达式。该子查询表达式是将用于查询关系数据库的知识库特定查询表达式的一部分。如果逻辑节点是逻辑OR算符,那么子查询表达式在第一子节点的子表达式的转换中和第二子节点的子表达式的转换中使用相同的表别名。
文档编号G06F17/30GK101013424SQ20061006426
公开日2007年8月8日 申请日期2006年11月14日 优先权日2005年12月27日
发明者J·F·基尔罗伊 申请人:国际商业机器公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1