基于Neo4j数据库的时序最短路径查询方法与流程

文档序号:17090398发布日期:2019-03-13 23:23阅读:1692来源:国知局
基于Neo4j数据库的时序最短路径查询方法与流程

本发明涉及路径规划技术领域,更具体地,涉及一种基于neo4j数据库的时序最短路径查询方法。



背景技术:

neo4j是一个高性能的nosql(非关系型的数据库)图形数据库。在neo4j中,数据被存储在网络中而非表中,数据被保存为图中的节点以及节点之间的关系。对于一些应用数据,例如交通路网数据、社交网络数据等,可以很直接的表示成图的节点和关系的概念。使用neo4j来存储这些数据很自然,并且使用效率会高于关系型数据库。目前facebook、阿里巴巴、百度等许多大公司都在使用neo4j。

neo4j的数据存储模型为node(节点)和relationship(关系),以及包含的property(属性)。property(属性)使用key(键)-value(值)对的双向列表进行保存。node节点保存第一个属性和第一个关系id。relationship关系保存了开始节点id、结束节点id、属性。通过上述存储模型,可以方便的遍历某个节点作为起点的图。

neo4j内置的图算法,包括dijkstra,a*算法。这些算法所计算的最短路径都是基于有向无权图的实现,最短路径的计算只与节点之间的跳数有关,而不考虑除此之外的信息。然而,当neo4j应用于存储公共交通道路网络中时,查询节点之间的最短路查询时,往往需要考虑到边上的时序信息,因为公共交通工具都是受到特定的时序信息限制的。例如,用户在08:00时刻从a出发,查询最早到达b的路径。此时通过内置的最短路算法因为无法利用网络中的时序信息,从而获取的结果只是a到b通过最少的中间节点的结果,这个结果路径可能实际上不可通行或者并非最早到达路径,结果有误。因此需要设计并实现新算法,作为neo4j功能上的扩展,能够利用时序图中的时序信息来计算时序最短路径查询,同时该算法还应该根据neo4j的底层存储结构特性,做高效率的实现。

时序图,指的是边带有与时间相关的权重信息的有向图。在时序图中,边存储着出发时间和到达时间信息,只有在小于出发时间到达起点,才能通过该边,在到达时间到达对应的终点。例如,在交通路网中,因为公共交通工具的班次限制,同一个出发点在不同的时间出发前往同一个目的地,所消耗的时间是不同的。例如,从a地坐公车到b地,假设公车的车次是08:05—08:15,08:15—08:25……,用户假如在08:00时刻出发,会在08:15到达,耗时为15分钟。用户假如在08:08时刻出发,则会在08:25到达目的地,耗时为17分钟。在时序图中,同样的起点终点,由于出发时间不同,导致总消耗时间(以及搭乘的交通工具)也是不同的。在时序图中,最短路的查询是与时间动态相关的。

从时序图的模型可以衍生出三种时间相关的最短路查询:

(1)最早到达路径查询eap(earliestarrivalpath)。在td时刻用户在起点a,求问最早到达终点b的时间以及对应经过的路径。

(2)最晚出发路径查询ldp(latestdeparturepath)。在不晚于ta时刻到达终点b,求问最晚从起点a出发的时间以及对应经过的路径。

(3)最短耗时路径查询sdp(shortestdurationpath)。在大于td时刻从起点a出发,不晚于ta时刻到达终点b,求问从a到b耗时最短的路径。

现有的与neo4j相关的申请公开的专利,包括有整合neo4j数据库与j2ee平台的方法及系统等。这些专利都是对neo4j的上层应用以及数据利用方法,还未有专利能够扩展neo4j数据库底层的方法过程,从而解决neo4j在应用时序图求解时序最短路方面的缺陷。因此本发明致力于neo4j在时序最短路查询方面的扩展工作。



技术实现要素:

本发明要解决的问题是克服neo4j无法计算时序最短路查询问题的缺陷,扩展neo4j时序图最短路查询功能,并且以插件的形式内嵌到neo4j数据库中。

为实现以上发明目的,采用的技术方案是:

