一. 原生的远程操作接口
Neo4j原生的直接可用的插入方式有以下几种:
1. Rest api执行Cypher语句
public boolean flush() { if (sqlCache.size() != 0) { long start = System.currentTimeMillis(); restAPI.executeBatch(new Process(sqlCache)); logger.info("Size:{},cost:{}ms", sqlCache.size(), System.currentTimeMillis() - start); sqlCache.clear(); } return true; }
2. Neo4j Jdbc 执行cypher语句
public boolean flush() { if (sqlCache.size() != 0) { long start = System.currentTimeMillis(); try { Statement statement = conn.createStatement(); for(String sql:sqlCache){ statement.execute(sql); } } catch (SQLException e) { logger.error("failed to execute sqls",e); } logger.info("Size:{},cost:{}ms",sqlCache.size(),System.currentTimeMillis() - start); sqlCache.clear(); } return true; }
上面两种方式执行效率差不多,都在500tps左右,其中Rest Api支持批量提交,调用了Neo4j的批量提交接口。如果不做批量提交,大概每次请求消耗在50ms左右。
二.嵌入式方式操作数据库
Neo4j还提供了一种嵌入式数据库操作,就是直接操作数据库文件。这种方式处理效率非常高,TPS在1W以上。但是如果用这种方法的话,就不能分布式进行处理了。
1.创建开始数据库 String DB_PATH = "e:/zztt.db"; GraphDatabaseService graphDB = new GraphDatabaseFactory().newEmbeddedDatabase(DB_PATH); //停止数据库 graphDB。shutdown();
三.插件方式操作数据库
为了结合以上的两种方式,想到了使用插件来操作数据库。插件方式是指编写插件代码,然后部署到服务器上。这样我们可以自定义请求路径,然后以嵌入式的方式在服务端直接处理数据库。代码如下所示,这种方法的TPS也在1W左右,并且可以分布式提交数据变更请求
*/ @Path("/") public class UpdateResource { @POST @Path("/execute") public String execute( @Context GraphDatabaseService db,@FormParam("sqls") String sqls) throws IOException { if(sqls == null){ return "error argument"; } Object o = JSONObject.parse(sqls); if(o instanceof List){ UpdateServer.executeBatch(db,( List<Map<String, Object>>)o); }else{ UpdateServer.execute(db,(Map<String, Object>) o); } return "success"; } }
总结:原有的Cypher语句的批量执行的语句过慢,可能还是因为语法解析器效率不高的原因。上次查看过源码,批量提交实际上就是将请求打包,然后在服务端遍历所有请求,每个请求再直接调用jetty.handle方法,和非批量提交的区别就是少了一些网络传输交互时间
while ((token = jp.nextToken()) != null) { if (token == JsonToken.START_OBJECT) { String jobMethod="", jobPath="", jobBody=""; Integer jobId = null; while ((token = jp.nextToken()) != JsonToken.END_OBJECT && token != null ) { String field = jp.getText(); jp.nextToken(); switch ( field ) { case METHOD_KEY: jobMethod = jp.getText().toUpperCase(); break; case TO_KEY: jobPath = jp.getText(); break; case ID_KEY: jobId = jp.getIntValue(); break; case BODY_KEY: jobBody = readBody( jp ); break; } } // Read one job description. Execute it. performRequest( uriInfo, jobMethod, jobPath, jobBody, jobId, httpHeaders, locations, req ); } } @Override public void invokeDirectly( String targetPath, HttpServletRequest request, HttpServletResponse response ) throws IOException, ServletException { jetty.handle( targetPath, (Request) request, request, response ); }
相关推荐
neo4j基于嵌入式的测试数据生成与导入源代码 数据生成代码在源代码文件夹src/test/java中
这篇文章 将记录使用neo4j-import 工具进行大批量数据快速导入neo4j数据库中的具体过程。
一个帮助程序库,用于为Neo4j数据库设置批量数据插入 neo4j-bulk库的主要目标是创建一种简单直观的方法来为neo4j批量API设置数据模型,从而为测试套件设置初始数据库状态。 用法 首先,安装neo4j-bulk作为开发依赖...
neo4j性能优化
neo4j社区版 用户名 neo4j 密码neo4j
│ 关于Neo4j和Cypher批量更新和批量插入优化的5个建议 - 逆水行舟 - CSDN博.html │ 图数据库-Neo4j介绍与Cypher入门.html │ 图数据库之Cypher语言 - 活的洒脱怪我咯的专栏 - CSDN博客.html │ 图数据库之...
Java读取CSV插入Neo4j并生成Echarts关系图
neo4j,neo4j3.4.5 数据库,高性能NOSQL图形数据库:Neo4j,windos 版
11. 性能 12. 事务管理 13. 数据导入 14. 索引 15. Cypher查询语言 16. 图形算法 17. Neo4j服务器 18. REST API 19. 在Python中使用Neo4j嵌入模式 IV. 操作 20. 安装和部署 21. 配置和调优 ...
Beginning Neo4j is your introduction in the world of graph databases, and the benefits they can bring to your applications. Neo4j is the most established graph database on the market, and it's always ...
基于neo4j搭建金融风控图谱.rar基于neo4j搭建金融风控图谱.rar基于neo4j搭建金融风控图谱.rar基于neo4j搭建金融风控图谱.rar基于neo4j搭建金融风控图谱.rar基于neo4j搭建金融风控图谱.rar基于neo4j搭建金融风控图谱....
Neo4j文档 包括中英文文档 共两份 欢迎大家下载..
neo4j 简介
完整项目导入数据到Neo4j,通过jdbc查询Neo4j数据库,用SSM框架展示到前台,项目部署后可在前台批量导入数据,增量导入数据,添加节点,删除节点,修改节点,查询节点 有了它再也不用趟Neo4j的坑 解压密码是 neo4j
SpringBoot整合neo4j案例源码
vue+neo4j+(neovis.js / neo4j-driver)纯前端实现知识图谱的集成 一、Neovis.js 不用获取数据直接连接数据库绘图 二、 neo4j-driver 能够直接通过前端获取数据。 三、vis.js 绘图 四、 echarts绘图 neo4j是什么? ...
Linux的neo4j安装包
neo4j
neo4j mybatis的例子,全部代码先用maven下载jar包,jar包包含mybatis包,neo4j包,配置xml,编写mapper.java,mapper.xml
Neo4j是一个高性能的,NOSQL图形数据库,它将结构化数据存储在网络上而不是表中。它是一个嵌入式的、基于磁盘的、具备完全的事务特性的Java持久化引擎,但是它将结构化数据存储在网络(从数学角度叫做图)上而不是表中...