条件,如果条件成立,则设置相应的布尔数组元素为真;
[0040]步骤(7.5.2)如果附加的布尔数组中所有元素都是逻辑真,则转移到对应的就绪状态;
[0041]步骤(7.6)如果当前标签不同于所有状态转移上的标签,则连续读入XML输入流的标签,直到读到当前标签对应的结束标签为止;随后读取XML输入流的下一个开始标签作为当前标签,转去步骤(7.3)继续执行;
[0042]步骤(7.7)如果当前状态上存在指向自身的状态转移,则复制当前的整个查询状态机,将剩余的XML输入流作为复制出的查询状态机的输入流,针对该状态机从步骤(7.3)开始继续执行,从而保证了相同的子查询作用于当前XML元素的所有后代,实现了祖先后代关系下的结构连接运算。
[0043]本发明的效果表现为能够针对以XML元素开始标签和结束标签组成的数据流,有效地进行路径表达式方式的数据查询;对于路径表达式方式的XML数据查询,支持XML数据特有的双亲子女关系和祖先后代关系的结构连接,支持多重筛选条件的使用,支持存在谓词和值约束形式的筛选条件,支持递归方式组织的XML数据。同时,能够及时返回查询到的数据,提高了数据处理的吞吐量。
【附图说明】
[0044]图1针对路径表达式中每个查询步的状态机创建过程。
[0045]图2查询请求的查询状态机创建过程。
[0046]图3基于查询状态机的XML流数据查询过程。
[0047]图4具体实施举例。
[0048]图5为本发明的实施流程图。
【具体实施方式】
[0049]如图1-5所示,本发明是一种对XML流数据进行查询处理方法;这里的XML流数据表现为XML元素的开始标签和结束标签组成的流数据。来自用户的查询请求表现为由多个查询步组成的路径表达式,每一个查询步可以有若干个筛选条件。筛选条件可能是关系表达式表示的值谓词,也可能是多个查询步路径表达式表示的存在谓词。
[0050]基于本发明的XML流数据处理的步骤如下:
[0051](I)为表示查询请求的路径表达式中的每个查询步,建立各自的状态机,以表示自身的查询处理进展状态;同时,各自设置一个保存中间结果的缓冲队列。例如,对于XPath路径表达式a//b[w/u] [v/text O >3]/c中的三个查询步,对包含多个查询步的筛选条件(如w/u)进行预处理,得到等价的查询请求a//b [w [./u] ] [v [./text O >3] ] /c,然后分别建立各自的状态机和缓冲队列。
[0052]对于没有筛选条件的每个查询步(如/c),建立一个初始状态和一个结束状态;建立一个状态转移,从初始状态指向结束状态,以查询步中名字检测的开始标签(如〈C?作为转移标记;建立一个状态转移,从结束状态指向初始状态,以查询步中名字检测的结束标签(如</c>)作为转移标记;
[0053]对于其他查询步(如//b[w[./u]] [v[./text()>3]]),各自建立一个初始状态、一个准备状态和一个就绪状态;建立一个状态转移,从初始状态指向准备状态,以查询步中名字检测的开始标签(如<b>)作为转移标记;建立一个状态转移,从准备状态指向初始状态,以查询步中名字检测的结束标签(如</b>)作为转移标记;建立一个状态转移,从就绪状态指向初始状态,以查询步中名字检测的结束标签(如</b>)作为转移标记;建立一个状态转移,从准备状态指向就绪状态,用于支持满足筛选条件时的状态转移。
[0054]为采用祖先后代连接关系的查询步(如//b),建立一个状态转移,从初始状态指向自身。
[0055](2)对于查询请求中查询步的各种内部筛选条件(如w[./U]),采用相同方法为筛选条件中的查询步,建立各自的状态机,以表示筛选条件检查过程;
[0056](3)对于每个具有筛选条件的查询步,设置一个布尔数组,用来保存筛选条件的检查结果;数组大小和筛选条件的数量相同;如对于查询步//b,设置的布尔数组有两个元素,分别保存谓词[?[.Al]]和[v[./text ()]>3]的检查结果;对于值约束形式的筛选条件,在最内层的查询步对应的状态机的准备状态上附加约束条件,如约束条件text ()>3被附加到V对应的状态机的准备状态;
[0057](4)为路径表达式方式的查询请求,按照以下步骤,构造查询状态机,以表示整体查询的进展状态:
[0058](4.1)为每个筛选条件,针对其中唯一的查询步,(如w[./u])构造一个筛选状态机,如果该查询步自身没有筛选条件,则该查询步的状态机组成了筛选状态机;并且,以该查询步状态机的初始状态作为筛选状态机的初始状态;否则,针对查询步自身的每个筛选条件(如[.u]),分别构造各自的子筛选状态机,并且将该查询步状态机的准备状态作为这些子筛选状态机的初始状态;该查询步的状态机和每个子查询状态机组成整个筛选条件的筛选状态机,并且以它的初始状态作为筛选状态机的初始状态;
[0059](4.2)对于仅包含一个查询步的路径表达式,如果该查询步自身没有筛选条件,则该查询步的状态机组成了整个查询请求的查询状态机;并且,以它的初始状态作为查询状态机的初始状态;否则,针对查询步自身的每个筛选条件,采用(4.1)分别构造各自的筛选状态机,并且将该查询步状态机的准备状态作为这些筛选状态机的初始状态;该查询步的状态机和每个筛选状态机组成整个查询请求的查询状态机,并且以它的初始状态作为查询状态机的初始状态;
[0060](4.3)对于包含多个查询步的路径表达式(如:a//b[w[./u]] [v[./text O >3]]/c),则针对第一个查询步以外的其他查询步组成的路径表达式,采用步骤(4)构造一个子查询自动机;如针对//b[w[./u]][v[./text()>3]]/c,单独构造出一个子查询状态机;如果第一个查询步没有筛选条件,以第一查询步状态机的准备状态作为这个子查询状态机的初始状态;并且,以它的初始状态作为查询状态机的初始状态。如果第一查询步中存在筛选条件,如路径表达式//b [w [./u] ] [v [./text O >3] ] /c,针对第一个查询步以外的其他查询步组成的路径表达式(如:/c),采用步骤(4)构造一个子查询自动机;如果第一个查询步包含筛选条件,以第一查询步状态机的准备状态作为这个子查询状态机的初始状态,随后,复制该子查询状态机,以第一查询步状态机的就绪状态作为复制的子查询状态机的初始状态。第一查询步的状态机和两个子查询状态机组成整个查询请求的查询状态机;并且,以它的初始状态作为查询状态机的初始状态。在图4中q2和q9组成的状态机被复制为q6和qlO,最终针对路径表达式a//b [w [./u] ] [v [./text () >3] ] /c构造出的整个图4所示的查询状态机。
[0061](5)在步骤(4)构造的查询状态机上,按照以下步骤设置处理动作:
[0062]对于路径表达式中末端的查询步对应的状态机上,在结束状态指向开始状态的状态转移上,附加入队动作;对于各种筛选条件中查询步对应的状态机,在就绪状态指向开始状态的状态转移上,附加标志设置动作;对于路径表达式中非末端的查询步对应的状态机中,如果标记为结束标签的状态转移起点为就绪状态,而且终点为前一查询步的状态机的准备状态,则将上传动作附加到这个状态转移上;对于路径表达式中非末端的查询步对应的状态机中,如果标记为结束标签的状态转移起点为准备状态,而且终点为前一查询步的状态机的准备状态,则将清空动作附加到这个状态转移上;对于路径表达式中非末端的查询步对应的状态机中,如果标记为结束标签的状态转移起点为就绪状态,而且终点为前一查询步的状态机的就绪状态,则将输出动作附加到这个状态转移上,从而输出缓冲队列的候选结果;按照上述方法,对于依据路径表达式a//b [w[./u] ] [v [./text O >3] ] /c构造的查询状态机,添加动作后,如图4所示。
[0063](6)基于查询状态机,对标签流形式的XML流数据处理的方法如下:
[0064]将路径表达式中第一个查询步的开始状态作为当前状态,读取XML输入流的第一开始标签作为当前标签,获得当前状态为起始状态的所有状态转移。如果当前标签和某个状态转移上的标签相同,则以这个状态转移的目标状态为当前状态,完成状态转移;并且,按照这个状态转移上的附加动作,完成以下处理:
[0065]如果附加动作是入队动作,则将当前XML元素添加到当前查询步的缓冲队列的队尾;如果附加动作是标记设置动作,则将当前状态的布尔数组中对应的数组元素设置为真;如果附加动作是上传动作,则取出当前查询步对应的缓冲队列中的数据,上传到前一查询步对应缓冲队列中;如果附加动作是清空动作,则清空当前查询步对应的缓冲队列;如果附加动作是输出动作,则输出当前查询步的缓冲队列中的数据;如果目标状态为准备状态,则依据筛选条件进行状态转移,检查附加的各个筛选条件,如果条件成立,则设置相应的布尔数组元素为真。如果附加