一种基于neo4j数据库的时序最短路径查询方法,包含有最早到达路径查询方法、最晚出发路径查询方法及最短耗时路径查询方法,其特征在于:具体包含有以下内容:

定义时序图g=(v,e),其中v是g的顶点集,e是g的有向边集;

最早到达路径查询方法:

(1)将neo4j时序图的节点分为两组:1)s:已经求出最早到达路径的顶点的集合;2)u=v-s:尚未确定最早到达路径的顶点集合;

(2)令s={v0},dist(vi)=∞,其中v0表示出发节点,vi表示目的节点,dist(vi)表示从出发节点v0在时刻t后出发到达目的节点vi的最早到达时间;

(3)若存在边e<v0,vi,td,ta,b>满足td>=t且ta<dist(vi),则记dist(vi)=ta;否则记dist(vi)=∞;td表示从出发节点v0出发的时间,ta表示到达目的节点vi的时间,b表示选择的交通工具;

(4)从u中选取一个时序距离最小且不在s中的顶点x,加入s,则最小的到达时间为dist(x);

(5)加入x后,若存在边e<x,vi,td’,ta’,b’>而且满足td’>=dist(x)且ta’<dist(vi),则更新记dist(vi)=ta’;

(6)重复上述步骤(4)和步骤(5),直至s=v;

最晚出发路径查询方法

(1)将neo4j时序图的节点分为两组:1)s:已经求出最晚出发路径的顶点的集合;2)u=v-s:尚未确定最晚出发路径的顶点集合;

(2)令s={v0},dist(vi)=-∞,其中v0表示出发节点,vi表示目的节点,dist(vi)表示出发节点v0到目的节点vi的最晚出发时间;

(3)若存在边e<vi,v0,td,ta,b>满足ta<=t且td>dist(vi),则记dist(vi)=td;否则记dist(vi)=-∞;

(4)从u中选取一个出发时间最晚且不在s中的顶点x,加入s,则最晚的到达时间为dist(x);

(5)加入x后,若存在边e<vi,x,td’,ta’,b’>而且满足ta’<=dist(x)且td’>dist(vi),则更新记dist(vi)=td’;

(6)重复上述步骤(4)和步骤(4),直至s=v;

最短耗时路径查询方法

(1)初始化结点集合s为空;

(2)对于v0的每条边e<v0,vi,td,ta,b>:获取出发时间td,将td加入集合s中;

(3)初始化变量mint=∞,mintd=td;

(4)对于每个s中的时间td,调用最早到达路径查询方法获取每个出发时间的对应最早到达时间td;

(5)若mint>ta-td,则执行步骤(6),否则跳转步骤(4);

(6)更新mint=ta-td,mintd=td;

(7)运用最短耗时路径查询方法获取路径eap,此路径即为耗时最短路径sdp;

将最早到达路径查询方法、最晚出发路径查询方法及最短耗时路径查询方法应用到neo4j数据库并且嵌入数据库中。

优选地,将最早到达路径查询方法、最晚出发路径查询方法及最短耗时路径查询方法应用到neo4j数据库并且嵌入数据库中的具体过程如下:

(1)、neo4j过程:使用call语句调用;

(2)、neo4j编写自定义过程;

(3)、编写类和方法;

(4)、将类和相关的引用包打包为jar包;

(5)、重启neo4j数据库,过程即可正确调用。

与现有技术相比,本发明的有益效果是:

本发明提出了neo4j数据库的时序最短路查询功能扩展和插件形式嵌入方法。本发明解决了neo4j数据库内置的最短路算法无法处理时序信息的缺点。提出了针对三种时序最短路查询的temporal-dijkstra算法,解决了时序最短路在neo4j上的实现问题,针对性修改了传统最短路算法的初始化和终止条件来提高了效率,并且作为neo4j的功能扩展实现部署到了neo4j数据库中,通过特定的过程调用语句来处理对应的查询需求。通过实验证明,本发明在实际数据库中可正确调用,并且有很高的实用价值。

附图说明

图1为本发明所举例的时序图g。

图2为本发明所述图1中部分边的编号及其编号表示的边。

