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

背景:我们项目第一次部署图数据库,要求我们把现有的业务数据以及关系上线第一时间初始化到Neo4j中。开发环境数据量已经百万级别。生成环境数据量更多。

我刚开始开发的时候,由于对Neo4j的了解并没有很多,第一想到的是用代码通用组装create语句进行创建节点以及关系。

业务说明:系统中有很多实体表,每个实体表中有自己的数据,不同实体有一张关系表进行维护。

我开发的思路是:1.先将所有的表中数据取出来做为节点 2.根据关系表将这个数据的关系查出来之后组装语句将数据添加到Neo4j中。

具体代码如下(Springboot项目版本2.2.5RELEASE):
pom.xml

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-neo4j</artifactId></dependency>

配置文件进行下面配置:

spring:data:neo4j:uri: bolt://localhost:7687username: neo4jpassword: neo4j

使用Java代码组装CQL语句,用原生session进行
Neo4jConfig.java

@Configuration
public class Neo4jConfig {@Value("${spring.data.neo4j.uri}")private String uri;@Value("${spring.data.neo4j.username}")private String userName;@Value("${spring.data.neo4j.password}")private String password;@Beanpublic org.neo4j.ogm.config.Configuration getConfiguration() {org.neo4j.ogm.config.Configuration configuration = new org.neo4j.ogm.config.Configuration.Builder().uri(uri).connectionPoolSize(100).credentials(userName, password).withBasePackages("com.troy.keeper.desc.repository").build();return configuration;}@Beanpublic SessionFactory sessionFactory() {return new SessionFactory(getConfiguration());}@Bean("neo4jTransaction")public Neo4jTransactionManager neo4jTransactionManager(SessionFactory sessionFactory) {return new Neo4jTransactionManager(sessionFactory);}

接口入口Controller.java

@GetMapping("initDataToNeo4j")public void initDataToNeo4j() {service.initDataToNeo4j();}

Service.java

//节点数据,按照自己的实际业务添加,我这里对应的是所有表的数据,因为我业务中所有表结果基本一样,也即节点属性都一样。每个表的数据一个map,key是表名作为节点的标签
Map<String, List<NodeData>> nodeDataMap;
//关系数据,将每一个表数据的关系作为RelationData实体
List<RelationData> relationDatas;//数据组装完成后,进行节点的创建
neo4jUtil.creatNode(nodeDataMap);//进行关系绑定
neo4jUtil.bindRelation(relationDatas);

NodeData.java

private String id;//属性id
private String name;//属性名称
private String table;//作为节点标签

RelationData.java

//关系id
private String id;
//关系名称
private String relationName;
//因为我这里的关系跨实体,所以需要指定结束标签
private String endLableName;//因为我这里的关系跨实体,所以需要指定开始标签
private String startLableName;//开始节点的值
private String startValue;//结束节点的值
private String endWhereValue;

Neo4jUtil.java

@Component
public class Neo4jUtil {
@Resource
private Session session;
/*** 删除标签下的节点(包括节点之间的关系)* @param lableName* @return*/public Integer deleteByLable(String lableName) {if (StringUtils.isEmpty(lableName)) {return 0;}String cypherSql = String.format("MATCH (r:`%s`) DETACH DELETE r ", lableName);Result query = session.query(cypherSql, new HashMap<>(16));session.clear();return query.queryStatistics().getNodesDeleted();}//创建节点
public  void creatNode(Map<String, List<NodeData>> nodeDataMap) {if (nodeDataMap == null) {return ;}for(String key:nodeDataMap.keySet()){List<NodeData> data= nodeDataMap.get(key);if (StringUtils.isEmpty(key)) {continue;}//表下没有数据的只创建一个没有属性的节点if (data== null || data.isEmpty()) {String sql =String.format("create (:`%s`)",key);session.query(sql, new HashMap<>(16));continue;}//因为是全量导入,可以先删除这个标签下的全部节点和关系,按照自己业务要求自行添加deleteByLable(key);for (NodeData nodeData:data) {//兼容中文和特殊符号String  labels = ":`" + String.join("`:`", key) + "`";;String id = nodeData.getId();String name = nodeData.getName();String property =  String.format("{id:'%s',name:'%s'} ",  id,name);String sql = String.format("create (%s%s)", labels, property);session.query(sql, new HashMap<>(16));}}}//绑定关系
public void bindRelation( List<RelationData> relations) {if (relations== null) {return;}for (RelationData relation:relations) {String id = relation.getId();String relationName = relation.getRelationName();String startLableName = relation.getStartLableName();String endLableName = relation.getEndLableName();String startValue = relation.getStartValue();String endValue = relation.getEndValue();String property =  String.format("{id:'%s',name:'%s'} ", id,relationName);String cypherSql =  String.format("MATCH (n:`%s`),(m:`%s`) where n.id ='%s' and m.id= '%s' CREATE (n)-[r:%s%s]->(m)",startLableName,endLableName,startValue ,endValue ,relationName,property) ;session.query(cypherSql, new HashMap<>(16));}}
}

之后执行controller接口,进行数据抽取和导入Neo4j,我开发的时候用的环境,大约有7w个节点,120w条关系。用本地Neo4j跑了两个多小时,连服务器部署的(跨地区)跑了8个小时。。。。

太慢了

后来查资料说是create适合数据量小的时候用,对于大量数据导入可以用neo4j-admin import ,接下来改造用neo4j-admin import ,参见Java初始化数据到Neo4j中(二)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/90354.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Mybatis 批量修改数据,,并判断非空数据插入

方法一&#xff1a; <update id"updateListPO"> <foreach collection"list" separator";" item"item">UPDATE project_quotation_item<SET>product_num #{item.productNum},product_price_total #{item.pr…

CIP或者EtherNET/IP中的PATH是什么含义?

目录 SegmentPATH举例 最近在学习EtherNET/IP&#xff0c;PATH不太明白&#xff0c;翻了翻规范&#xff0c;在这里记个笔记。下面的叙述可能是中英混合&#xff0c;有一些是规范中的原文我直接搬过来的。我翻译的不准确。 Segment PATH是CIP Segment中的一个分类。要了解PATH…

每日一题 322零钱兑换(完全背包)(灵神版本)

题目 与01背包的区别就是可以重复拿一件物品 零钱兑换 给你一个整数数组 coins &#xff0c;表示不同面额的硬币&#xff1b;以及一个整数 amount &#xff0c;表示总金额。 计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额&#xff…

Dev C++安装与运行

参考: https://blog.csdn.net/Keven_11/article/details/126388791 https://www.cnblogs.com/-Wallace-/p/cpp-stl.html 2021年真题要求 2022年真题要求 河南省的考试环境 IDE环境 Dev C 安装 下载 安装 点击OK&#xff0c;选择我接受 修改安装路径为D盘d:\Program Fi…

MQTT协议是什么?快速了解MQTT协议在物联网中的应用

随着工业互联网的迅猛发展&#xff0c;工业设备数据采集和实时监控成为制造业提高生产效率和质量的重要手段。在物联网应用中&#xff0c;通信技术包括Wi-Fi、RFID、NFC、RS232、RS485、USB等&#xff0c;其中在物联网技术框架体系中所使用到的通讯协议主要有&#xff1a;AMQP、…

[ruby on rails] postgres sql explain 优化

一、查看执行计划 sql User.all.to_sql # 不会实际执行查询 puts ActiveRecord::Base.connection.explain(sql)# 会实际执行查询&#xff0c;再列出计划 User.all.explain# 会实际执行查询&#xff0c;再列出计划ActiveRecord::Base.connection.execute(EXPLAIN ANALYZE sql…

[论文笔记]P-tuning

引言 今天带来第四篇大模型微调的论文笔记GPT Understands, Too。 本篇工作提出的方法是P-tuning,使用可训练的连续提示嵌入,使GPT在NLU上表现比传统的全量微调的GPT更好的效果。P-tuning还提高了BERT在少样本和监督设定下的性能,大幅减少了提示工程的需求。 总体介绍 根…

Django(21):使用Celery任务框架

目录 Celery介绍Celery安装Celery使用项目文件和配置启动Celery编写任务调用异步任务查看任务执行状态及结果 设置定时和周期性任务配置文件添加任务Django Admin添加周期性任务启动任务调度器beat Flower监控任务执行状态Celery高级用法与注意事项给任务设置最大重试次数不同任…

2023-09-28 mysql-代号m-schema调研-文档记录

摘要: mdb中的database与mdb中的database的概念南辕北辙, 可以说有着本质的不同. mysql中的database可以看作是table的namespace, 而在mdb中, 与此相似的概念也就是table的namespace的概念, 是schema. 为了将mysql的db与mdb的schema建立映射关系后的技术风险可控, 需要详细分…

26663-2011 大型液压安全联轴器 课堂随笔

声明 本文是学习GB-T 26663-2011 大型液压安全联轴器. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本标准规定了大型液压安全联轴器的分类、技术要求、试验方法及检验规则等。 本标准适用于联接两同轴线的传动轴系&#xff0c;可起到限制…

面试算法14:字符串中的变位词

题目 输入字符串s1和s2&#xff0c;如何判断字符串s2中是否包含字符串s1的某个变位词&#xff1f;如果字符串s2中包含字符串s1的某个变位词&#xff0c;则字符串s1至少有一个变位词是字符串s2的子字符串。假设两个字符串中只包含英文小写字母。例如&#xff0c;字符串s1为&quo…

软考高级之系统架构师之软件需求工程

概述 一个完整的软件生存周期是以需求为出发点。软件需求是指用户对系统在功能、行为、性能、设计约束等方面的期望。 需求开发&#xff1a; 需求获取需求分析需求定义&#xff08;需求规格说明书&#xff09;需求验证 需求管理: 变更控制版本控制需求跟踪需求状态跟踪 需…

零基础Python经验体验代码检查工具

作者&#xff1a;yd_257945187 原文链接&#xff1a;零基础Python经验体验代码检查工具-云社区-华为云 1 开发小白自述 年初&#xff0c;我开始从java语言转战Python语言的开发&#xff0c;对于零基础python经验的人来说&#xff0c;要开发出高质量且安全性能高的Python 代码…

解决craco启动react项目卡死在Starting the development server的问题

现象&#xff1a; 原因&#xff1a;craco.config.ts配置文件有问题 经过排查发现Dev开发模式下不能有splitChunk的配置&#xff0c; 解决办法&#xff1a; 加一个生产模式的判断&#xff0c;开发模式不加载splitChunk的配置&#xff0c;仅在生产模式才加载 判断条件代码&#…

notepad++配置python2环境

&#xff08;1&#xff09;python2版本下载&#xff1a;Index of /ftp/python/2.7.8/https://www.python.org/ftp/python/2.7.8/ &#xff08;2&#xff09; 配置notepad环境 1.打开Notepad&#xff0c;点击“插件”-“插件管理器”&#xff0c;在“可用”选项卡中&#xff0c…

云安全之访问控制介绍

访问控制技术背景 信息系统自身的复杂性、网络的广泛可接入性等因素&#xff0c;系统面临日益增多的安全威胁&#xff0c;安全问题日益突出&#xff0c;其中一个重要的问题是如何有效地保护系统的资源不被窃取和破坏。 访问控制技术内容包括访问控制策略、访问控制模型、访问…

《学术小白学习之路13》基于DTM和主题共现网络——实现主题时序演化网络分析(数据代码在结尾)

《学术小白学习之路13》基于DTM和主题共现网络实现主题演化网络分析 一、数据导入二、数据预处理2.1分词2.2 向量化三、DTM建模3.1 主题一致性检验3.2主题建模四、计算主题的相似度4.1获取文档主题分布4.2 时期分组4.3相似度计算4.3.1第一时期和第二时期的对比4.3.2第二时期与第…

ip地址可以精确定位吗

在互联网时代&#xff0c;IP地址的重要性不言而喻。作为网络通信的基础&#xff0c;IP地址用于标识每一台连接到互联网的设备。然而&#xff0c;传统的IP地址定位方式仅能粗略地确定设备的大致位置&#xff0c;无法实现精确定位。那么&#xff0c;IP地址能否实现精确定位呢&…

浅谈ChatGPT附免费体验地址

首先&#xff0c;让我来介绍一下ChatGPT是什么。ChatGPT是由OpenAI开发的大型语言模型&#xff0c;它代表着自然语言处理领域的最新进展。这个模型是通过大量的数据和先进的深度学习技术训练而成&#xff0c;具备了强大的语言理解和生成能力。 那么&#xff0c;ChatGPT能做些什…

我开源了一个加密算法仓库,支持18种算法!登录注册业务可用!

文章目录 仓库地址介绍安装用法SHA512HMACBcryptScryptAESRSAECC 仓库地址 仓库地址&#xff1a;https://github.com/palp1tate/go-crypto-guard 欢迎star和fork&#xff01; 介绍 此存储库包含用 Go 编写的全面的密码哈希库。该库支持多种哈希算法&#xff0c;它允许可定制…