主导节点负责分配图处理任务,工作节点负责计算。然后工作节点负责顺序执行用户定义的超步操作,对于每一个超步操作我们都由用户定义的funct1n来执行。在每个超步步骤中,各个节点执行相同的用户定义函数来处理数据,更新自身的状态乃至更改整个图的拓扑结构。PREGEL完成上述的启动后发明首先定义了一个图的起始点,然后以该起始点作为起点获得与该点连通的所有的点,然后通过sendmessage方式将之前计算好的信息发送给所有的点,再聚合这个结果,聚合消息要求产生消息队列的最小集合,然后第一个超步计算完成,第一个超步将计算的结果传给第二个超步,第二个超步从第一个超步当中获得消息队列并且取出节点,计算与该节点相连接的所有节点,然后把这个计算的结果发送给所有的点,再聚合这个结果得到一个消息队列的最小集合。其他的同理,直到图中所有的点遍历完全从而就产生了最大连通子图。上述过程可能过于抽象,我们举一个简单的例子如图2所示,那首先获取下图数据并且序列化Array((1L,"1"),(2L,"2"),(3L,"3"),(4L,"4"),(5L,"5"),(6L,"6"),(7L,"7"),(7L,"7"),(81^,〃8〃),(1,〃9〃))构成代代^1^)这样的数据结构,然后序列化4^&7化(^6(11^21^〃朋友")3(^6(21^,31^〃朋友〃)3(^6(31^51^〃朋友〃)3(^6(比,礼,〃朋友〃)3(^6(乩,61^"朋友〃),Edge(3L,6L,〃朋友〃),Edge(7L,8L,〃朋友〃),Edge(8L,9L,〃朋友〃))生成EdgeRDD边数据结构,然后构建一个由vertexRDD和EdgeRDD PREGEL组成的图实例graph,接着创建一个PREGEL实例并且把graph实例注入到PREGEL当中且指明图的结构是双向结构(这是因为GRAPHX是基于有向图的计算框架,所以要计算无向图时实际上是构建的双向图,这样GRAPHX就能够进行无向图计算了),然后PREGEL启动主导和工作节点,每一个工作节点启动一个超步,这个超步选取一个点作为起始点,例如选择1作为起始点,然后计算与1关联的点,发现是2和4,这时候组成一个计算点集合[1,2,4],也组成了计算边集合[{1,2,朋友},{1,4,朋友}]将这个点集合和边集合信息发送到其他的超步当中,每一个超步都会先做一个集合的merge操作,建立最小的集合,此时计算点集合[1,2,4]是最小的集合。同样的计算过程2这个节点会得到[1,2,3]这个集合,然后merge之后我们会将前面的[1,2,4]和这次计算的[1,2,3]进行合并,这样我们得到的最小计算点集合是[1,2,3,4]和最小的计算边集合[{1,2,朋友},{1,4,朋友},{2,3,朋友}],其他点也是同样的道理,最后我们就可以得到计算点集合厶1?^¥([1,2,3,4,5,6],[7,8,9])和计算边集合厶1?^¥([{1,2,朋友},{1,4,朋友},{2,3,朋友},{4,6,朋友},{3,5,朋友}],[{7,8,朋友},{8,9,朋友}]。需要强调和说明的是每一个点的计算没有先后顺序,每一个点相当于形成了一个超步,那么这些超步计算的时候都是并行执行的,所以很大程度上提升了计算的速度和计算能力。最后生成了整个若干个独立的连通子图,并且我们将这些连通子图的id存入到HDFS当中文件结构为N0,[ID1,I D 2,I D 3…],然后我们首先打开H D F S文件写入流将内容写入到ConnectedComponentsVertex.txt.文件中,然后我们将[ID 1,ID2,ID3...]里面的id取出来,两两组合查询edges边文档,得到id与id之间的关系,S卩IDlID2url这样的内容,然后把这个内容记录下来形成ConnectedComponentsEdges.txt调用系统内置的脚本,构建表格ConnectedComponentsVertex.结构和ConnectedComponentsEdges 结构,再调用hive 数据载入命令将ConnectedComponentsVertex.txt.文件的内容载入到Connect edComponentsVer tex 表格当中,将 Connect edComponentsEdges.txt文件内容载入到ConnectedComponentsEdges表格当中。
[0029]6)关联数据路径搜索读取最大连通子图文件,获取连通子图1d,依次构建N0下的所有的id号构成的最大连通子图,并且将子图数据重新加载到GRAPHX当中,此时我们可以在这个最大连通子图上计算数据的关联路径。本发明算法基本的设计思想是首先获取该连通图中所有的i d节点的编号列表,也就是VertexRDD的节点列表,然后抽取列表中的第一个a和第二个b构成数据关联路径的起始节点和终止节点,然后从点a出发,并且在VertexRDD和EdgeRDD构成的图中找出以a出发的边,组成一个路径集合PATH( 1),对PATH(1)中的每一条路径path:取path的端点x,找出从端点x出发的所有边EDGE(x),遍历EDGE(x),对其中每一条边edge:如果edge不在path中,则将path+edge放入PATH(2)中,如果edge以及存在在path当中,那么就不重复存储。结束后,再以PATH(2)为路径集合再次遍历,以此类推,直到path (η)的端点没有任何的边从它出发为止。遍历一遍ΡΑΤΗ( η)的集合,把端点b提取出来,即可以得到a到b的所有关联路径。整个算法是基于GRAPHX的PREGEL模型进行开发的,使得该算法能够并行化,从而能够大规模分布式并行运算关联数据路径搜索的问题。本发明的关联数据路径搜索算法,我们可以得到任意两点a和b的关联路径,本算法的输出是a,b,[pathl,path2,path3,path4…,pathn]。如果这两个点之间确实没有关联路径,那么算法输出的结果为a,b,[]。本发明将此结果记录为relat1ns, txt文件中。本发明首先连接hive数据库并且连接ConnectedComponentsVertex表格,然后调用发明内置的HQL语句select no,ids from ConnectedComponentsVertex,获得HDFS存储的关于最大连通子图计算发现的每一个最大子图,取no = l,然后序列化ids,序列化ids生成一号最大连通子图的点集合vertexRDD,然后同理连接HI VE调用发明内置的HQL语句,sel ect no , edges fromConnectedComponentsedges where {no = 1}序列化edges生成一号最大连通子图的点集合edgeRDD,然后用vertexRDD edgeRDD构图GRAPHX。然后本发明PREGEL图形计算框架的思想,然后启动PREGEL计算框架并且将之前构建的图注入到PREGEL计算框架中,并且配置act iveDirect 1n = EdgeDirect 1n.Either,然后PREGEL启动主导和工作节点,主导负责分配图处理任务,工作负责计算。然后工作节点负责顺序执行用户定义的超步操作,对于每一个超步操作我们都由用户定义的funct1n来执行。本次发明的funct1n具体做法是首先指定一个点作为起始点,然后计算与这个点相关的点并且记录下来idl_id2,将这个结果进行sendmessage到所有的点中,然后mergemessage是除去计算当中的重复信息,然后再启动下一个超步超步,这个超步永远都取出上一个超步计算结果的最后一个点,例如上一个超步计算出来并且分发到各个节点的结果是idl-1d2-1d3-1d4那么这个超步计算所取出的点就是id4,首先判断这个头尾两个点是否为同一个点,如果是那么就让这个点的计算变为非活跃点,说明它已经找完一个闭合路径,该点已经找完相关路径了。如果不是相同的点那么计算与id4关联的点并且记录下来,然后sendmessage到所有的活跃点中,然后mergemessage是除去计算当中的重复信息,直到所有的点都变成非活跃点程序结束,程序最终获得的是idl在子图nol的所有连通路径集合tl,然后我们取出子图nol中的所有的点,然后两两组合例如(IDA,IDB),在tl的结果集中搜索每一个结果是否包含IDA和IDB,如果有那么我们就把七1当中相关记录的结果截取以结构10六,108,{[?六1'!11],[?六1'!12]."[?六1'圆]}组织,并且把内容记录到文件findrelat1nships当中。
[0030]7)关联数据路径结果存储由于本发明在设计之初就希望该发明是一个离线系统,那么也就意味着真正业务查询时查找两个或者多个关联数据之间的关联路径时,这时候我们是已经通过上述的步骤1-6都已经完成了计算,然后将步骤六的计算结果存储在HDFS当中,由HIVE进行统一的查询。那么也就意味着需要将关联数据的搜索路径进行存储和管理。这里涉及到了数据库连接模块、数据打包模块、数据存储模块。
[0031]8)关联数据源的指定和关联路径可视化展示最后本发明提供了一个用户输入和查看的界面。这里面包括了数据源地址的输入、数据源校验模块、数据源最大连通图展示模块、关联路径展示模块。用户可以指定RDF数据库的地址和具体的数据集的名称、发明首先会检查这个数据源是否已经存在,若存