图3为本发明所述neo4j数据库中节点和关系存储文件的物理结构。

图4为本发明所述eap-temporal-dijkstra算法应用在图1的搜索过程。

图5为本发明所述查询实例1的迭代过程。

图6为本发明所述ldp-temporal-dijkstra算法应用在图1的搜索过程。

图7为本发明所述查询实例2的迭代过程。

图8为本发明所述temporal-dijkstra算法在neo4j数据库的实现流程图。

图9为本发明所述实验部分所用全国路网数据库中顶点数据和边数据。

图10为本发明所述temporal-dijkstra算法在实际数据库近距离查询中查询次数和查询时间关系图。

图11为本发明所述temporal-dijkstra算法在实际数据库中远距离查询次数和查询时间关系图。

具体实施方式

附图仅用于示例性说明,不能理解为对本专利的限制;

以下结合附图和实施例对本发明做进一步的阐述。

实施例1

本发明要解决的问题是克服neo4j无法计算时序最短路查询问题的缺陷,扩展neo4j时序图最短路查询功能,并且以插件的形式内嵌到neo4j数据库中。

首先给出本发明的相关定义:

定义1(时序图temporalgraph):时序图g=(v,e),其中v是g的顶点集,e是g的有向边集,e∈e由四元组构成,e=<u,v,td,ta>,其中u,v∈v,u表示有向边的弧尾,v表示有向边的弧头,td是从u到v的出发时间,ta是从u到v的到达时间。将时序图g应用到公共交通网络时,用五元组表示一条边,即e=<u,v,td,ta,b>,表示交通工具b在时刻td从站点u出发,在时刻ta到达站点v。

例如,图1是一个有6个顶点v1,v2,v3,v4,v5,v6和14条边的公共交通网络时态图,对图1中的部分边进行编号,如图2所示。每条边上的有序对<td,ta>表示该边的出发时间(到达时间)是td(ta),不同形状(实线、虚线、点线)的边表示不同的公共交通工具(b1,b2,b3)。例如,边e1表示为<v1,v2,10,11,b1>。

定义2(路径path):时序图g上的一条路径p定义为g中边的一个序列<e1,e2,…,ek>,使得对任意i∈[1,k-1],ei+1的弧尾等于ei的弧头,并且ei+1的出发时间大于等于ei的到达时间。

例如,图1中的边序列<e1,e2,e3>是一条路径,因为e2的弧尾是v2,等于e1的弧头,并且e2的出发时间大于等于e1的到达时间,e3的弧尾等于e2的弧头,并且e3的出发时间大于等于e2的到达时间。而边序列<e2,e4>不是路径,因为e4的出发时间小于e2的到达时间,不满足路径的定义。

定义3(最早到达路径查询earliestarrivalpathquery)。给出图g中的两个顶点u和v以及开始时刻t,一个最早到达路径查询为满足(1)不早于t时刻从u出发(2)到达终点v的最早到达时刻的路径。

例如,最早到达路径查询,在图1中开始顶点v1,目标顶点v6,开始时刻8.则符合条件的最早到达路径是<e9,e2>。

定义4(最晚出发路径查询latestdeparturepathquery)。给定图g中的两个顶点u和v以及到达时刻t’,一个最晚出发路径查询为满足(1)不晚于t’时刻到达v(2)从u处出发的最晚出发时刻的路径。

例如,最晚出发路径查询,在图1中开始顶点v1,目标顶点v6,到达时刻12.则符合条件的最早到达路径是<e1,e2>。

定义5(最短耗时路径查询shortestdurationpathquery)。给定图g中的两个顶点u和v以及出发时刻t和到达时刻t’,一个最短耗时路径查询为满足(1)不早于t时刻从u出发(2)不晚于t’时刻到达v的总耗时最短的路径。

例如,最短耗时路径查询,在图1中,开始顶点v1,目标顶点v6,开始时刻6,到达时刻12。则符合条件的最短耗时路径是<e1,e2>。

本发明是通过以下技术方案来解决上述技术问题:

part1:时序最短路算法,解决的是如何利用时序图的时间信息求解时序最短路的问题。针对三种不同的时序最短路查询,分别提出了eap-temporal-dijkstra算法来求解最早到达路径查询,ldp-temporal-dijkstra算法来求解最晚出发路径查询,sdp-temporal-dijkstra算法来求解最短耗时路径查询。

对于三种时序最短路算法,都是基于解决最早到达路径查询的

eap-temporal-dijkstra算法的解决思路的改进,因此首先介绍

eap-temporal-dijkstra算法思想。

eap-temporal-dijkstra算法思想:

把节点集分为两组:(1)s:已经求出最早到达路径的顶点的集合(2)u=v-s:尚未确定最早到达路径的顶点集合。

符号dist(v)表示源节点u到v的最早到达时间。求一个节点v0在时刻t到其他节点的最早到达路径,算法描述如下:

1.初始令s={v0},u=v-s,dist(vi)=∞。

若存在边e<v0,vi,td,ta,b>且满足td>=t,ta<dist(vi),则记dist(vi)=ta。否则记dist(vi)=∞。

2.从u中选取一个时序距离为最小且不在s中的顶点x,加入s,则这个最小的到达时间就是dist(x)。

3.加入x后,若存在边e<x,vi,td,ta,b>而且满足td>=dist(x)且ta<dist(vi),则更新记dist(vi)=ta。

4.重复上述步骤2和步骤3,直至s=v。

从算法的过程可以看出,求解源点到终点的时序最短路径,过程需要求解源点到许多中间顶点的时序最短路径,一直迭代到目标顶点时结束。

以下给出算法的具体执行步骤:

eap-temporal-dijkstra算法

ldp-temporal-dijkstra算法思想:

把节点集分为两组:(1)s:已经求出最晚出发路径的顶点的集合(2)u=v-s:尚未确定最晚出发路径的顶点集合。

符号dist(u)表示源节点u到v的最晚出发时间。求其他节点节点时刻t之前到v0的最晚出发路径,算法描述如下:

1.初始令s={v0},u=v-s,dist(vi)=-∞。

若存在边e<vi,v0,td,ta,b>且满足ta<=t,td>dist(vi),则记dist(vi)=td。否则记dist(vi)=-∞。

2.从u中选取一个出发时间最大且不在s中的顶点x,加入s,则这个最大的到达时间就是dist(x)。

3.加入x后,若存在边e<vi,x,td,ta,b>而且满足ta<=dist(x)且td>dist(vi),则更新记dist(vi)=td。

4.重复上述步骤2和步骤3,直至s=v。

ldp-temporal-dijkstra算法本质上是和eap-temporal-dijkstra算法是一样的。将本算法的起点终点互换,出发时间和到达时间互换,就可以是求解最早到达路径的问题。

以下给出算法具体执行步骤:

ldp-temporal-dijkstra算法

最短耗时时序最短路径sdp查询:

由于每条边都有一个出发时间的限制,假如出发时间不是起点的某个出边的出发时刻,那么将会浪费时间在等待出发上,因此可见,最短耗时路径的出发时间一定是某个出边的出发时间。利用这个思想,可以通过获取起点的所有出边的出发时间,来做多个最早到达路径查询,然后用到达时刻减去出发时刻来获取总耗时,并将最短耗时的路径作为结果返回。

以下是算法具体执行步骤:

part2:以下说明如何将设计的算法在neo4j上实现;如何获取neo4j数据库中节点和边上的时间信息。

传统的图形存储结构有邻接矩阵和邻接表,所以基本上最短路算法都是基于邻接矩阵和邻接表上实现的。因此对于以上提出的时序最短路算法要根据neo4j的数据存储结构做对应的实现方式,而不是参照传统的实现方式。

neo4j有一个重要的特点,就是用来保证关系查询的速度,即免索引邻接属性,数据库中的每个节点都会维护与它相邻节点的引用。免索引邻接是图数据库实现高效遍历的关键,neo4j底层存储结构设计的关键是免索引邻接的实现机制。如图3所示,neo4j的两种数据类型(节点和关系)的物理结构。

