反应性的重合的制作方法

文档序号:6442679阅读:268来源:国知局
专利名称:反应性的重合的制作方法
技术领域
本发明涉及对事件进行建模的方法和系统。
背景技术
数据源可将事件流提供给客户机来进ー步利用。例如,事件流可包括与股票价格相对应的事件,这些事件是经由事件流在任意时刻(诸如,在某股票的价格改变以后)被传递的。事件流和相关联的事件一般作为可在其上执行查询的数据来利用。查询使得各资源 (例如,软件、服务器、应用、硬件……)能够利用这些事件流和事件。例如,可监视特定的股票价格,并且向用户通知该价格何时达到了某ー值。常规的事件流包括在特定时间点发生的点事件的反应性流。为了便于利用事件流和相应的数据,包括每ー事件的持续时间可能是有用的。通常,利用两种技术来处理对来自事件流的各个事件的持续时间进行表示——利用持续时间事件的结束或实现时戳。可为事件流上的每ー个事件生成持续时间事件的结束。然而,持续时间事件的这种结束并不直接与相应的事件相关。具体而言,事件的事件流可包括含该事件流上的每ー 个事件的持续时间事件的结束的相应流。然而,在需要在事件流和对应于流的事件的结束之间进行映射以便将事件与持续时间事件的相应结束相关联吋,发生了难题。对事件流和持续时间事件的结束之间的这种关系进行映射和编码可能是复杂且低效的。时戳一般包括与事件相关联的时域中的变量,其中该变量表示持续时间。由时域中的变量表示的持续时间要求整个持续时间被定义为具有开始和结束,以得到每ー个事件的持续时间的精确表示。这可导致事件的聚集中的延迟,因为在使用时戳时必须标识出事件结束。例如,假设每当ー个人出生时就发布一事件,该事件具有直到这个人死亡为止的持续时间。尽可能快的发布事件是有好处的,但是死亡日期却要到很晚以后才被知晓。这引起了延迟,因为为了使持续时间是确定的,在死亡发生之前并不会发布出生事件。此外,在表示无限事件时引起了困难。如所提到的,时戳技术要求持续时间(例如,开始和结束),以便表示持续时间。为了克服有关无限持续时间事件的挑战,时戳技术可提供估计的持续时间(例如,事件的开始和结束)并在以后的时间更新该估计值。然而,这导致了对各更新之间的事件的过度的处理、増加的延迟以及不精确的持续时间表示。

发明内容
下面呈现了简化的发明内容,以便提供对所公开主题的某些方面的基本概念。本发明内容不是广泛性的概观。它并不旨在标识关键/重要元素,也不旨在划定所要求保护
主题的范围。其唯一目的是以简化形式呈现ー些概念,作为稍后呈现的更具体实施例的序 、-
η ο简言之,本主题公开一般涉及建模和采用具有持续时间的事件。更具体地,可生成内部事件流来表示来自外部事件流的事件的持续时间。通过采用内部事件流,外部事件流的事件持续时间可被精确地表示。内部事件流可包括持续时间的开始和持续时间结束,其中持续时间的开始和持续时间结束之间的时间段是事件的持续时间。为外部事件流上的每ー个事件生成相应的事件流使得外部事件流能够为了事件持续时间的表示而被建模。此外,经建模的事件流可用于标识重合,或者換言之用于标识两个事件的持续时间在哪里重叠。此外,经建模的事件流可与各种运算符一起用来确定重合。为实现上述及相关目的,在此结合以下描述和附图描述了所要求保护主题的某些说明性方面。这些方面指示可实践本主题的各种方式,它们均落在所要求保护主题的范围之内。当结合附图阅读以下详细描述时,本发明的其他优点和新颖特征将变得显而易见。


