2025/7/3
今天目标
- 路线规划需求分析
- 路线规划实现方案分析
- Neo4j的快速入门
- 学习Spring Data Neo4j
学之前先思考:
理解为什么使用Neo4j来实现路线规划? 图数据形式存储能更高效找到运输路线
Neo4j中Cypher基本操作有哪些?
Spring Data Neo4j如何使用?
看这个路线,一条一条找有点费劲而且代码复杂不好维护,解决方案就是路线图
如果数据能够按照图形的方式存储,那么对于运输路线的计算就会更高效一些 “一图胜千言万语”
所以就用到了图数据库(Neo4j):以图的方式存储数据
先总结:
今天学了两个点 一、Cypher基本操作 二、Spring Data Neo4j的用法
一、Cypher基本操作
什么是Neo4j?
Neo4j是用Java实现的开源NoSQL图数据库。
Neo4j能做什么?
如:网络管理、软件分析、组织和项目管理、社交项目等方面都有应用。
Neo4j怎么使用?
借助Neo4j的查询语言Cypher即可使用 (类似MySQL的SQL查询语句)
1、安装然后打开
docker run -d --restart=always --name neo4j -p 7474:7474 -p 7687:7687 -v neo4j:/data neo4j:4.4.5 # 7474是web管理工具的端口,7687是neo4j协议端口进行数据通信
打开浏览器,输入地址:http://neo4j.sl-express.com/browser/
用户名:neo4j,密码:neo4j123
2、先对Neo4j有个基本认识 ,Neo4j中采用节点、属性、关系、标签来存储数据。如下:
节点:每一条数据
属性:每条数据都有哪些属性
关系:节点和节点之间的关系(关系是人为定制的)
标签:给节点分类
3、好了基本概念也了解了,现在通过Cypher正式入门Neo4j
注意:理解能看懂语法就行,不需要能默写
详细看文档的创建、查询、更新、删除数据,重点在分页查询数据
二、Spring Data Neo4j的用法
1、搭建环境:
依赖、配置、基础代码(引导类、实体类、DTO)
2、Repository:
SDN也是遵循了Spring Data规范,同时也提供了Neo4jRepository,
该接口中提供了基本的CRUD操作,我们定义Repository需要继承该接口来实现增删改查并且不用写具体实现。
3、复杂查询
继承Neo4jRepository实现简单的查询是非常方便的,如果要实现复杂的查询就需要定义Cypher查询实现了,需要通过Neo4jClient进行查询操作
做路线规划业务的基本常识了解之后,正式开始完成功能
对于运输路线规划,总的需求有两个,一个是机构管理,一个是路线管理。
2025/7/4
路线规划(一)机构管理
机构管理
1、分析需求:
对于机构管理中基本信息的维护(比如机构地址、机构负责人,联系电话等)
但是我们发现,后台系统中并没有新增机构的相关按钮操作,那么这个机构信息在哪里新增呢?
==注意:机构的基本信息都是存储到Neo4j中的==
这时候就用到权限管家
机构的管理是需要与【权限管家】系统中的【组织管理】中的数据进行同步操作的,也就是机构的新增是在权限管家里实现的,那么同步是需要通过RabbitMQ完成的,避免代码重复
拉取基础代码略
2、具体实现
机构管理主要是围绕这两个维度来写
1、MQ配置
相关MQ的配置信息在Nacos中的sl-express-transport-properties配置文件中,包含了相同的交换机
2、监听业务实现
package com.sl.transport.listener;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.sl.transport.common.constant.Constants;
import com.sl.transport.entity.node.AgencyEntity;
import com.sl.transport.entity.node.BaseEntity;
import com.sl.transport.entity.node.OLTEntity;
import com.sl.transport.entity.node.TLTEntity;
import com.sl.transport.enums.OrganTypeEnum;
import com.sl.transport.service.IService;
import com.sl.transport.utils.OrganServiceFactory;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.ExchangeTypes;
import org.springframework.amqp.rabbit.annotation.Exchange;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.QueueBinding;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
@Component
@Slf4j
public class AuthMQListener {
/**
* 监听权限管家过来的消息
* @param msg
*/
@RabbitListener(bindings = @QueueBinding(
value = @Queue(name = Constants.MQ.Queues.AUTH_TRANSPORT),
exchange = @Exchange(name ="${rabbitmq.exchange}",type = ExchangeTypes.TOPIC),
key = "#"
))
public void listenAgencyMsg(String msg){
log.info("接受到的数据:"+msg);
//消息的格式如下 其中:operation类型列表 新增-ADD 修改-UPDATE 删除-DEL
//{"type":"ORG","operation":"ADD","content":[{"id":"977263044792942657","name":"北京转运中心","parentId":"0","managerId":null,"status":true}]}
//{"type":"ORG","operation":"ADD","content":[{"id":"977263044792954321","name":"顺义分拣中心","parentId":"977263044792942657","managerId":null,"status":true}]}
//{"type":"ORG","operation":"ADD","content":[{"id":"977263044792951234","name":"马坡营业部","parentId":"977263044792954321","managerId":null,"status":true}]}
// 为了更好的获取json字符串中的属性值 转成json对象
JSONObject jsonObject = JSONUtil.parseObj(msg);
String type = jsonObject.getStr("type");
// 判断是否为ORG
if(!StrUtil.equals(type,"ORG")){
return;
}
// 判断 一级 二级 网点
// 获取实体的Json对象
JSONObject entityJsonObject = (JSONObject) jsonObject.getJSONArray("content").get(0);
String name = entityJsonObject.getStr("name");
BaseEntity entity = null;
IService iservice = null;
if (name.endsWith("转运中心")) { // 一级转运中心
entity = new OLTEntity();
iservice = OrganServiceFactory.getBean(OrganTypeEnum.OLT.getCode());
}
if (name.endsWith("分拣中心")) { // 二级转运中心
entity = new TLTEntity();
iservice = OrganServiceFactory.getBean(OrganTypeEnum.TLT.getCode());
}
if (name.endsWith("营业部")) { // 网点
entity = new AgencyEntity();
iservice = OrganServiceFactory.getBean(OrganTypeEnum.AGENCY.getCode());
}
entity.setParentId(entityJsonObject.getLong("parentId"));
entity.setBid(entityJsonObject.getLong("id"));
entity.setName(name);
entity.setStatus(entityJsonObject.getBool("status"));
String operation = jsonObject.getStr("operation");
// 判断是 UPDATE DEL
switch (operation) {
case "ADD":{
iservice.create(entity);
log.info("新增操作");
break;
}
case "UPDATE":{
iservice.update(entity);
log.info("修改操作");
break;
}
case "DEL":{
iservice.deleteByBid(entity.getBid());
log.info("删除操作");
break;
} default:{
break;
}
}
}
}手动创建4个实现类
再处理完小坑就完事了
路线规划(二)线路管理
推荐阅读:










文章有(0)条网友点评