节点(指向联系和属性的单向链表,neostore.nodestore.db):第一个字节,表示是否被使用的标志位,后面4个字节,代表关联到这个节点的第一个关系的id,再接着的4个字符,代表第一个属性id,后面紧接着的5个字符是代表当前节点的标签,指向该节点的标签存储,最后一个字符作为保留位。

联系(双向链表,neostore.relationshipstore.db):第一个字节,表示是否被使用的标志位,后面4个字节,代表起始节点的id,再接着的4个字符,代表结束个节点的id,然后是关系类型占用5个字节,然后依次接着是起始节点的上下联系和结束节点的上下节点,以及一个指示当前记录是否位于联系链的最前面.

每个节点记录都包含一个指向该节点的第一个属性的指针和联系链中第一个联系的指针。读取一个节点的关系,从指向的第一个关系开始,遍历整个双向链表,知道找到了感兴趣的关系。一旦找到了感兴趣的关系的记录,本发明就可以很方便的查找关系的属性,以及起始节点和结束节点的id,然后立即找到所找的节点。

temporal-dijkstra算法中关键的步骤之一就是逐步扩展s。结合neo4j数据库存储的特性,本发明从eat/ldt中选取出当前最优的时间和对应的节点id后,可在o(1)时间得到对应的顶点,然后根据该节点指向的关系开始遍历整个双向链表。在遍历过程中,对每个关系通过遍历获取出发时间和到达时间属性信息。获取到这些关键的数据后,就可以进行最优化更新的操作了。

以下为在neo4j3.4.0核心api中,获取关键数据的方法。

获取对应id的节点的方法为:

nodegetnodebyid(longid)

获取节点的关系的方法为:

iterable<relationship>getrelationships(directiondir)

获取关系的属性的方法为:

objectgetproperty(stringkey)

part3:以下说明当neo4j数据库节点数据较多时如何初始化提高效率,以及终止条件如何定义。

传统的有关dijkstra算法的初始化为每个顶点建立一个节点与到起点的最短距离的映射,然后迭代所有顶点后获得所有节点的最短距离,通过映射获取终点到起点的最短距离。这样的做法在顶点数量不高时,可以顺利运行。但在实际数据库中,例如交通路网中,数据库中节点的数量庞大,用户实际查询中起点与终点之间经过的节点数量远远小于总节点数。因此,传统的初始化和终止条件应该有所修改。

在本发明中,采取类似a*算法的openlist和closelist的概念,分别对应算法中的eat/ldt映射表和集合s。s是所有已求出最短时序的节点集合,eat/ldt表是目前涉及到最短时序距离。在初始化时,s只有起点数据,eat/ldt只有与起点/终点相关联的节点的最短时序信息。而后通过不断的迭代,算法的终止条件为:1)将终点加入s,此时已找到起点到终点的时序最短距离或者2)eat/ldt中所有的点都在s中,此时起点终点就是时序上不可达的。

part4:将temporal-dijkstra算法应用到neo4j数据库中并且嵌入数据库中

以下列出嵌入该过程的关键步骤:

1、neo4j过程:使用call语句调用,可以选择添加参数,大多数过程返回固定列的记录流。例如,调用数据库的内嵌过程,列出数据库的所有标签。

2、neo4j可以编写自定义过程。

3、编写类和方法。关键点:a、对方法使用@procedure注解b、方法的返回值是stream<t>。

4、将类和相关的引用包打包为jar包。把jar包放在neo4j的$home/plugins下,如果没有任何的设置请放在安装的目录plugins下,如果有单独设置,要设置在配置的plugins下面。

5、重启neo4j数据库,过程即可正确调用。

实施例2

如图1所示,这是一个时序图,可以表示一个交通网络,顶点之间通过有向边连接,边上带有时序信息,代表出发时间和到达时间,以及对应的交通工具信息。

查询实例1