图1是事件建模系统的框图。图2是表示事件流中的点事件的持续时间的对事件进行建模的系统的框图。图3描绘了包括持续时间的表示的经建模事件流。图4描绘了对第一经建模事件流和第二经建模事件流的重合操作。图5描绘了针对第一经建模事件流和第二经建模事件流的重合运算。图6描绘了针对事件流和经建模事件流的重合运算。图7是创建点事件的事件流来表示持续时间的方法的流程图。图8是利用具有持续时间的经建模事件流来查明各事件间的重合的方法的流程图。图9是示出用于本发明各方面的合适操作环境的示意性框图。
具体实施例方式以下的细节一般涉及建模具有持续时间的事件。在各事件重合时表达查询可以是合乎需要的。例如,假设查询检查两个人何时同时在房间中。常规地,流是由点事件(例如, 在特定时间发生的事件)組成的,为了要确定的重合它要求两个人正好在相同时刻进入房间。这是非常不可能的,并且不正确地捕捉了查询的意图。以上情况可通过将点事件的概念改变成具有持续时间的事件来解決。通过事件的这种模型,人进入房间的事件包括等于该人在房间内的时间的持续时间。如果两个事件在时间上重叠,则这两个事件是重合的。因此,在此提供了关于如何建模具有持续时间的事件的细节。作为示例,而非限制,可生成表示相应事件的持续时间的附加事件流。另外,可构建利用具有持续时间的事件的多个运算 (例如,“ Group Join (组联结)”、“Join (联结)”、“Window(窗ロ ) ”、"BufferWithTime (根据时间来缓存)”、“CombineLatest (组合最近的)”、“ BufferWithCount (根据计数来缓存)”···)。现在參考附图更详细地描述本公开的各个方面,在全部附图中用相似的标记来指示相似或相应的元素。然而应该理解,附图及其相关详细描述不_在将所要求保护的主题限于所公开的具体形式。相反,其意图是覆盖落在所要求保护主题的精神和范围之内的所有修改、等价物和替换的方案。首先參考图1示出了生成事件流来表示事件的持续时间的事件建模系统100。事件建模系统100包括变换组件110,该变换组件110接收外部事件流并输出具有持续时间的事件流(例如,经建模的事件流)。具体而言,变换组件110创建外部事件流的模型,该模型CN 102541636 A包括来自外部事件流的至少ー个事件的内部事件流,其中内部事件流表示该至少ー个事件的持续时间。換言之,该变换组件110用每一事件的附加事件流(例如,内部事件流)来表示持续时间。应该理解,事件可以是例如点事件。此外,应该理解和了解,外部事件流可以是流事件的源,而内部事件流是为外部事件流上的每ー个事件创建的表示每ー个相应事件的持续时间。換言之,可以存在任何合适数量的内部事件流来表示外部事件流上的每ー个点的持续时间。变换组件110还包括标识出外部事件流内的各事件的评估组件120。例如,数据源可提供事件的流(例如,外部事件流),其中评估组件120标识出该事件流内的每ー个事件。另外,评估组件120可接收和/或收集外部事件流,以便提供事件标识的分析。此外,变换组件110包括创建用于表示至少ー个事件的事件持续时间的附加事件流(例如,内部事件流)的流エ厂组件130。流エ厂组件130生成来自外部事件流的至少ー 个事件的内部事件流,以便表示持续时间。具体而言,流エ厂组件130可至少部分地基于评估组件120标识出的至少ー个事件来创建该至少ー个事件的内部事件流。应该理解,为了对持续时间进行建摸,流エ厂组件130可生成来自外部事件流的任何合适数量的事件的事件流(例如,内部事件流)。作为示例而非限制,外部事件流“A”可包括事件“W”、“X”、“Y”和“Z”。可通过为每ー个事件创建附加事件流(例如,内部事件流)来将外部事件流“ A”从点事件的事件流变换成具有持续时间的事件流(例如,经建模的事件流),其中每ー个附加流对应于每ー个事件的持续时间。由此,对于外部事件流“A”而言,生成以下附加事件流(例如,内部事件流)来表示持续时间事件“W”的内部事件流“w” (内部事件流“ゲ’表示事件“W”的持续时间);事件“X”的内部事件流“χ” (内部事件流“χ”表示事件“X”的持续时间);事件“Y” 的内部事件流“y” (内部事件流“y”表示事件“Y”的持续时间);以及事件“Z”的内部事件流“z” (内部事件流“ζ”表示事件“Z”的持续时间)。流エ厂组件130还管理内部事件流的持续时间。一般而言,事件的持续时间包括开始和结束。因此,为了对具有持续时间的事件流进行建摸,流エ厂组件130创建包括开始和结束的内部事件流。作为示例而非限制,持续时间可具有值和终止点。然而,流エ厂组件 130利用开始和持续时间结束,并且其中的任何信息可以或可以不由第二事件流来维护。通过利用评估组件120标识出的事件,流エ厂组件130执行在所表示的事件的开始处生成内部事件流。換言之,事件的开始持续时间被基于评估组件120生成的内部事件流准确地表示。例如,如果在事件流“A”中标识出了事件“X”,则流エ厂组件130被触发来生成表示事件“X,,的持续时间的内部事件流“ χ ”。流エ厂组件130还可包括所表示的事件的持续时间结束。应该理解,持续时间结束可以是例如至少ー个事件的消息的完成(例如,结束),或者可以是为至少ー个事件发送的任何消息(例如,在内部事件流的创建以后从外部事件流接收到的第一个消息)的完成。 此外,应该理解,持续时间结束可以在使用消息的完成还是使用所发送的任何消息的完成之间进行转换。应该理解,具有完成消息的事件流被利用来与所生成的内部事件流进行相关,以表示持续时间结束。通过利用内部事件流来表示来自外部事件流的至少ー个事件的持续时间,来对事件和相应的持续时间进行建摸。此外,这种由变换组件110来进行的建模并不需要对持续时间的估计、用于纠正对持续时间的估计的更新,或者事件流编码或映射——而所有这些对于诸如时戳和持续时间事件的结束之类的替换技术而言却是需要的。图2示出了对事件进行建模的系统200的框图,该系统表示事件流内的点事件的持续时间。该对事件进行建模的系统200包括将具有点事件的事件流转换成具有持续时间的事件流的变换组件110。尤其地,变换组件110生成与来自外部事件流的至少ー个事件的持续时间相对应的内部事件流。換言之,变换组件110用内部事件流来对外部事件流进行建模,以便准确地描绘来自外部事件流的诸如点事件之类的至少ー个事件的持续时间。变换组件110包括评估组件120和流エ厂组件130。评估组件120可监控外部事件流来检测至少ー个事件。基于这种检测,流エ厂组件130可为来自外部事件流的至少ー 个事件创建内部事件流,其中所述内部事件流表示至少ー个事件的持续时间(例如,开始、 结束)。如以上所讨论的,流エ厂组件130可为外部事件流上的任何合适数量的事件生成任何合适数量的事件流(例如,内部事件流)。例如,外部事件流可包括事件ェ至事件N,其中“N”是正整数。在这ー实例中,流エ厂组件130可以将内部事件流ェ注入到内部事件流N 中,其中“N”是正整数,且内部事件流ェ表示事件ェ的持续时间,内部事件流N表示事件N的持续时间。 变换组件110还包括重合组件210。重合组件210利用经建模的事件流来确定第一事件和第二事件间的重叠(例如,重合)。換言之,重合组件210利用外部事件流和表示至少ー个事件的持续时间的内部事件流来便于满足与ー个或多个事件流有关的重合查询。如以上提到的,重合是其中第一事件与第二事件或一組事件的持续时间相重叠的持续时间。 换句话说,重合标识了各数据表之间的共同性,其中在数据表中的是例如事件流,且共同性是相重叠的两个事件。例如,如果事件流是出入房间的人,则可将重合看作房间中同时有多于ー个人的时候。重合组件210内还包括运算符220。运算符220可处理重合并允许对事件流执行查询来返回与重合有关的結果。作为示例而非限制,运算符220可以是“Gr0UpJ0in”、“J0in”、 "Window“BufferffithTime“CombineLatest“BufferffithCount“(以下将更详细的讨论)。一般而言,运算符220可包括用于处理重合的多个有用的运算符。“Merge (合井)”和“Switch (切換)”是处理重合的两个运算符,并且能够适用于经建模的事件流,因为两者都对可被看作具有持续时间的各事件的流的流进行运算。事实上,另ー个运算符 "MergeUntil (合并直到)”可适于利用经建模的事件流并使用重合信息来延迟“Switch”运算符直到持续时间过期。此外,运算符220显式地处理重合。在每ー个运算符中,基于显式的流的流来定义运算符是可能的,但是通常用户要先将流映射成这种形式。因此,系统200定义关于平面流的运算符,并如下将来自事件类型的选择器提供给持续时间Stream of Streams :IObservable<Tx, I0Dservable<U>>,其中,在给定选择器“Func<T,I0bservable<U>”的情况下“I0bservable<T>”被转变成以上表达。图3描绘了包括持续时间的表示的经建模的事件流300。一般而言,本主题公开为来自外部事件流的至少ー个事件创建附加事件流(例如,内部事件流),其中附加事件流表示特定事件的持续时间。经建模的事件流300包括含至少ー个事件的外部事件流310。在此,外部事件流310(也称为“X”)包括事件“)(。”、“ΧΛ和“)(2”。外部事件流310还包括结束320 (例如,终点),该结束与外部事件流传递事件的结束(例如,传送组件从外部事件流接收事件的结束)相对应。应该理解,外部事件流310可以是但不限于具有点事件的事件流。如以上详细讨论的,可通过注入用于表示事件的持续时间的附加事件流(例如, 内部事件流)来将事件流变换成具有持续时间的事件流。内部事件流330是基于事件“X/ 来生成的,其中内部事件流330将表示事件“)(。”的持续时间。内部事件流330具有在从外部事件流传递时开始并直到结束340的持续时间。附加的内部事件流350是为了表示事件“X/’的持续时间基于事件“X/’创建的。 应该理解,附加的内部事件流350的持续时间为从‘%”到“ん”,其中“V’是如下各项中的至少ー项‘%”的消息的完成(例如,结束)、或为“V’发送的任何消息(例如,在创建了附加的内部事件流350以后从外部事件流310接收到的第一个消息)。应该理解,由矩形条表示的结束(例如,结束320、结束340、结束370等)对应于作为消息的完成的持续时间结束。然而,“Y”是在创建了附加的内部事件流350以后从外部事件流310发送出的消息的持续时间结束。附加的内部事件流360是为其中表示有持续时间的事件“も”创建的。事件“も” 的持续时间为从“も”到结束370。应该理解,“Ztl”可以是与事件“も”相关联的至少ー个值 (例如,消息)。为了说明与事件“も” 一起在附加的内部事件流360上接收到的消息以及是消息的完成的持续时间结束(例如,由矩形条表示的)而描绘了“ 4”。关于图3中的重合,‘%”与‘%”和“X/,相重合,‘%”与‘%”和“X/,相重合,其中 “も”仅与“も”相重合。应该理解,重合是自反的和対称的,而不是可传递的。如此处所利用的,在本主题公开的其余部分中将省略自重合。经建模的事件流300使用较高阶的流。換言之,持续时间变成远景(future)(例如,担当最初并不知晓的结果的代理的对象),该远景在它可用时将给出持续时间,其中该远景本身是事件流。例如,如此处所使用的,远景涉及由事件流所表示的事件的持续时间, 因为这种事件的持续时间最初并不被知晓。然而,持续时间是基于持续时间结束来计算到的(如上所述)。此外,远景(在本上下文中为持续时间)未被解析,因此附加的事件流将被异步地解析,其中开始持续时间可以是事件的接收,且持续时间结束可以是如下各项中的至少ー项事件的消息的完成或所发送的事件的任何消息。经建模的事件流是通过将具有持续时间的事件建模成如下事件流的事件流来生成的I0bservable<T χ, I0bservable<U>>以上表达可导致关于反应性流的多个有用的运算符,诸如“ J0in”、“Gr0UpJ0in”、 "Window"和“BufferWithTime”、“CombineLatest” 和“BufferWithCount”。IObservable 被如上使用。如在此所利用的,应该理解,基于IObservable和IEnumerable各自具有实质上类似的相关特征,在本主题公开中它们可以被看作是可互換的。因此,以上表达可以是如下IEnumeraole<T χ, IEnumerabie<U〉>以下说明使用较高阶的第一分类事件流来建模具有持续时间的事件。类型是具有类型“T”的数据的事件流,该类型“T”的数据具有表示持续时间的事件流,并且该持续时间承载类型“U”的数据,如下以下表达允许到其他两种常用表示中的任何一个的如下映射
xs.Select ((value, duration) => value) , xs.SelectMany((value, duration) => duration)
Il 一対事件流
xs.SelectMany((value,duration)
= >Never. Until(duration) .Concat(Defer(Return ((value, time))))
/ /具有作为时间值的持续时间的事件流持续时间可被建模成其中由第一事件或结束来终止该持续时间的内部事件流。持续时间可以被建模成其中事件或流的结束可以用信号通知该持续时间的结束的内部事件流。实现可随后使用持续时间的事件来承载信息或者仅使用普通终止或异常终止。图4示出了对第一经建模事件流和第二经建模事件流的重合运算400。第一经建模事件流包括来自图3的外部事件流310,其在此处被称为第一经建模事件流310。 图4描绘了在第一经建模事件流310和第二经建模事件流410之间执行的重合运算符 “Groupjoin”。第二经建模事件流410包括具有终止(例如,结束)420的事件“ Atl ”、"A1 ”、 和"A2 ”。如上所述,具有事件“ん”、“ん”、和“A2”的事件流(也被称为“A”)可被用来生成经建模的事件流410。具体而言,内部事件流430被生成来表示事件“ Atl ”的持续时间(具有结束440),附加的内部事件流450被创建来表示事件“A/’的持续时间(基于“B。”是终止该持续时间的事件,因此具有结束“Btl” ),并且附加的内部事件流460被生成来表示事件 “A2”的持续时间(具有结束470)。应该理解,“C/’可以是与事件“A2”相关联的至少ー个值 (例如,消息)。“GroupJoin”运算符确定第一经建模事件流310 (也被称为“X”)和第二经建模事件流410(也被称为“A”)之间的重合。按照第一经建模事件流310和第二经建模事件流 410,“V,与“ Α。”和“ A/,相重合,“ X1 ”并不与任何事件相重合,且“も”与“ A/,相重合。一般地,在第二经建模事件流410中重合的各事件被投影到第一经建模事件流310中。在第一经建模事件流310和第二经建模事件流410之间执行“Groupjoin”运算符会提供所得事件流480。所得事件流480包括来自第二经建模事件流的被投影到第一经建模事件流310的重合事件(例如,“ A0 ”和“A,)。換言之,“A0,,和“A,被投影到内部事件流330,并且“A, 被投影到附加的内部事件流360。“GroupJoin”运算符可被定义如下IObservable<R>GroupJoin<T/ U, TD, UD, R>( thisIObservable<T> left, I〇bservable<U> right,
Func<T, IObservable<TD>>leftDurationSelector, Func<U,エObservablecUD>>rightDurationSelector, Func<T, IObservable<U>, R>resuitSelector)“Groupjoin”可以是其他加窗运算符的基础。“Groupjoin”采用两个流作为输入并采用每ー个流的持续时间选择器。每当左边的流上发生新事件吋,就打开窗ロ,并且调用“leftDurationSelector (左边的持续时间选择器)”来确定该窗ロ的持续时间。每当任何消息出现在持续时间上时,窗ロ被关闭。同样,当窗ロ被打开时,用值和窗ロ来调用 “resultSelector (结果选择器),,以确定结果流中的下ー个输出。窗ロ可以包含所有当前打开的右边的源值以及在窗ロ被关闭之前被打开的那些值。每当右边的源上出现值时,该值就被发送到所有当前打开的窗ロ。该值被记住,直到“rightDurationSelector (右边的持续时间选择器)”确定该值应该被移除的时间为止。每当没有新的结果可出现时(即,当左边的流完成吋),就向结果流发送流消息的结束。窗ロ如已经定义的那样被关闭。例如,执行“GroupJoin”xs. GroupJoin、ys,χ = > duration (χ), y = > duration (y; , (χ, yyj = > new {χ,
yy})应该理解,典型的系统并不允许右边的事件流的持续时间。另外,“ Group Join”可以按照“ Pub Ii sh (发布)”、“Select (选择)”和"TakeUntil (取直到),,的术语来表达。以下说明了“ Groupjoin”具有将右边的源映射在左边的源的持续时间上直到持续时间过期并投影输出的基本运算xs. GroupJoin、ys,f, _ = > Empty (),h) = = ys. Publisn (ysl = > xs. Select u => h(x, ysl. TakeUntil (f (χ)))))另外,“Groupjoin”运算符可以用语言句法来表达。如和Visual Basic 之类的一些语言提供“GroupJoin”的句法。例如,给定“GroupJoin” xs. GroupJoiruys, f, g, hノ等价于写法from χ in xsjoin y in ys on f (x;equals g(y;into resultsselecth(x, results)该句法需要三个表达式((ys,f(x),和g(y)))以及两个变量定义(y和 results(结果))。一般说来,f(x)和g(y)被认为是用来计算两个对象是否相等并因此应该被联结的表达式。然而,这可导致这两个表达式指示持续时间并计算两个对象是否是重合的并因此需要被联结的概念。因此,源是“IObservables”,且关键表达式是 ‘‘IObservables,,。图5示出了针对第一经建模事件流和第二经建模事件流的重合运算500。第一经建模事件流包括来自图3和图4的外部事件流310,并且它在此处被称为第一经建模事件流310。此外,第二经建模事件流410来自图4。图5描绘了在第一经建模事件流310和第二经建模事件流410之间执行的重合运算符“Join”。“Join”运算符确定第一经建模事件流310 (也被称为“X” )和第二经建模事件流 410 (也被称为“A”)之间的重合。按照第一经建模事件流310和第二经建模事件流410, “V,与“V,和“V,相重合,“V,并不与任何事件相重合,且"x2"与“V,相重合。一般来说,在第二经建模事件流410中相重合的各事件“被配对”并被合并在包括作为点事件的重合事件的所得事件流510上。所得事件流510包括来自第二经建模事件流的被一起配对成点事件的重合事件(例如,“ A0 ”和“A,)。“Join”运算符可被定义如下
IObservable<R> Join<T, U, TD, UD, R>( thisIObservable<T> left, IObservable<U> right,
Func<T, 10bservable<TD>>IeftDurationSeIector, Func<U, IObservable<UD>>rightDurationSelector, Func<T, U, R> resultSelector)联结可以是“Groupjoin”的特殊情況,其中重合事件被配对而不是使用整个窗ロ。 实际上,可根据“GroupJoin”将“Join”定义如下xs. Join (ys, f, g, r) == xs. GroupJoiruys,f,g,(x,yy) => yy. Select (y => r(x, y))). Merge ()使用以上定义,重合事件被配对,并且结果被合并在一起。可以如下对第一经建模事件流310和第二经建模事件流410执行“Join”运算符xs. Join (ys, χ => duration u; y = > duration ,(χ, y) => newtx,y})因此,配对被描绘在这两个事件的后面,因为那里是知晓配对是重合的最早的点。 应该理解,现在外部流稍后再终止。外部流被终止,因为这是将不存在任何其他重合事件的点。然而,更紧的绑定可被使用,其中在左边的持续时间和所有左边的持续时间已经结束时或者在右边的持续时间和所有右边的持续时间已经结束时流终止。在任ー情况下,已知没有任何其他组合是可能的。应该理解,在给定我们按照“Groupjoin”的定义的情况下,这个更紧的绑定不被表达。“Join”运算符可以用语言句法来表达。类似于组联结,如和Visual Basic 之类的ー些语言提供用于“Join”的句法。例如xs. Join(ys, f, g, h)等价于写法from χ in xsjoin y in ys on f (x; equals g、yノselect h(x, y)关键选择器的概念被改变为持续时间选择器并等价于重合。图6示出了针对事件流和经建模的事件流的重合运算600。重合运算600包括含事件W、12”和“X3”的第一事件流610 (也被称为“X”)。应该理解,第一事件流 610可以是例如数据流。重合运算600还包括含事件"Atl”、"A1 ”、和“A2”的经建模的事件流620(也被称为“A”)。经建模的事件流620(也被称为外部事件流)可包括内部事件流 630 (表示“k0”的具有终止640的持续时间)、附加的内部事件流650 (表示“A/’的具有终止660的持续时间)、以及附加的内部事件流670 (表示"A2”的具有终止680的持续时间)。 应该理解,经建模的事件流620中的各事件"AJZA1 ”和“A2”可以是在用于映射来自第一事件流610的各个事件的窗口(例如,基于重合来收集事件ΙΛΙΛ")^”和/或“X/’)。 此外,为了相应地捕捉重合事件,可以定义附加的事件流(例如,内部事件流630、附加的内部事件流650和附加的内部事件流670)及相应的持续时间。换言之,窗口的数目(例如, 附加的事件流)以及窗口的持续时间可以是例如用户通过查询来定义的。因此,在第一事件流610和经建模事件流620之间执行“窗口”运算符可提供所得的经建模事件流690。所得的经建模事件流690包括来自第一事件流610的映射到经建模事件流620 (也被称为“A” )上的各事件(也被称为“X”)。按照第一事件流610和经建模事件流620,“V,与10”和“X/,相重合,“Α,与“)(,相重合,且“V,与“Χ3”相重合。因此, 经建模事件流690包括内部事件流630内的和“X/’、附加的内部事件流650内的“X/’ 和附加的内部事件流670内的‘%”。一般说来,窗口的打开和关闭被定义,其中数据(例如, 第一事件流610)被张贴于其中。“窗口”运算符可被定义如下
IObservable<IObservable<T>> WindowcT, U, V>( thisIObservable<T> data, IObservable<U>windowOpenings, Func<U, IObservable<V>>windowCloseSeIector)可定义“窗口”运算符来取数据流和窗口定义流。可将数据映射到所定义的窗口上。这可能实质上类似于根据“Select (选择)”和“TakeUntil (取直到)”来定义的“组联结变型”。因此,可根据“组联结”将“窗口”定义如下xs. Window (ys, f) = = ys. GroupJoin (xs, f, χ = > Empty (), (_, xx) = > xx)通过给定的数据流和窗口的流,结果可以是映射到所定义的窗口上的数据流。“BufferWithTime”运算符可被定义如下
IObservable<IObservable<T>>BufferWithTime<T>( thisIObservable<T> data, TimeSpan shift, TimeSpan span, IScheduler scheduler)加窗可以是基于时间的。例如,可以基于窗口在时间上的大小和对下一个窗口的时间平移来对时间进行加窗。应该理解,可根据“Window”运算符来定义这个“BufferWithTime” 运算符(如上所述)。"BufferWithTime” 在 “shift (平移)”处创建具有持续时间“span(跨度)”的窗口。通过“BufferWithTime”,数据流并不指示窗口(虽然如下所述,该数据流可用于驱动窗口)。例如xs.BufferWithTime(shift, span,scheduler) = = xs. Window(Timer(0, shift, scheduler),_ = > Timer (span,scheduler))此外,依赖于数据的数据运算符可以与本主题公开一起使用。依赖于数据的运算符可以是但不限于 “CombineLatest” 和 “BuffterWithCount”。依赖于数据的“Join”可以是自联结。由于反应性的流是任何自联结,可以广播流本身来合适地共享数据。这可通过使用“Publish(公布)”来实现。例如,自联结可以是如下xs. Publish(xsl = > xsl. Join(xsl, durationSelector, durationSelector, (xl, x2) => new{xl, x2})多个有趣的组合符可以被建模。例如,“CombineLatest”或 "CombineLatestLeft (组合左边最近的)”(例如,CombineLatest but replaces_ => ysl with_ = > Empty ())xs. CombineLatest (ys, f) == Publish (xs, ys, (xsl, ysl) = > xsl. Join (ysl, _ => xsl, _ => ysl, f))因此,“CombineLatest”可以被定义成数据驱动加窗运算符。“CombineLatest” 运算符可以复制硬件中两个流上的最近的值在其中被标识出的锁存。这允许如下将 "BufferffithCount"定义成数据驱动的加窗运算符xs. BufferffithCount (n, m) = = xs. Publish (xsl = > xsl. Window (xsl. Select ((x,i) = > i) · Where (i => i % m==0),_=> xsl. Skip (n -1)))在以上示例中使用了 IObservable。然而,可以理解,IEnumerable也可以被使用。 换言之,在本主题公开中IObservable和IEnumerable可以被看作是可互换的。参考若干组件之间的交互已经描述了上述系统、体系结构、环境等。应该理解,这样的系统和组件可以包括这些组件或其中指定的子组件,某些指定的组件或子组件,和/ 或附加的组件。子组件也可以被实现为在通信上被耦合到其他组件而不是被包括在父组件中的组件。此外,一个或多个组件和/或子组件可以结合成提供聚集功能的单个组件。各组件也可以与一个或多个其他组件进行交互,出于简要考虑在此未具体描述该组件,但本领域的技术人员均已知。此外,应该明白以上公开系统以及以下方法的各个部分可以包括或包含基于人工智能、机器学习或知识或规则的组件、子组件、进程、装置、方法或机制(例如,支持向量机、 神经网络、专家系统、贝叶斯信任网络、模糊逻辑、数据融合引擎、分类器等)。这样的组件和其它组件可以自动化执行某些机制或进程,由此使得系统和方法的各部分更为自适应、高效及智能。作为示例而非限制,为了表示第一事件流上的至少一个事件的持续时间,变换组件110或它的一个或多个子组件可使用这些机制来高效地确定或以其他方式推断生成第一流的附加的事件流。考虑到以上描述的示例性系统,参考图7-8的流程图将可以更好地理解依照所公开的主题实现的方法。尽管为了说明简洁起见,作为一系列框示出和描述了方法,但是,应该理解,所要求保护的主题不仅限于所描述框的顺序,一些框可以按与此处所描绘和描述的不同的顺序进行和/或与其它框重合地进行。此外,并非全部所示出的框都是实现下面所描述的方法所必需的。图7示出了一种创建点事件的事件流来表示持续时间的方法700。在附图标记710 处,接收来自外部事件流的至少一个事件。作为示例而非限制,来自外部事件流的事件可以是点事件。在附图标记720处,创建表示至少一个事件的持续时间的内部事件流。一般说来,包括至少一个事件的外部事件流被变换(例如,利用所创建的事件流来表示持续时间)成具有持续时间的事件流。内部事件流可以是为每一个事件创建的附加事件流,以便与每一个事件的持续时间相对应。作为示例而非限制,外部事件流可包括事件“A”、“B”和 “C”,其中创建有如下附加的事件流表示点事件“A”的持续时间的内部事件流“A’”;表示点事件“B”的持续时间的内部事件流“B’ ” ;以及,表示点事件“C”的持续时间的内部事件流 “C,”。图8描绘了一种利用具有持续时间的经建模事件流来查明各事件之间的重合的方法800。在附图标记810处,标识来自外部事件流的至少一个事件。在附图标记820处, 注入至少一个事件的内部事件流来表示该至少一个事件的持续时间。内部事件流可在来自第一事件流的至少一个事件开始后被注入。作为示例而非限制,可以从外部事件流对事件 “A”流传输,其中基于该从外部事件流的流传输可创建(例如,开始)内部事件流。此外,应该理解,可注入两个或更多事件的对应的附加事件流(例如,内部事件流),以便在该外部事件流上表示这些事件的持续时间。通过用所注入的内部事件流来表示至少一个事件的持续时间,具有有限持续时间或无限持续时间的各事件的持续时间被精确地表示。作为示例而非限制,无限持续时间事件可包括所注入的事件流,其中所注入的事件流可以是无限的, 以便表示该无限持续时间事件的无限持续时间。在附图标记830处,根据内部事件流来确定第一事件和第二事件之间的重合。如以上所讨论的,重合是第一事件与事件流上的第二事件或一组事件的持续时间相重叠的那部分持续时间。更一般的,重合标识各数据表之间的共同性,其中在数据表中的是例如事件流,且共同性是这两个事件的重叠。作为示例而非限制,第一事件和第二事件之间的重合可通过利用诸如 “GroupJoin,,、" Join,,、“Window,,、“BufferWithTime,,、“CombineLatest,,、 “BufferWithCoimt”之类的运算符来查明。通过利用经变换的事件流(例如,具有表示至少一个事件的持续时间的所注入的内部事件流的外部事件流),可使用各运算符来标识重合。如此处所使用的,术语“组件”和“系统”及其各种形式旨在表示与计算机相关的实体,其可以是硬件、硬件和软件的组合、软件、或执行中的软件。例如,组件可以是但不限于是,在处理器上运行的进程、处理器、对象、实例、可执行程序、执行的线程、程序和/或计算机。作为说明,在计算机上运行的应用和计算机都可以是组件。一个或多个组件可驻留在进程和/或执行的线程内,并且组件可位于一个计算机上和/或分布在两个或更多的计算机之间。在本文中使用的词语“示例性”或其各种形式意味着用作示例、实例或说明。在此被描述为“示例性”的任何方面或设计并不一定要被解释为相比其它方面或设计更优选或有利。此外,各示例只是出于清楚和理解的目的来提供的并且并不意味着以任何方式限制或约束所要求保护主题或本发明的相关部分。可以理解,本来可呈现不同范围的多个附加或替换示例,但出于简明的目的已被省略。如此处所使用,术语“推论”或“推断”通常指的是从经由事件和/或数据捕捉的一组观察结果来推理或推断系统、环境、和/或用户的状态的过程。可以使用推断来标识特定上下文或动作,也可以生成例如状态上的概率分布。推断可以是概率性的,即,基于对数据和事件的考虑,计算在感兴趣状态上的概率分布。推断也可以是指用于从一组事件和/或数据构成较高级别的事件的技术。这样的推断导致从一组观察到的事件和/或存储的事件数据构建新的事件或动作,不管事件在时间上是否紧密相关,以及事件和数据是来自一个还是多个事件和数据源。可采用各种分类方案和/或系统(例如,支持向量机、神经网络、 专家系统、贝叶斯信任网络、模糊逻辑、数据融合引擎……)来执行关于所要求保护主题的自动化和/或推断的动作。而且,对于在详细描述或权利要求书中使用术语“包括”、“包含”、“具有”、“含有” 或其它形式的变型而言,这样的术语旨在以类似于术语“包括”的方式体现包含性,如同“包括”在用作权利要求书中的过渡词时所解释的那样。为了为所要求保护主题提供上下文,图9以及以下讨论旨在提供对其中可以实现本主题的各方面的合适环境的简要、概括描述。然而,合适的环境只是示例并且并非旨在对使用范围或功能提出任何限制。尽管能够在可以在一台或多台计算机上运行的程序的计算机可执行指令的一般上下文中描述以上公开的系统和方法,但是,本领域的技术人员将认识到,各方面也可以与其他程序模块等相结合地实现。一般而言,程序模块包括执行特定任务或实现特定抽象数据类型的例程、程序、组件和数据结构等。此外,本领域技术人员可以理解,上述系统和方法可用各种计算机系统配置实现,包括单处理器、多处理器或多核处理器计算机系统、小型计算设备、大型计算机、以及个人计算机、手持式计算设备(例如,个人数字助理(PDA)、电话、 手表……)、基于微处理器或可编程消费者或工业电子设备等。各方面也可以在其中任务由通过通信网络链接的远程处理设备执行的分布式计算环境中实现。然而,所要求保护主题的某些方面,如果不是所有方面的话,可以在独立计算机上实施。在分布式计算环境中,程序模块可以位于本地和远程存储器存储设备中的一个或两者中。参考图9,示出了示例性通用计算机910或计算设备(例如,台式机、膝上型计算机、服务器、手持式设备、可编程消费或工业电子作品、机顶盒、游戏系统……)。计算机910 包括一个或多个处理器920、存储器930、系统总线940、大容量存储950、以及一个或多个接口组件970。系统总线940与至少上述系统组件通信地耦合。然而,可以理解,在其最简单的形式中,计算机910可包括耦合到存储器930的一个或多个处理器920,该一个或多个处理器920执行各种计算机可执行动作、指令和或组件。处理器920可以用通用处理器、数字信号处理器(DSP)、应用程序专用集成电路 (ASIC)、现场可编程门阵列(FPGA)或其它可编程逻辑设备、分立门或晶体管逻辑、分立硬件组件或被设计为执行此处描述的功能的其任意组合来实现。通用处理器可以是微处理器,但在替换方案中,处理器可以是任何处理器、控制器、微控制器、或状态机。处理器920 还可被实现为计算设备的组合,例如DSP和微处理器的组合、多个微处理器、多核处理器、 结合一个DSP核的一个或多个微处理器、或任何其它这种配置。计算机910可包括各种计算机可读介质或以其他方式与各种计算机可读介质交互以便于控制计算机910来实现所要求保护主题的一个或多个方面。计算机可读介质可以是能由计算机910访问的任何可用介质,并包含易失性和非易失性介质以及可移动、不可移动介质。作为示例而非限制,计算机可读介质可包括计算机存储介质和通信介质。计算机存储介质包括以用于存储诸如计算机可读指令、数据结构、程序模块或其它数据这样的信息的任意方法或技术来实现的易失性和非易失性、可移动和不可移动介质。计算机存储介质包括,但不限于,存储器设备(例如,随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)……)、磁存储设备(例如,硬盘、软盘、磁带盒、磁带……)、光盘(例如,紧致盘(CD)、数字多功能盘(DVD)……)、以及固态设备(例如, 固态驱动器(SSD)、闪存驱动器(例如,卡、棒、键驱动器……)……)、或者可用于存储所需信息并且可由计算机910访问的任何其他介质。通信介质通常以诸如载波或其他传输机制等已调制数据信号来体现计算机可读指令、数据结构、程序模块或其他数据,并包括任何信息传送介质。术语“已调制数据信号” 是指具有以在信号中编码信息的方式被设定或改变其一个或多个特征的信号。作为示例而非限制,通信介质包括诸如有线网络或直接线连接之类的有线介质,以及诸如声学、RFjl 外及其他无线介质之类的无线介质。上述的任意组合也应包含在计算机可读介质的范围内。存储器930和大容量存储950是计算机可读存储介质的示例。取决于计算设备的确切配置和类型,存储器930可以是易失性的(例如RAM)、非易失性的(例如ROM、闪存……)或是两者的某种组合。作为示例,基本输入/输出系统(BIOS),包括诸如在启动期间在计算机910内的元件之间传输信息的基本例程,可被存储在非易失性存储器中,而易失性存储器可担当外部高速缓存存储器以便于处理器920的处理等。大容量存储950包括相对于存储器930而言用于存储大量数据的可移动/不可移动、易失性/非易失性计算机存储介质。例如,大容量存储950包括但不限于,诸如磁盘或光盘驱动器、软盘驱动器、闪存存储器、固态驱动器、或记忆棒的一个或多个设备。存储器930和大容量存储950可包括或其中存储有操作系统960、一个或多个应用 962、一个或多个程序模块964和数据966。操作系统960用于控制和分配计算机910的资源。应用962包括系统和应用软件中的一个或两个,并且可通过存储在存储器930和/或大容量存储960中的程序模块964和数据966来利用操作系统950对资源的管理以执行一个或多个动作。因此,应用962可根据由此提供的逻辑来将通用计算机910变成专用机器。所要求保护主题的全部或各部分可以使用产生控制计算机以实现所公开功能的软件、固件、硬件或其任意组合的标准编程和/或工程技术来实现。作为示例而非限制,变换组件110可以是应用962或形成程序962的一部分,并且包括存储在存储器和/或大容量存储950中的一个或多个模块964和数据966,其功能可以在被所示的一个或多个处理器 920执行时实现。根据一个特定实施例,处理器920可与片上系统(SOC)或在单个集成电路基座上包括(或换言之集成)硬件和软件的类似体系结构相对应。此处,处理器920可包括至少与处理器920和存储器930相似的一个或多个处理器以及存储器等。常规处理器包括最少量的硬件和软件并且广泛依赖于外部硬件和软件。作为对比,处理器的SOC实现更强大,因为它将硬件和软件嵌入其中以能够用最少的硬件和软件或不依赖于外部硬件和软件来启用特定功能。例如,变换组件110和/或相关联的功能可被嵌入到SOC体系结构中的硬件内。计算机910还包括通信地耦合到系统总线940并方便与计算机910的交互的一个或多个接口组件970。作为示例,接口组件970可以是端口(例如,串行、并行、PCMCIA、USB、 火线……)或接口卡(例如,声音、视频……)等等。在一个示例实现中,接口组件970可被具体化为用户输入/输出接口,该用户输入/输出接口使得用户能够通过一个或多个输入设备(例如,诸如鼠标的定点设备、跟踪球、指示笔、触摸垫、键盘、话筒、操纵杆、游戏垫、圆盘式卫星天线、扫描仪、相机、其他计算机……)来将命令和信息输入到计算机910中。在另一示例实现中,接口组件970可被具体化为输出外围接口,该输出外围接口向显示器(例如,CRT、IXD、等离子……)、扬声器、打印机和/或其他计算机等提供输出。此外,接口组件 970可被具体化为网络接口,该网络接口使得能够诸如通过有线或无线通信链路与其它计算设备(未示出)通信。以上所已经描述的内容包括所要求保护主题的各方面的示例。当然,出于描绘所要求保护主题的目的而描述每一个可以想到的组件或方法的组合是不可能的,但本领域内的普通技术人员应该认识到,所要求保护主题的许多进一步的组合和排列都是可能的。从而,所公开的主题旨在涵盖落入所附权利要求书的精神和范围内的所有这样的变更、修改和变化。
权利要求
1.ー种便于对事件进行建模的方法,包括采用被配置来执行存储在存储器(930)中的计算机可执行指令以执行以下动作的至少ー个处理器(920)创建表示至少ー个点事件(704、804)的持续时间的事件流。
2.如权利要求1所述的方法,其特征在于,将包括所述至少ー个点事件的外部事件流变换成具有表示所述至少ー个点事件的持续时间的事件流的经建模事件流。
3.如权利要求2所述的方法,其特征在干,将所述经建模事件流与第二经建模事件流进行比较以标识至少两个点事件之间的重合。
4.如权利要求3所述的方法,其特征在干,将来自所述第二经建模事件流的至少ー个值投影到所述经建模事件流上以标识重合。
5.如权利要求3所述的方法,其特征在干,将所述经建模事件流和所述第二经建模事件流之间的至少ー对值进行匹配以标识重合,所述ー对值包括来自所述第二经建模事件流的与来自所述经建模事件流的值相重合的值。
6.如权利要求5所述的方法,其特征在干,将所述至少ー对值组合在表示重合的所得事件流上。
7.如权利要求1所述的方法,其特征在于,还包括将所述事件流用作收集与所述事件流相重合的事件的窗ロ;将所述事件流与第一事件流进行比较;以及基于来自所述第一事件流的点事件与所述事件流相重合而将所述点事件映射到所述窗口中。
8.ー种便于对事件进行建模的系统(100,200),包括耦合到存储器(930)的处理器(920),所述处理器(920)被配置来执行存储在所述存储器(930)中的以下计算机可执行组件变换组件(110),它被配置成为来自外部事件流的点事件生成内部事件流,所述内部事件流表示所述点事件的持续时间。
9.如权利要求8所述的系统,其特征在于,还包括评估组件,它被配置为标识来自所述外部事件流的至少ー个点事件;以及流エ厂组件,它被配置为至少部分地基于由所述评估组件标识出的所述至少一个点事件来管理所述内部事件流的持续时间。
10.如权利要求8所述的系统,其特征在于,还包括重合组件,它被配置为查明重合,所述重合是两个事件之间的持续时间的重叠。
全文摘要
本发明涉及反应性的重合。对外部事件流可进行建模,以用内部事件流来表示事件的持续时间。可生成内部事件流来表示来自外部事件流的至少一个事件的持续时间。通过对外部事件流建模以包括持续时间,可确定两个或更多事件之间的重合。更具体地,对外部事件流的建模使得能够使用运算符来标识来自事件流的各个事件间的重合。
文档编号G06F9/46GK102541636SQ20111043558
公开日2012年7月4日 申请日期2011年12月12日 优先权日2010年12月13日
发明者B·德斯梅特, C·J·米克, H·J·M·梅杰, J·W·戴尔, J·范格格 申请人:微软公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1