基于图数据库和百度地图的快递物流系统的设计与实现
2021-03-15张孝良曾庆涛唐明杰
张孝良, 曾庆涛, 唐明杰, 黄 蕙
(北京印刷学院信息工程学院,北京 102600)
1 物流行业背景和发展现状
1.1 物流行业发展背景
进入随着社会的进步和经济的发展,越来越多的人开始尝试在网络平台购物,其中最主要的原因,就是方便,可以做到足不出户就能拿到想要的东西。而在网购过程中的最重要的一环,就是快递物流行业。 快递物流行业起源于古代驿站,从“千里加急”的战报,到和平年代的书信。 邮政局的兴起,推动了快递物流行业的快速发展,而今天人们的需求已不仅仅是邮政、一封书信那么简单,人们已经逐渐接受在网络购买生活用品,甚至是大小家电,而在这种背景下,对快递行业的考验也骤然增加。
当商家将货物交付快递运输公司,快递公司如何才能既保证时效,又能完整、无破损地交付到顾客的手中,成为了快递运输行业一个至关重要的问题。 而随着互联网的兴起,我们可以使用更多的手段,来达到预期的目的。 一个好的快递运输系统,可以让快递物流行业的运作更加顺畅、合理、有序,而且可以使用更多的相关技术来辅佐我们的系统。物流公司为此应当做出合理、高效、快捷的一体化解决方案,而本文就是为了解决物流公司遇到的这种问题,利用图数据库neo4j,本系统可以合理规划快递运输路径,避免快递运输途中走冤枉路,保证快递及时、迅速地到达顾客手中,同时改变了目前原有的快递运输方案,取代以往的直达方案,转而做出中转其他城市,减轻目的地城市的快递运输压力、减轻快递运输车辆的运输里程的方案,使得快递运输行业更进一步,为快递运输行业的发展起到了一定的推进作用。
1.2 物流行业国内外发展现状
国外目前的快递行业大多着眼于国际化、大型商品的物流,像美国的物流模式就是强调“整体化的物流管理系统”,这是一种首先考虑整体利益的、冲破按部门分管的体制的、从物流业务的整体逻辑进行统一规划管理的方式。 美国政府放宽物流行业在城市交通、城市资源上的控制程度,包括快递行业运输航空等方面,尽量下放权力,减少干预,让物流市场在近乎无管辖的范围自由竞争,自由发展。 美国的物流信息化发展名列世界前列,十分注重企业物流信息化、物流企业信息化、物流信息服务业等方面的建设与研究,涌现出Dell、BIM、CISCO 等成功的物流公司与供应链管理模式。 但是西方很多国家并没有在小型快递包括居民日常所需日用品、家电、化妆品之类的小型商品物流下足功夫,其运输效率、运输质量都不如国内。 而这类小型商品恰恰是我们国内十分注重的快递物流行业的一大方面。
在国内,有近1200 家物流公司游走于快递物流行业,其中有像顺丰快递、中通快递、圆通快递、韵达快递这类已经做到近乎成熟的大型企业,也有在源源不断涌向物流运输行业的小型物流公司。根据国家邮政局发布的《2019 年中国快递发展指数报告》,中国快递业市场规模正稳步推高,2019年,中国快递发展指数为998.3,同比提高22.6%。从一级指标来看,发展规模指数为2207.1,同比增长25.0%,继续保持高速增长态势。 从这组数据我们可以清楚地看出,中国物流行业正处于一个稳定上升的时期,而各个物流行业也都有自己的一套物流管理体系的支撑,而在这样一个稳定上升的时期,适时地做出一些创新性的改变,将十分有利于快递物流行业的发展与进步。
2 Neo4j 数据库设计与实现
2.1 图数据库
在处理关联数据时,与关系型数据库相比,图型数据库有三个非常突出的技术优势:
高效:随着数据量和关联深度的增加,传统关系型数据库受制于检索时多个表之间的连接操作,在写数据时也要考虑外键约束,这会造成大量的额外开销,造成严重的性能问题。 其高效的执行能力也受益于图数据库的查询方式,在执行查询语句时,只操作对结果有关的部分结点和联系,这就使得图数据库操作的高效性得到了保证,与图模型固有的数据索引结构相比,图模型的数据查询和分析更加快速。
灵活性:图形数据库具有非常灵活的数据模型,用户可以根据业务变化随时调整数据模型,如任意添加或删除顶点、边线,扩展或缩小图形模型等,这使得我们在开发的过程中不需要一开始就完全写定所有的关系和联系,而是在需要的时候,随时添加这些信息就可以满足我们的需要,而关系型数据库无法很好地支持频繁的 Schema 更改。
敏捷性:AgileDatabase 的图表模型是非常直观的,它支持测试驱动的开发模式,每次构建都可以进行功能测试和性能测试,这与当今流行的敏捷开发需求相一致,而这也受益于图数据库提供的统一数据库语言和相应的操作指南的帮助,可以满足各种应用软件开发者敏捷地使用图数据库进行开发,有助于提高生产和交付效率。
2.2 Neo4j 数据库
目前,Neo4j 是在技术社区和商业市场上最为商业和技术人员所熟悉、应用最广的图形数据库。基于本次项目的综合需求和任务考虑,选用Neo4j作为本次项目的数据库依托。
Neo4j 有以下特点和优点:
1)使用本地图(NativeGraph)存储和处理数据:提供最优关系遍历执行效率,neo4j 的执行速度比关系数据库的表连接快上千倍。
2)一种基于(标签)属性图的模型:支持丰富的数据语义描述,图的显示和描述让开发者有耳目一新的感受,直观准确地表示了各种数据之间的关联关系,并且具有很高的灵活性。
3)它基于纯 Java 实现,支持最广泛的操作系统和最方便的部署、云部署和容器部署。
4)为 Cypher 提供了一种面向图分析和模式匹配的、声明型的查询语言,直观、简洁、易懂。
5)完整的 ACID[原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)],并有很好的兼容性,保证数据的一致性,所以它同样适用于事务型(OLTP)和分析型(OLAP)。
6)提供高可用性、故障切换、数据冗余和可扩展吞吐量的基于因果集群的分布式数据库 Causal Clustering。
7)大量驱动语言支持: Java、 JavaScript、 Python.Net 和 GO 都是官方发布的。
2.3 Neo4j 数据库结点及关系建模
本项目需要用到Neo4j 数据库完成对会员用户的信息存储、快递单信息的存储、会员信息与快递单信息的关联关系以及使用Neo4j 数据库并利用Floyd-Warshall 算法完成对全国31 个省会城市做出路径规划。
①会员结点存储注册本软件会员的全部信息资料,并在建立快递联系后与快递单结点发生联系,会员结点的数据建模如表1 所示:
表1 会员结点数据关键字、数据类型及其含义
使用Neo4J 对会员结点数据进行建模,效果如图1 所示:
图1 会员结点数据建模
②快递单结点数据库建模用来存储快递单的各种信息,包括寄件人详细信息、收件人详细信息、快递物品类型、快递运输路径等信息,并在生成过程中与寄件人和收件人产生关系,分为consignor(寄件人)关系和consignee(收件人)关系,快递单结点的数据建模如表2、表3 所示:
表2 快递单结点数据关键字、数据类型及其含义
续表2
表3 快递单结点与用户结点关系关键字、数据类型及其含义
使用Neo4J 对快递单结点数据进行建模,效果如图2 所示:
图2 快递单结点数据建模
③城市结点的数据建模
城市结点是本项目的重点结点,其中包括了省结点、省会结点和普通市、区结点四类,是进行Floyd-warshall 算法的基础。
为保证数据的准确性,本次项目在中华人民共和国民政部官网民政数据一览下载最新版《2020年2 月中华人民共和国县以上行政区划代码》并导入到数据库中。
本项目共建立31 个省结点、31 个省会城市结点、以及下设的323 个非省会市结点。 其中城市数据结点建模如表4、表5 所示:
表4 城市结点数据关键字、数据类型及其含义
表5 城市之间关系数据关键字、数据类型及其含义
使用Neo4J 对城市数据进行建模,效果如图3所示:
④省会结点的数据建模
省会结点是本项目的重点结点,是进行Floydwarshall 算法的中心结点。 各个省会结点之间的路径由关系+属性值组成。
为保证数据的准确性,本次项目的省会路径长度为腾讯地图官网实际路径,考虑各个城市间的实际道路里程,每个城市的里程由腾讯地图导航实际里程为准。
本项目共建立31 个省会结点,31 个省会之间共计473 条道路。 其中省会之间关系数据结点建模如表6 所示:
表6 省会结点之间road 关系数据关键字、数据类型及其含义
使用Neo4J 对省会道路数据进行建模,效果如图4 所示:
图4 省会道路关系数据建模
3 Floyd-Warshall 算法
3.1 算法简介
Floyd 算法是一种基于动态规划思想的算法,Floyd-Warshall 算法又称为插点法,是一种利用动态规划的思想找出给定的带权图中多源点之间的最短路径的算法。 其本质思想是动态规划的思想,即把一个大问题拆分成一个一个的小问题,且能够从这些被拆分出来的子问题的解中推导出原问题的解,同时待解决的问题还需要满足两个性质:
最优子结构:即大问题能被分成一个个的小问题,而这些小问题的解能够推导出总问题的解。
重叠子问题:每次产生的子问题不是新的问题,而是重复的问题但是数据不同,所以每次得到的结果可以再次被利用,推导下一个子问题。
3.2 物流系统最短路径
在本例中,不再论述Floyd-warshall 算法的过程和具体实现过程,我们通过Floyd 算法具体实现本例中的一个实际路径。[1-2]
如:用户提出快递请求,发货地为山东省-东营市-东营区,详细地址为东城胜宏尚郡小区,收货地为云南省-丽江市-古城区,详细地址为金川大厦。
运送过程如下:东营区快递服务部揽件-东营市分拨中心-济南市分拨中心(山东省省会城市)-【快递中转】-昆明市分拨中心(云南省省会城市)-丽江市分拨中心-古城区快递服务部-金川大厦。
在本例中,我们优化的路径为【快递中转】,即抛弃目前快递所流行的“直达”,转而进行一定次数的中转服务,通过中转服务,可以有效节省路程里程、优化运输路线、同时为快递目的地城市减轻收件压力、减轻快递寄出城市运输车辆的行驶里程,减轻劳累,防止意外事故的发生。
现有模型如图5 所示:
图5 测试Floyd 算法结点图
优化前:若不经过Floyd-warshall 算法优化,从测试点1 到测试点2 的里程为100 公里,通过Neo4j 查询语句“match(n:shi{shi_name:'测试市1'})-[r]-(m:shi{shi_name:'测试市2'}) return n,m,r”查询后的结果如图6 所示:
图6 测试Floyd 算法举例结点图
优化后:通过最短路径的动态规划算法,逐个找出绕行1 个结点、2 个结点、3 个结点……后的最短路径,得出最终的最短路径为:
通过Neo4j 查询语句“match (a:shi{shi_name:'测试市1'}),(b:shi{shi_name:'测试市2'}) CALL apoc.algo.dijkstra(a,b,'road','distance')yield path as path,weight as weight return path,weight”查询后的结果如图7 所示:
图7 测试Floyd 算法举例结点图
以“测试市1”为终点的最短路径由查询语句:"MATCH (n:shi{shi_name:"测试市1"})
CALL algo.shortestPath.deltaStepping.stream(n, "distance", 1.0)
YIELD nodeId, distance
WHERE algo.isFinite(distance)
RETURN algo.getNodeById(nodeId).shi_name AS destination, distance
ORDER BY distance" 实现,其结果如图8所示:
可以看出,在优化前的测试市1-测试市2 之间的路径为100 公里,而用Floyd 算法优化后的路径为63 公里,缩短37 公里。
同理,以“测试市5”为终点的最短路径由查询语句:"MATCH (n:shi{shi_name:"测试市5"})
图8 测试Floyd 算法举例结点图
CALL algo.shortestPath.deltaStepping.stream(n, "distance", 1.0)
YIELD nodeId, distance
WHERE algo.isFinite(distance)
RETURN algo.getNodeById(nodeId).shi_name AS destination, distance
ORDER BY distance" 实现,其结果如图9所示:
图9 测试Floyd 算法举例结点图
可以看出,用Floyd 算法优化后的测试点2 到测试点5 的最短路径为23 公里。
4 百度地图api 调用
4.1 百度地图api 简介
百度地图api 是百度地图为开发者开发应用软件而推出的一套应用调用接口,可以方便地为开发者提供各种服务,包括本地地图的展现,路线导航、定位、地址编码、路线规划、搜索定位等。 百度地图api 适合各种应用的程序开发工作,包括ios、android、web 应用、电脑桌面软件等,同时适用多种操作系统的使用。 百度地图JavaScript api 是一套用JavaScript 语言写的一组应用接口,为用户提供在网站构建时具有交互性的界面、提供多种数据处理服务和多种服务接口, 简化了开发的复杂度。[3-4]
4.2 百度地图api 运用
首先,要在百度地图开发者平台注册秘钥,拿到秘钥后,即可开始调用。
创建一个地图实例如图10 所示:
图10 百度地图api 代码图
效果如图11 所示:
也可以设置地图样式及类型、各种信息如图12 所示,代码执行结果如图13 所示:
本项目中最重要的路径显示由以下代码生成,如图14 所示,效果如图15 所示:
图11 百度地图api 效果图
图12 百度地图api 代码图
5 系统主要功能详细设计实现
5.1 系统欢迎、注册、登陆功能
物流快递系统登陆欢迎界面采用本例模拟公司的图标为主,左上角有本例模拟公司的名称,右边是账号密码输入框,对于用户的错误输入,会在登陆框下面实现提示信息的红色显示,让用户及时地更改信息,保证用户体验,整体界面简洁淡雅,清爽干净,主界面如图16 所示。[5]
5.2 会员寄快递模块
图13 百度地图api 效果图
会员点击我要寄快递,弹出寄快递页面,用户填写相应的寄件人信息和收件人信息后,点击提交即可完成寄快递功能。 其中,寄件人信息(包括寄件人姓名、寄件人省市区地址、寄件人详细地址、寄件人电话)均为用户登录着的相关信息,如用户有需要改变,可在寄件人信息区域更改信息,但是,寄件人手机号不允许修改,因为寄件人手机号是登录的唯一标志。
收件人信息必须完整且准确地填写,收件人信息(包括收件人姓名、收件人省市区地址、收件人详细地址、收件人电话)均为正则表达式判断,若有非法输入数据,均会在输入框的后面显示错误提示红色信息,指导用户做出修改,填写正确数据。
图15 百度地图api 效果
图16 主界面截图
收件人省市区和寄件人省市区不允许单独填写,必须要在系统所给定的选择框中选择省市区信息,此举目的是为了防止非法输入以及城市信息的不准确性,本系统所有省市区数据信息均来自中华人民共和国民政部官网民政数据一览下载最新版《2020 年2 月中华人民共和国县以上行政区划代码》,并逐一导入到数据库中。[6-8]
省市区共建立31 个省结点、以及下设的354个市结点和市区下的区/县结点。
本项目快递运输费用采用2020 年韵达快递公司新发的《韵达快递2020 年计费标准》文件,其中计费规则用户可以点击界面下方的“查看计费规则”按钮,系统将自动弹出计费规则如图17所示:
图17 计费规则信息界面截图
寄快递主界面如图18 所示:
图18 寄快递界面截图
6 系统测试与评价
6.1 系统的特点和优点
在社会日益进步的今天,快递物流行业兴起,我认为物流公司需要逐步地优化自身的体系结构,包括运输路径,本文根据Floyd 算法,对快递运输路径进行了一定程度上的优化,并且利用百度地图api 进行界面显示。
本系统功能虽看似不多,但每一项功能都精心制作,确保给用户一个完美的用户体验,包括用户的误操作、非法输入等非常规操作的提醒,到防sql注入的数据库安全管理。 本系统的界面采用css+js 自由开发,界面简洁、明了,颜色清新不浮夸,为用户的使用带来良好的使用体验。
本系统的数据严谨,所有的省市、城市、区县数据均来自国家网站的最新数据,数据库采用neo4j数据库,为系统数据的查询、添加、搜索运输路线提供了强大的支持。
6.2 系统存在的不足和解决方案
系统开发之前没有想好具体的实现方案,有很多地方存在一些不足。 比如会员充值界面,并没有做到真正扫码付款,而是一个图片的二维码,没有真正与支付软件衔接起来。 由于自身原因,没有研究透一些框架,并没有采用像springMVC 这样强大的框架来搭起这款系统,而是采用之前熟悉的MVC 框架来搭起这款系统,所以之后的研究是需要继续深入使用更加稳定易于维护开发的架构来搭建系统。