Java初始化大量数据到Neo4j中(二)

接Java初始化大量数据到Neo4j中(一)继续探索,之前用create命令导入大量数据发现太过耗时,查阅资料说大量数据初始化到Neo4j需要使用neo4j-admin import

业务数据说明可以参加Java初始化大量数据到Neo4j中(一),这里主要是将处理好的节点数据和关系数据分别导出为csv

java 复制代码
在这里插入代码片

入口controller.java

java 复制代码
//导出节点数据到csv文件中
@GetMapping("exportNodeData")
public void exportNodeData(HttpServletResponse response) {
    service.exportNodeData(response);
}

//导出关系数据到csv文件中
@GetMapping("exportRelationData")
public void exportRelationData(HttpServletResponse response) {
	service.exportRelationData(response);
}

service.java

java 复制代码
//导出节点数据
 	@Override
    public void exportNodeData(HttpServletResponse response) {
    	//节点数据,按照自己的实际业务添加,我这里对应的是所有表的数据,因为我业务中所有表结果基本一样,也即节点属性都一样。每个表的数据一个map,key是表名作为节点的标签
		Map<String, List<NodeData>> nodeDataMap;

		List<Map<String,String>> data = new ArrayList<>();
        for(String key:nodeDataMap.keySet()){
            List<NodeData> dataList = nodeDataMap.get(key);
            if (StringUtils.isEmpty(key) || dataList ==null || dataList .isEmpty()) {
                continue;
            }

            for (NodeData nodeData:dataList ) {
                Map<String,String> map = new HashMap<>();
                
                String id = nodeData.getId();
                String name = nodeData.getName();
                String table = nodeData.getName();
                //因为不同表的id会重复,需要一个不重复的值作为节点唯一值(我这里用的是表id拼接表数据id)
                String uniqueValue = nodeData.getUniqueValue(); 
                map.put(":LABEL",table );
                map.put("id",id);
                map.put("name",name);
                map.put("uniqueValue:ID",uniqueValue);
                data.add(map);
            }
        }
        try {
            response.setCharacterEncoding("UTF-8");
            response.setHeader("Content-Disposition", "attachment;filename=" + new String("nodeimport.csv".getBytes(StandardCharsets.UTF_8), "ISO8859-1"));
            response.setContentType(ContentType.APPLICATION_OCTET_STREAM.toString());
            CsvWriter csvWriter =  CsvUtil.getWriter(response.getWriter()) ;
            csvWriter.writeBeans(data);
            csvWriter.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
}

	//导出关系数据
	@Override
    public void exportRelationData(HttpServletResponse response) {
        //关系数据,将每一个表数据的关系作为RelationData实体
		List<RelationData> relationDatas;
        List<Map<String,String>> data = new ArrayList<>();
        for (RelationData relation : relationDatas)  {
            Map<String,String> map = new HashMap<>();
          
            String relationName = relation .getRelationName();
            String id = relation .getId();
            //因为节点是通过表id拼接数据id,所以关系这里也需要加上拼接后不重复的值
            //开始节点唯一的值
            String uniqueStartValue = relation .getUniqueStartValue();
            //结束节点唯一的值
            String uniqueEndValue = relation .getUniqueEndValue();
           
            map.put("relationName",relationName) ;
            map.put("id",id) ;
            map.put(":START_ID",uniqueStartValue) ;
            map.put(":END_ID",uniqueEndValue) ;
            map.put(":TYPE",relationName) ;
            data.add(map);
        }
        try {
            response.setCharacterEncoding("UTF-8");
            response.setHeader("Content-Disposition", "attachment;filename=" + new String("relationimport.csv".getBytes(StandardCharsets.UTF_8), "ISO8859-1"));
            response.setContentType(ContentType.APPLICATION_OCTET_STREAM.toString());
            CsvWriter csvWriter =  CsvUtil.getWriter(response.getWriter()) ;
            csvWriter.writeBeans(data);
            csvWriter.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

CsvUtil用的是Hutool中的工具类,引入下面依赖即可

xml 复制代码
<dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.7.21</version>
        </dependency>

解释:

节点中的,

uniqueValue:ID 冒号前面可以随便写,冒号后端必须是ID,标识全局id,不可重复

:LABEL:这个是标签名,必须这样写

除了这两个以外的字段都是作为节点的属性。

导出的nodeimport.csv文件如下

关系中:

:START_ID:开始节点的唯一值

:END_ID:结束节点的唯一值

:TYPE:关系类型

除这三个外的字段都作为关系

导出的relationimport.csv文件如下:

之后找到Neo4j安装目录,找到import目录,将这个两个导出的文件放到import目录下

删除data\databases目录下的文件(neo4j-admin import要求是空文件 ) ,停掉Neo4j

cmd进入到bin目录,执行下面语句

xml 复制代码
neo4j-admin import --mode=csv  --nodes "E:\work_soft\neo4j-community-3.5.5-windows\neo4j-community-3.5.5\import\nodeimport.csv" --relationships "E:\work_soft\neo4j-community-3.5.5-windows\neo4j-community-3.5.5\import\relationimport.csv" --ignore-extra-columns=true --ignore-missing-nodes=true --ignore-duplicate-nodes=true

成功之后启动Neo4j,查看数据即可。

相关推荐
我命由我1234510 分钟前
Java 开发 - CountDownLatch 不需要手动关闭
android·java·开发语言·jvm·kotlin·android studio·android-studio
小研说技术11 分钟前
结构化输出让Agent返回可预测的格式数据
java·人工智能
两年半的个人练习生^_^26 分钟前
PinYin4j汉字转拼音使用及踩坑
java
weixin_5689960632 分钟前
c++如何实现日志文件的异步落盘功能_基于无锁队列方案【附代码】
jvm·数据库·python
chaofan98038 分钟前
GPT-5.5 全压力测试:为什么 API 聚合调度是解决“首字延迟”的技术关键?
开发语言·人工智能·python·gpt·自动化·api
才兄说39 分钟前
机器人二次开发机器人动作定制?定制化舞蹈
python
曲幽44 分钟前
FastAPI配置管理避坑指南:从硬编码到 .env 与 pydantic_settings 类,连路由用法都给你捋清楚
python·fastapi·web·settings·config·pydantic·.env·dotenv·.env.prod
Cat_Rocky1 小时前
通过k8s实现单pod部署
java·容器·kubernetes
淘矿人1 小时前
2026年4月-DeepSeek V4 vs GPT-5.5深度对比测评:weelinking一键切换实测
服务器·数据库·人工智能·python·gpt·学习·php
秋91 小时前
Java AI编程工具全景解析:功能、收费与工单系统实战指南
java·开发语言·ai编程