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


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

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

    在这里插入代码片
    
    • 1

    入口controller.java

    //导出节点数据到csv文件中
    @GetMapping("exportNodeData")
    public void exportNodeData(HttpServletResponse response) {
        service.exportNodeData(response);
    }
    
    //导出关系数据到csv文件中
    @GetMapping("exportRelationData")
    public void exportRelationData(HttpServletResponse response) {
    	service.exportRelationData(response);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    service.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();
            }
    
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76

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

    <dependency>
                <groupId>cn.hutoolgroupId>
                <artifactId>hutool-allartifactId>
                <version>5.7.21version>
            dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    解释:
    节点中的,
    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目录,执行下面语句

    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
    
    • 1

    在这里插入图片描述
    成功之后启动Neo4j,查看数据即可。

  • 相关阅读:
    Makefile——Linux下C/C++编译方法
    Golang 回调函数&&闭包&&接口函数
    Redis的数据淘汰策略
    Mathematica对函数表达式求导并设置为新的自定义函数
    编译VTK静态库
    2016年新华三杯复赛实验试题
    支持自动生成API文档 Apipost 真香
    基于虚拟机的集群冗余简化
    pnp单目相机标定测距
    C# ComboBox 和 枚举类型(Enum)相互关联
  • 原文地址:https://blog.csdn.net/weixin_49456013/article/details/133353525