用于数据管理和检索的并行协同过程 【技术领域】
本发明涉及数据管理,并特别涉及用于数据管理和检索的并行协同过程(concurrent collaborative process)。
背景技术
除非这里另外指明,否则在这个部分中描述的方法不作为本申请中权利要求的现有技术,并且也并非承认要作为现有技术包括在这个部分中。
半导体工艺技术和计算机系统体系结构的改进正导致日益强大的硬件平台。例如,中央处理单元(CPU)正从单核心演进到多核心(multi-core)和众核心(many-core)实施方案,所述众核心实施方案具有多达16个或更多核心的CPU,其可以提供128个硬件线程。就存储器方面来说,片上存储器子系统(例如L1和L2高速缓存)正增加到10到50MB或更多的范围,并且128GB-0.5TB范围内的可承受的主存储器指日可待。对于网络带宽,1-100吉比特已变得司空见惯。结果,预期完全新的并且明显强大得多的硬件体系结构将变得可以合理的成本点(cost point)获得。
一直到最近为止,应用开发者仍在享受处理器速度的连续增加而不必改变其代码。但是,将来的程序将不能自动地受益于增加的处理器核心数量。相反,程序员和软件架构师需要新的软件体系结构和编程模型以接近新的可用计算资源。如果程序员不想把写并行程序的负担加给普通应用程序员,则需要新的运行时环境和高级(high-level)编程模型,一方面,所述运行时环境和高级编程模型将允许开发者像从前一样写顺序程序,另一方面,其通过利用可用数量的CPU/核心自动地以并行方式执行这些程序,并且其在吞吐量方面自动地随着CPU/核心数量缩放。所需要的是新的编程范例,它有效地使用新的计算能力,使得有可能管理和检索企业内部以及来自因特网(即外部信息源)的可为我们所用的海量的与业务相关的数据。
需要新方法的一个例子是在管理和访问资源描述框架(ResourseDescription Framework,RDF)数据的领域。RDF数据模型已经变成不仅用于Web数据注释或Web服务描述的著名表示模型,而且作为用于以支持其上的语义推理的方式表示实际数据的灵活数据模型,其中,在Web数据注释或Web服务描述中,RDF被用作语义元数据的表示模型。
RDF起初被设计为表达关于web资源的元数据,但是现在被用作表示和交换(RDF-XML)半结构化信息的一般方式。具体来说,RDF(以及OWL)是语义Web的基本数据格式之一,因此,在知识管理领域也正变得受到欢迎。RDF基于以下概念:可以用由主语、谓词(predicate)和宾语组成的三元组形式做出关于资源的语句(statement)。主语和宾语总是资源,而这样的语句的谓词可以是文字(literal)。这个几乎没有进一步约束的简单概念提供了一种以由通过谓词链接的主语和宾语节点形成的有向图(directed graph)的形式对信息建模的极为灵活的方式——因此,高度依赖于各应用使用什么样的约定(convention)来编码/解码RDF数据。
用于存储数据的传统技术的一个问题是大量数据必须被顺序地处理。例如,对于存储在表中的数据,查询必须顺序地检查数据的每一个元素或每一个数据行。又例如,RDF三元组一般被存储在例如三元组库(triple store)的数据库中,并使用例如SPARQL的专用查询语言进行查询。三元组库是为了存储和检索资源描述框架(RDF)元数据特意建造的数据库。和关系数据库非常相似,人们把信息存储在三元组库中,并通过查询语言对其进行检索。和关系数据库不同的是,三元组库对于存储和检索很多被称作三元组的短语句是最优化的,所述三元组是主语-谓词-宾语形式,像是“Bob为35岁(Bob is35)”或者“Bob knows Fred(Bob认识Fred)”。但是,在RDF查询中,和在其他形式的传统查询中一样,一次检查一个三元组。因此,数据管理和访问在计算上极为密集,并且极为耗时。例如,在某些关系数据库管理系统中,将数据分区以便在不同分区上并行地执行查询。但是,数据分区很复杂,并且将数据分区的最好方式一般取决于手头上的具体查询。
因此,存在对改进的数据管理和访问技术的需求。本发明通过提供用于数据管理和检索的并行协同过程解决这些以及其他问题。
【发明内容】
本发明的实施例使用多个过程改进数据管理和访问。在一个实施例中,本发明包括一种计算机实施的方法,该方法包含:产生多个过程,其中,每一个过程代表一个资源,并且每一个过程存储状态信息,所述状态信息包含:第一标识符,用于指定其中存储第一标识符的过程,一个或更多个第二标识符,用于指定表示其他资源的其他过程,和一个或更多个链接类型,用于指定由其中存储链接类型的过程表示的资源和由第二标识符其中之一指定的另一过程表示的另一资源之间的关系类型,其中,每一个第二标识符具有至少一个相关联的链接类型;在一个或更多个过程中接收查询消息;在所述多个过程的每一个中,同时处理查询消息,并根据其访问状态信息;和响应于查询返回所访问的状态信息。
多个过程可以每一个过程并行运行。每一个过程可以是可在不同线程上执行的独立软件程序。在一个实施例中,每一个过程被在多个中央处理单元上的不同线程上执行。
在一个实施例中,链接类型是单向的,指定由第一过程代表的第一资源和由第二过程代表的第二资源之间的有向关系。
在一个实施例中,资源包含RDF主语和RDF宾语,并且链接类型是RDF谓词。
在一个实施例中,第二标识符和链接类型包含元组,以使每一个第二标识符具有一个相关联的链接类型。
在一个实施例中,每一个过程包括多个用于处理不同消息的逻辑语句。
在一个实施例中,消息被在每一个过程中独立地处理。
在一个实施例中,跨越公共软件层在过程之间传送消息。
在一个实施例中,每一个过程连续地通过多个消息处理逻辑语句循环,并且其中,当接收到的消息和所述消息处理逻辑语句其中之一匹配时,过程执行特定于接收到的消息的对应消息逻辑。
在一个实施例中,被访问的状态信息包含第二标识符中的一个或更多个和链接类型。
在一个实施例中,所述的方法还包含把消息转发到由所述一个或更多个被访问的第二标识符指定的过程。
在一个实施例中,如果和被访问的标识符相关联的链接类型具有第一值,则消息被转发到由被访问的标识符指定的过程,并且,如果和被访问的标识符相关联的链接类型具有第二值,则消息不被转发到由被访问的标识符指定的过程。
在一个实施例中,被访问的状态信息包括所存储的第二标识符,并且所述方法还包含:在公共存储器位置存储第二标识符;把第一消息发送到由第二标识符指定的其他过程;和从每一个所述其他过程接收确认。对于接收第一消息的每一个过程,如果接收过程包括所存储的指定其他过程的标识符,则接收过程把标识符存储在公共存储器位置,产生给由所存储的接收过程的标识符指定的其他过程的一个或更多个消息;并且在接收到响应于所述一个或更多个消息的确认后发送确认到产生第一消息的过程,并且,如果接收过程不包括所存储的指定其他过程的标识符,则过程以确认对第一消息做出响应。
在另一个实施例中,本发明包括一种计算机实施的系统,包含:一个或更多个处理器和多个过程,其中,每一个过程均代表一个资源,并且每一个过程存储状态信息,所述状态信息包含:第一标识符,用于其中存储第一标识符的过程,一个或更多个第二标识符,用于指定表示其他资源的其他过程,和一个或更多个链接类型,用于指定由其中存储链接类型的过程表示的资源和由第二标识符其中之一指定的另一过程表示的另一资源之间的关系类型,其中,每一个第二标识符具有至少一个相关联的链接类型,并且其中,在一个或更多个过程中接收查询消息,每一个过程同时处理查询消息,并根据其访问状态信息,并且,所述过程中的一个或更多个响应于查询返回所访问的状态信息。
在一个实施例中,每一个过程是在多个中央处理单元上的不同线程上执行的独立的可并行执行的软件程序。
在一个实施例中,查询消息被多个所述过程并行地处理。
在一个实施例中,被访问的状态信息包含第二标识符中的一个或更多个和链接类型。
在一个实施例中,消息被转发到由所述一个或更多个被访问的第二标识符指定的过程。
在一个实施例中,如果和被访问的标识符相关联的链接类型具有第一值,则消息被转发到由被访问的标识符指定的过程,并且,如果和被访问的标识符相关联的链接类型具有第二值,则消息不被转发到由被访问的标识符指定的过程。
在一个实施例中,被访问的状态信息包括所存储的第二标识符,并且其中,第二标识符被存储在公共存储器位置,第一消息被发送到由第二标识符指定的其他过程,并且从每一个所述其他过程接收确认,并且其中,对于接收第一消息的每一个过程,如果接收过程包括所存储的指定其他过程的标识符,则接收过程把标识符存储在公共存储器位置,产生给由所存储的接收过程的标识符指定的其他过程的一个或更多个消息;并且在接收到响应于所述一个或更多个消息的确认后发送确认到产生第一消息的过程,并且,如果接收过程不包括所存储的指定其他过程的标识符,则过程以确认对第一消息做出响应。
在另一个实施例中,本发明包括具体实施用于执行这里描述的方法和技术的计算机程序的计算机可读介质。所述计算机可读介质可以包括指令,用于对具有一个或更多个处理器的计算机系统或多个计算机系统编程以执行这里所描述的方法和技术。在一个实施例中,所述计算机可读介质包括用于执行一种方法的程序,所述方法包含:产生多个过程,其中,每一个过程代表一个资源,并且每一个过程存储状态信息,所述状态信息包含:第一标识符,用于其中存储第一标识符的过程,一个或更多个第二标识符,用于指定表示其他资源的其他过程,和一个或更多个链接类型,用于指定由其中存储链接类型的过程表示的资源和由第二标识符其中之一指定的另一过程表示的另一资源之间的关系类型,其中,每一个第二标识符具有至少一个相关联的链接类型;在一个或更多个过程中接收查询消息;在所述多个过程的每一个中,同时处理查询消息,并根据其访问状态信息;和响应于查询返回所访问的状态信息,其中,所述标识符是唯一的,并且其中,每一个过程是在多个中央处理单元上的不同线程上执行的独立的可并行执行的软件程序,并且其中,链接类型是单向的,指定由第一过程代表的第一资源和由第二过程代表的第二资源之间的有向关系,并且其中,查询消息被多个所述过程并行地处理。
下面的详细描述和附图提供了对本发明的性质和优点的更好的理解。
【附图说明】
图1示出了根据本发明的一个实施例的并行协同过程。
图2示出了用于根据本发明的一个实施例的并行协同过程的软件体系结构。
图3示出了根据本发明的一个实施例的查询过程。
图4示出了根据本发明的一个实施例的过程之间的关系。
图5A到图5B示出了根据本发明的一个实施例的并行协同过程的一个例子。
图5C示出了根据本发明的一个实施例的并行协同过程的另一个例子。
图6示出了用于实施根据本发明的一个实施例的过程的硬件系统。
【具体实施方式】
这里描述了用于管理和访问数据的过程。在下面的描述中,为了说明的目的,给出了许多例子和具体的细节,以便提供对本发明透彻的理解。但是,本领域技术人员将清楚,由权利要求限定的本发明可以单独地或者和下面描述的其他特征相结合地包括这些例子中的一些或者全部特征,并且还可以包括这里描述的特征和概念的修改和等同物。
本发明的实施例包括关于如何通过一组并行协同过程来管理数据以便利用通过现代硬件体系结构可获得的愈加可用的计算能力的新颖和创新方法。所述方法允许系统利用越来越多的CPU核心和可用的主存储器在请求吞吐量方面缩放并改善数据密集查询的响应时间,而不要求系统体系结构或软件程序的任何变化。
在这种新方法中,数据不再被视为存储在数据库(例如用于RDF的三元组库)或其他的存储机制中的被动实体(passive entitiy),相反,数据由系统中并行运行的过程表示。关于数据元素之间的关系的信息由过程在本地维护。数据元素可以被称作资源。数据分布在多个过程中,并且查询求值(queryevaluation)由这些过程共同完成。在一个实施例中,查询消息同时被每一个过程接收并求值。在另一个实施例中,这些过程通过把消息向彼此传递并对其本地状态信息执行操作来对查询求值。因此,不是在关系数据库中顺序地检查数据(例如,逐一地读取表格的行),本发明的实施例包括在所述多个过程的每一个中同时处理查询消息以及访问状态信息,并依赖于可用硬件线程、CPU/核心的数量、查询的复杂度和数据量在有可能少得多的时间内返回结果。由每一个过程表示的数据可以被各个过程保存和维护,以便允许从像电源故障或者主存储器损坏的系统级错误中恢复。不同存储机制,例如本地文件系统或者专用存储库(dedicated store),可被用于持久存储。
在一个实施例中,本发明包括多个用于存储数据的过程。所述过程包括用于指定表示其他资源的其他过程的标识符。在一个实施例中,所述过程存储用于指定由该过程表示的资源和由其他过程表示的其他资源之间的关系类型的链接类型。过程可以表示数据元素,并且链接可以表示数据之间的关系。通过把消息发送到过程,可以跨数据并行执行查询。在一个实施例中,过程表示RDF主语和RDF宾语,并且链接表示RDF谓词。通过在一个或更多个CPU上的不同线程上同时执行这些过程,可以并行执行针对满足预先定义的准则或关系的RDF数据的查询。
图1示出了根据本发明的一个实施例的并行协同过程。过程101-113可被用来存储数据和数据之间的关系。例如,每一个过程可以表示一个资源,并且每一个过程可以存储可被查询访问的信息(状态信息)。因此,查询消息可以从多个过程同时检索信息。如这里所使用的那样,要理解“同时”被在软件意义上使用而非严格精确的意义。在图1中所示的例子中,每一个过程包括相同的结构。例如,过程101可以是独立于过程102、103和其他过程的独立软件程序(或实例)。每一个过程可以包括用于接收和发送消息和执行操作的消息/逻辑121。例如可以接收查询消息,并且每一个过程可以响应于所述查询而访问本地存储的数据,并且如果满足某些条件,则发送该数据。
本发明的特征和优点包括捕获并存储数据之间的关系。在这个例子中,每一个过程表示一个资源,并且每一个过程包括存储器123,用于存储包含标识符(identifier)124或链接类型(link type)125或者这二者的状态信息。每一个过程可以存储用于其自身的标识符(即,用于指定其中存储了该标识符的过程的标识符)。具体来说,过程101可以存储例如数字(例如101)或字符的标识符,其可被用来向其他过程或者软件组件表示过程101。此外,每一个过程可以存储用于指定表示其他资源的其他过程的标识符。再有,每一个过程可以存储一个或更多个链接类型,用于指定由其中存储了该链接类型的过程所表示的资源和由标识符中的一个标识符指定的另一过程所表示的另一资源之间的关系。例如,过程101可以存储用于指定过程102、103、104和105的标识符。这些标识符可以是和每一个过程所表示的资源相关联的数字{102,103,104,105}或者字符串(例如,名称)。通过在本地存储器123中存储这些标识符,从而由过程101表示的资源和由过程102-105表示的资源有了关联。此外,可以从链接类型确定关系的类型。例如,过程101可以存储和每一个标识符相关联的链接类型。因此,可以指定由过程101表示或存储在其中的数据和其他过程的数据之间的关系。作为一个具体的例子,如果过程101表示特定的人并且过程102表示另一个具体的人,则标识符在这两个人之间建立起关系,并且链接类型指定了关系的类型(例如Fred(过程101))是John(过程102)的父亲。因此,如果查询消息搜索特定的关系(例如找到John的父亲),则所有的过程都将同时地分析该查询,并且过程中的一个或更多个(过程101-Fred)将返回结果(例如过程101可以发送其标识符,指示其代表是John的父亲的Fred)。
如图1中所示,依赖于数据量,可以产生任意数量的过程。在一个实施例中,这些过程并行运行。如上所述,每一个过程均可以独立于其他的过程。例如,这些过程可以是在不同线程上执行的独立的软件程序(或者程序的实例)。此外,每一个过程可以被在多个不同的中央处理单元(“CPU”)上的不同线程上执行。
图2示出了用于根据本发明的一个实施例的并行协同过程的软件体系结构。如上所述,用于表示数据的多个过程可以包括其自身的标识符(“<my_id>”),一个或更多个由其他过程表示的相关数据的标识符(“<ID>”),以及链接类型(“link_type”)。这个例子示出了过程201、202,以及直到203的更多过程。这些过程是可以通过公共软件层210接收消息或发送消息或二者皆有的独立地可执行组件。软件层210可以形成过程管理框架,用于例如使用对应于每一个过程并存储在所述每一个过程中的唯一ID把消息发送到特定过程。软件层210可以被作为可在一个或更多个计算机系统上执行的一个或更多个软件组件植入。在这个例子中,过程管理框架从每一个过程201-203发送和接收消息。过程管理框架进而和不同计算机系统上的一个或更多个操作系统交互。这里,框架210和一个计算机系统上的操作系统220以及另一个计算机系统上的操作系统221交互。示范性交互可以包括接收用于开始过程、查询消息、本地存储器管理、数据在例如磁盘驱动器、快闪存储器或其他形式的非易失性存储器中的持久存储的指令。要理解,框架210和过程201-203可以在例如网络上的服务器的多个计算机系统上运行。在这个例子中,过程可在多个CPU 230-233上执行。每一个过程可以被分配到不同的线程,并且每一个线程可以被分配到不同的CPU,以使这些过程可以被并行执行。
图3示出了根据本发明的一个实施例的查询过程。在这个例子中,在过程管理框架310中接收查询消息。查询可以被发送到每一个过程301-303。每一个过程301-303可分别在不同的对应线程350-353上执行。因此,每一个过程可以同时接收并处理查询消息。在这个例子中,查询消息被框架310接收。查询消息被从框架发送到每一个过程。每一个过程同时分析该查询消息。具体来说,在不同线程上执行的每一个过程可以接收查询,访问在本地存储的数据(例如ID和链接类型),并确定查询约束(constraint)是否被满足。这里,过程303可以满足该查询,并通过把消息发送回框架310来返回结果。因此,对数据的查询和相关联的对数据的访问和分析可以被每一个过程并行处理,而非一次一行地顺序地分析数据表的内容。
图4示出了根据本发明的一个实施例的过程之间的关系。在这个例子中,每一个过程存储其自身的标识符,一个或更多个其他过程的标识符,以及链接类型。这里,链接类型是单向的,指定了由第一过程表示的第一资源和由第二过程表示的第二资源之间的有向关系。例如,一个过程401可以表示人物“Tom”,并且另一个过程402可以表示另一个人物“Frank”。过程401可以存储过程402的标识符,以便在数据元素之间建立起关系。此外,过程401可以存储指定关系类型为“是...的朋友(a friend of)”的单向链接类型406。因此,存储在过程401中的标识符和链接类型指示“Frank”是“Tom”的“朋友”。表示“Frank”的过程402可以进而存储对应于过程404和403的标识符以及用于指定关系的链接类型。如果过程404表示“Jim”并且和过程404的标识符相关联的链接类型指定了关系为“是...的兄弟(a brother of)”,则这个信息确立“Jim”是“Frank”的“兄弟”。类似地,如果过程403表示“John”并且和过程403的标识符相关联的链接类型指定关系为“是...亲戚(a relative of)”,则这个信息确立“John”是“Frank”的“亲戚”。在这个例子中,过程403存储过程404的标识符和相关联的链接类型407,并且过程404存储过程403的标识符和相关联的链接类型408。这个具有两个单向链接类型的信息在过程403和过程404之间建立起双向关系。使用上面的例子,过程404可以存储链接类型-“是...的儿子”,它指示了由过程403表示的人物(“John”)是由过程404表示的人物(“Jim”)的“儿子”。类似地,过程403可以存储链接类型-“是...的父亲”,它指示由过程404表示的人物(“Jim”)是由过程403表示的人物(“John”)的“父亲”。
从上面的描述可以看出,基于关系的查询可以跨越所有数据元素快速并且高效地实施。例如,查询消息可以请求:返回Frank的所有亲属(或者“谁是Frank的亲属”)。每一个过程都可以接收该查询,并且每一个过程都可以访问在本地存储的标识符和链接类型。在这个示范性查询中,“亲属”可以包括“是...的亲戚”、“是...的兄弟”、“是...的父亲”、“是...的儿子”,等等。因此,过程402将访问在本地存储的标识符,确定该查询指向其自己(因为过程402表示Frank),然后返回所有具有在范畴“亲戚”中的相关联链接类型的标识符。在这个例子中,过程403和过程404的标识符被返回,因为“亲属”被定义为包括“是...的兄弟”和“是...的亲戚”。
例子
图5A到图5B示出了根据本发明的一个实施例的并行协同过程的例子。在这个例子中,通过一组并行协同过程来管理资源描述框架(RDF)资源和相关数据,以便利用通过现代硬件体系结构可获得的愈加可用的计算能力。在这个例子中,RDF是底层(underlying)数据模型,用于描述这里展示的实施例,但是,本发明的其他实施例可以与其他的数据模型一起使用,例如其中数据被以有向图的形式表示。使用RDF描述电子资源和这些资源的语义性质。RDF资源可以包括通过“谓词”相关的“主语”和“宾语”。在这个例子中,唯一的RDF资源是通过唯一的谓词与宾语相关的唯一的主语。这里,RDF主语和宾语不再被视为存储在数据库(三元组库)或者其他的存储机制中的被动实体。相反,主语或宾语,或者这两者都由在系统中并行运行的过程表示。关于RDF谓词的信息被过程以如上所述的链接类型的形式在本地维护。每一个过程只维护关系到其正表示的主语或宾语的谓词的一个小的子集。RDF主语和RDF宾语被更一般地称为RDF资源。过程通过从公共软件层接收消息和/或通过把消息通过该层向彼此传递并对其本地状态信息执行操作来对查询求值。
在这个例子中,不存在存储所有的RDF数据(三元组)的单个库。相反,数据分布在各个过程中,并且查询求值由这些过程共同完成。由每一个过程表示的RDF数据可以被各个过程保存和维护,以便允许从像是电源故障或者主存储器损坏的系统级错误中恢复。不同存储机制,例如本地文件系统或者专用RDF库,可被用于持久存储。
如上所述,每一个RDF资源由系统中运行的过程表示。该过程可以由和RDF资源一样的名字标识。RDF资源之间的链接被作为过程内的状态信息维护(例如作为和存储在过程中的标识符相关联的“链接类型(link_type)”)。
图5A示出了示范性RDF图。这里,使用数字命名资源,但是可以使用任意名称(例如,可以使用任意串来命名资源)。对于资源<1,2,3,4,5,6,7,8,9>中的每一个,在系统中创建一个过程,并且每一个过程均代表不同的资源。每一个过程所代表的资源被作为标识符(例如数字、串,等等)存储在过程中。这里,过程也被命名为<1,2,3,4,5,6,7,8,9>,以使命名为1的过程是命名为1的资源的虚拟表示,依此类推。因此,过程1存储指示该过程表示命名为“1”的资源的标识符“1”。在图5A中的RDF图中,RDF资源之间的链接由节点之间的边示出。在系统中,这些链接由本地过程状态中维护的信息表示。为了更好地对此加以说明,下面的表示出了针对图5A中的RDF图在每一个过程处维护的标识符和链接类型状态信息。
过程名称 状态信息 <标识符,链接类型>
1 <2,链接类型> <3,链接类型> <6,链接类型>
2 <1,链接类型> <5,链接类型>
3 <1,链接类型> <4,链接类型> <9,链接类型>
4 <3,链接类型>
5 <2,链接类型>
6 <1,链接类型>
<7,链接类型> <9,链接类型>
7 <6,链接类型> <8,链接类型>
8 <7,链接类型>
9 <3,链接类型> <6,链接类型>
在这个例子中,作为系统中的各个过程的共同动作对RDF查询求值。无需单个过程依次经过整个资源数据集合以获得结果。过程通过把消息向彼此传递(例如通过公共软件层)来通信。所有的过程可以通过其名称寻址。在某些实例中,通过过程把其状态信息的子集作为消息向彼此传递来发生查询执行。过程之间的这种信息交换的结果导致查询被求值(即,在给定查询的结果数据中)。如上所述,这些过程可以包括多个用于处理不同消息的逻辑语句。这里的示范性过程可以只响应于接收到消息而执行动作。每一个过程可以连续地经过多个消息处理逻辑语句循环,直到接收到消息为止。当接收到的消息和消息处理逻辑语句其中之一匹配时,该过程可以执行特定于所接收到的消息的对应消息逻辑。动作的结果可以包括另一个消息,所述消息或者被发送到从其接收到初始消息的过程,或被发送到其他过程,或者例如公共软件层。
用于示范性RDF数据的查询求值协议是示意性的,用于说明本发明额外的特征和优点。在这个例子中,图5A中的顶点/节点表示人物,并且这些顶点之间的边表示“是...的朋友”关系。因此,边7-8表示7是8的朋友。在这个例子中的边或者链接是双向的,所以这意味着8也是7的朋友。类似地,6和9是彼此的朋友,依此类推。要理解,这个技术可应用于任意大的RDF图,或者一般的有向图。为了说明的目的,使用下面的符号:
{}-从一个过程发送到另一个的消息。
<>-过程的本地状态。
出于这个例子的目的,这些值在图5B中列出。
系统中的过程执行相同的算法。每一个过程所执行的示范性算法如下:
Start
等待,直到消息到达为止
If消息的形式是{add,Resource}-Resource=<id,link_type>
{
向my state添加资源-把id和链接类型存储在本地存储器中
}
If消息的形式是{remove,Resource}-Delete a Resource
{
从my state去除资源
}
If消息的形式是{get_linked_resources}
{
把包含my state的消息发送到从其接收到这个消息的过程
}
If消息的形式是{foaf}
{
对于my local state中的每一个值
{
把消息{get_linked_resources}发送到由值命名的每一个过程
}
-从{get_linked_resources}被发送到的所有过程收集回复形成单个列表
-对于my local state中的每一个值
{
从前一步骤中创建的列表中删除值
}
-把列表的内容发送到从其接收到这个消息的过程
}
If消息的形式是{allf}
{
创建由我自己的名称‘MyName’调用的共享存储器哈希表
对于my local state中的每一个值
{
-在共享表‘MyName’中插入值
-把消息{MyName,allf}发送到由值命名的每一个过程
}
-等待来自消息被发送到的所有过程的确认
-一旦所有确认被接收,创建并发送共享表的内容到发送这个消息
的过程
}
If消息的形式是{SomeName,allf}
{
If该查询以前已被求值
{
把确认发送到发送这个消息的过程
}
Else
{
对于my local state中的每一个值
{
If值存在于共享表SomeName中
空操作
Else
{
-把值插入共享表
-把消息{SomeName,allf}发送到由值命名的过程
}
}
-等待来自消息被发送到的所有过程的确认
-把确认发送到从其接收到这个消息的过程
}
}
End.
可以使用示范性查询说明上面的由每一个过程实施的协议。作为第一个例子,查询1可以寻求对资源‘1’的所有朋友求值。首先,通过把消息{allf}发送到过程‘1’从外部触发该查询。接着,过程‘1’创建存储器区域,所述存储器区域是全局的,并且能够被所有的过程访问。这个区域可以被称为‘ets1’。例如,‘哈希表’数据结构可以被用于这个共享区域。尽管多个过程对其更新并读取,但是在这个共享区域上不需要同步。然后,过程‘1’经历其本地状态<2,3,6>,把2、3和6中的每一个添加到ets1,并把消息{ets1,allf}发送到过程‘2’、‘3’和‘6’(因为‘2’、‘3’和‘6’是在其本地状态中列出的那些)。接着,过程‘1’一直等待到其从‘2’、‘3’和‘6’接收到确认为止。
所有其他过程在它们接收到消息{ets1,allf}时执行接下来的步骤。这里,为了简洁,只列出了过程‘3’和过程‘8’采取的动作。首先,如图5B中所示的过程‘3’的本地状态是<1,4,9>。对于其本地状态中的这三个值中的每一个,过程‘3’检查该值是否存在于est1中。如果存在,则什么也不做。如果不存在,则其把该值添加到ets1,并把消息{ets1,allf}发送到由名字命名的过程。然后,过程‘3’等待对其已经发送的所有消息的确认。一旦过程‘3’接收到其期望的所有确认,其把确认发送回过程‘1’。图5B示出过程‘8’将只从过程‘7’接收消息,因为‘7’是其具有的唯一朋友关系。截至此时,‘7’已经被过程‘6’添加到‘ets1’。因此,过程‘8’只把确认发送回过程‘7’。当过程‘1’接收到其正期望的所有确认时,查询求值完成。查询的结果被包含在共享存储器区域‘ets1’中。在这种情况下,结果是<2,3,4,5,6,7,8,9>。然后,过程‘1’可以把这个区域的内容发送到触发所述查询的外部实体。
可以使用示范性查询说明上面的由每一个过程实施的协议。作为第一个例子,查询2可以对资源‘1’的所有一级(one-level)间接朋友求值。‘1’的一级间接朋友是<4,5,7,9>。首先,通过把消息{foaf}发送到过程‘1’从外部触发该查询。接着,过程‘1’经历其本地状态<2,3,6>,并把消息{get_linked_resources}发送到过程‘2’、‘3’和‘6’中的每一个。然后,过程‘2’、‘3’和‘6’中的每一个把其本地状态发送到过程‘1’。例如,过程‘2’发送<1,5>,‘3’发送<1,4,9>,并且‘6’发送<1,7,9>。一旦过程‘1’接收到‘2’、‘3’和‘6’的状态,其把这各个回复进行组合以形成列表<4,5,7,9>。然后,这个结果被发送到触发实体。
图5C示出了根据本发明的一个实施例的并行协同过程的另一个例子。这个例子涉及医疗数据的管理和访问。在这个例子中,标记为R1到R4的顶点/节点表示药物,标记为D1到D5的节点表示疾病,并且节点S1到S7表示症状。R节点和D节点之间的边表示“治疗(cure)”关系。因此,边R1-D3表示药物(drug)R1治疗疾病(disease)D3。D节点和S节点之间的边表示“症状(symptom)”关系。因此,边D1-S2指示疾病D1具有症状S2。这个例子中的链接是单向的,如图4中的箭头所指示的那样。要理解,为了说明的目的,这里使用了简单的例子,但是所述方法可应用于任意大的数据集合或者RDF图。
图5C中所示的每一个节点由系统中的正运行的过程表示。在这个例子中的每一个节点维护状态信息,所述状态信息包括其链接到的节点(即标识符)的列表和链接的类型(即,链接类型)的描述。下面的表列出了由每一个过程维护的状态:
过程名称 状态信息
R1 <(D3治疗)>
R2 <(D1治疗),(D2治疗),(D4治疗)>
R3 <(D4治疗)>
R4 <(D3治疗),(D5治疗)>
D1 <(S1症状),(S2,症状)>
D2 <(S3症状),(S5症状)>
D3 <(S2症状),(S7症状)>
D4 <(S4症状)>
D5 <(S5症状),(S6症状),(S7症状)>
可以通过把消息传递到每一个过程并在过程之间传递来对查询求值。例如,查询消息可以为如下内容:
“对于给定的药物对,找出它们是否治疗具有某些相同症状的疾病”
为了对这个查询求解,每一个节点可以实施下列算法:
Start
等待,直到消息到达为止
If消息的形式是{add,Resource,Link-Type}
{
把资源、链接类型添加到my state
}
If消息的形式是{remove,Resource}
{
从my state去除资源
}
If消息的形式是{get_linked_resources,Link-Type}
{
-把包含链接到我(按给定链接类型)的资源的列表的消息发送到从其接收到这个消息
的过程。
}
If消息的形式是{get_linked_resources,Link-Type,SomeName}
{
-把链接到我(按给定链接类型)的资源的列表插入通过SomeName引用的共享表
-把确认发送回从其接收到这个消息的过程。
}
If消息的形式是{get_symptoms_by_drug,SomeName}
{
对于按链接类型‘cures’链接到我的每一个资源
{
-把消息{get_linked_resources,symptom,SomeName}发送到代表资
源的过程
}
-等待来自{get_linked_resources,symptom}消息被发送到的所有过程的确认
-把确认发送回从其接收到这个消息的过程
}
If消息的形式是{compare,SomeDrug}
{
-T1=创建由我自己的名称‘MyName’调用的共享存储器表
-T2=创建名为SomeDrug的另一个共享表
-把消息{get_symptoms_by_drug,T2}发送到表示SomeDrug的过程
-对于按链接类型’cures’链接到我的每一个资源
{
-把消息{get_linked_resources,symptom,T1}发送到表示资源的过
程
}
-等待来自消息被发送到的所有过程的确认
-If任何来自T1的值存在于T2中
○返回结果‘true’
Else
○返回结果‘false’
}
End.
可以使用示范性查询说明上面的由每一个过程实施的协议。示范性查询如下:
“找出R2和R4是否治疗具有某些共同症状的疾病”
查询按如下步骤处理。首先,通过把消息{compare,R4}发送到‘R2’从外部触发查询。接着,R2创建两个共享表‘ets1’和‘ets2’。然后,‘R2’将消息{get_symptoms_by_drug,ets2}发送给‘R4’。‘R2’也把消息{{getlinks,symptom},ets1}发送到每一个其链接的疾病(即‘D1’、‘D2’和‘D4’)。然后,‘R2’一直等待到其从‘R4’、‘D1’、‘D2’和‘D4’接收到确认为止。当D1’、‘D2’和‘D4’中每一个均接收到消息{{getlinks,symptom},ets1}时,它们找到其链接的症状,并将其存储在ets1中。‘D1’存储‘S1’和‘S2’,‘D2’存储‘S3’和‘S5’。‘D4’存储‘S4’。然后,‘D1’、‘D2’和‘D4’把确认发送回‘R2’。当‘R4’从‘R2’接收到消息{get_symptoms_by_drug,ets2}时,其把消息{{getlinks,symptom},ets2}发送到其链接的疾病(即‘D3’和‘D5’)。然后,‘R4’等待来自‘D3’和‘D5’的确认。当‘D3’和‘D5’中的每一个接收到消息{{getlinks,symptom},ets2}时,它们找到其链接的症状,并将其存储在ets2中。‘D3’存储‘S2’和‘S7’。‘D5’存储‘S5’和‘S6’和‘S7’。然后,‘D3’和‘D5’把确认发送回到‘R4’。当‘R4’从‘D3’和‘D5’接收到确认时,其发送确认到‘R2’。当‘R2’接收到所有确认时,其比较两个表ets1和ets2。在这种情况下,ets1包含S1、S2、S3、S4、S5,并且ets2包含S2、S5、S6和S7。由于ets1和ets2共同包含S2和S5,所以由‘R2’返回的结果为‘true’。
图6示出了用于实施根据本发明的一个实施例的过程的硬件系统的简化图。计算机系统610包括一个或更多个总线605,或者其他的用于传送信息的通信机制,以及一个或更多个和总线605耦合、用于处理信息的中央处理单元(“CPU”或者“处理器”)601A-N。要理解,实际的实施方案可能变化,并包括额外的用于管理多个CPU的多CPU部件。计算机系统610也包括一个或更多个耦合到总线605、用于存储要由处理器601执行的指令和信息的存储器602,所述指令和信息包括用于执行例如上面描述的技术的信息和指令。这个存储器也可以被用于存储变量或要被处理器601执行的指令执行期间的其他中间信息。这个存储器可能的实施方案可以是,但不限于:随机访问存储器(RAM)、只读存储器(ROM),或者这两者。还提供存储设备603用于存储信息和指令。存储设备的常见形式包括例如硬驱动器、磁盘、光盘、CD-ROM、DVD、快闪存储器、USB存储卡,或者计算机可以读取的任何其他介质。存储设备603可以包括例如源代码、二进制代码,或者用于执行这些技术或具体化上面结构的软件文件。
计算机系统610可以通过总线605耦合到显示器612,显示器612例如阴极射线管(CRT)或液晶显示器(LCD),用于向计算机用户显示信息。例如键盘和/或鼠标的输入设备611被耦合到总线605,用于把来自用户的信息和命令选择传送到处理器601。这些组件的组合允许用户和系统通信。在某些系统中,总线605可以被划分为多个专用总线。
计算机系统610也包括和总线605耦合的网络接口604。网络接口604可以在计算机系统610和本地网络620之间提供双向数据通信。网络接口604可以是例如通过电话线提供数据通信连接的数字订户线(DSL)或者调制解调器。网络接口的另一个例子是提供到可兼容LAN的数据通信连接的局域网(LAN)卡。使用无线电频率通信的无线链接是另一个例子。在任何这样的实施方案中,网络接口604发送和接收携带表示各种类型的信息的数字数据流的电子、电磁,或光信号。
计算机系统610可以通过网络接口604向内联网或国际互联网630发送和接收信息,包括消息或其他接口动作。在国际互联网的例子中,软件组件或者服务可以驻留在网络上的多个不同的计算机系统610或服务器631-635上。上面描述的过程可以被在例如一个或更多个服务器上实施。服务器631可以通过国际互联网630、本地网络620和网络接口604将来自一个组件的动作或者消息发送到计算机系统610上的组件。例如,不同的过程可以被实施在任何计算机系统上,并在网络上发送和/或接收信息。在一个实施例中,上面描述的技术可以被例如在一个或更多个服务器631-635上的软件服务实施。
上面的描述示出了本发明的各种实施例,以及本发明的方面可以被如何实施的例子。上面的例子和实施例不应被视为唯一的实施例,而是被给出以说明由下面的权利要求限定的本发明的灵活性和优点。基于上面的公开和下面的权利要求,其他结构、实施例、实施方案和等同物对于本领域技术人员来说将是明显的,并且可以在不偏离由权利要求限定的本发明的精神和范围的情况下被采用。