查询eap(v1,v6,8)。本发明调用eap-temporal-dijkstra算法进行求解。将v1加入s,首先v1的出边满足td>=8的到达对应点时间最早有e5,e9,利用e5,e9的时序信息更新eat,pre,prerel表。第二次迭代,在eat中选取到达时间t最小的顶点v2。将v2加入s中,对于v2满足td>=10的出边有e2,e6,然后利用e2,e6的时序信息更新eat,pre,prerel表。第三次迭代,选出eat中最小的不在s中的点为v6。由于v6是目标终点,所以此时搜索结束。通过查询表eat,pre,prerel可以获得eap(v1,v6,8)的结果是<e9,e2>。图4为本发明所述eap-temporal-dijkstra算法应用在图1的搜索过程。具体的迭代过程如图5所示。

查询实例2

查询ldp(v1,v6,12)。本发明调用ldp-temporal-dijkstra算法进行求解。首先从终点v6的入边开始,满足ta<=12的入边有e2,本发明利用e2的时序信息更新ldt,next,nextrel表。第二次迭代,在ldt中选取不属于s而且有最大出发时间11的顶点v2。首先将v2加入s中,然后选取满足ta<=11的入边e1,e12,然后利用e2,e12的时序信息更新ldt,next,nextrel表。第三次迭代,选取ldt中不属于s而且有最大出发时间10的顶点v1。由于v1为查询的起始顶点。所以此时搜索结束。通过查询表ldt,next,nextrel可以获得ldp(v1,v6,12)的查询结果<e1,e2>。具体的迭代过程如图7所示。图6为本发明所述ldp-temporal-dijkstra算法应用在图1的搜索过程。

查询实例3

查询3:sdp(v1,v6,8,12)。首先获取v1的所有出发时间且满足>=8和<12的有:8,9,10.调用eap-temporal-dijkstra算法分别计算eap(v1,v6,8),eap(v1,v6,9),eap(v1,v6,10),得到到达时间eat分别是12,12,12.因此耗时分别是4,3,2。因此sdp(v1,v6,8,12)=eap(v1,v6,10)=v1-e1-v2-e2-v5。

如图8所示,将上文所述的temporal-dijkstra算法通过调用neo4j的核心api的方法应用实现,然后部署到neo4j中。通过neo4j的cypher过程调用语句如calleap(1,6,8)、callldp(1,6,12)、call(1,6,8,12)来获取查询结果。

实验结果与分析

实验所用数据集为中国全国路网数据,包含全国各城市的高铁站点与班次、地铁站点与班次、部分航班点与班次、热门景点数据等。如图9所示,为本次实验所测试的全国路网系统的数据组成。

在此数据库基础上,如图10所示,进行的实验测试是在同一个城市的地铁站之间,随机生成出发时间或者到达时间,分别执行50、100、150、200次的eap,ldp,sdp查询后,获取结果所耗费的总查询时间。从结果上看,查询平均每次耗费的查询时间都是保持稳定,而且时间比较短。eap和ldp查询时间接近,且低于sdp查询所需要的时间。

图11所示的实验结果为出发站点和目的站点距离较远时,随机生成出发时间或者到达时间,分别执行50、100、150、200次的eap,ldp,sdp查询后,获取结果所耗费的总查询时间。从实验结果上分析,每种查询的查询时间仍保持稳定,而且在可接受的查询时间范围之内。sdp查询时间大于ldp查询时间,ldp查询时间大于eap查询时间。

通过图10图11的实验结果对比,可以看出,当起点和终点之间需要更多的中间节点时,时序最短路查询所耗费的时间也会相对增加,但仍在可接受范围,同时查询时间sdp>ldp/eap保持不变。从sdp-temporal-dijkstra算法可以看出,因为通常需要调用多次eap-temporal-dijkstra算法,所以查询时间会相对较长,但也在可接受的短时间获取到结果。所以所有的时序最短路查询算法在扩展到neo4j数据库后,都有实际的应用价值。

显然,本发明的上述实施例仅仅是为清楚地说明本发明所作的举例,而并非是对本发明的实施方式的限定。对于所属领域的普通技术人员来说,在上述说明的基础上还可以做出其它不同形式的变化或变动。这里无需也无法对所有的实施方式予以穷举。凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明权利要求的保护范围之内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1