`

Neo4j批量插入性能优化

 
阅读更多

 

一. 原生的远程操作接口

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还提供了一种嵌入式数据库操作,就是直接操作数据库文件。这种方式处理效率非常高,TPS1W以上。但是如果用这种方法的话,就不能分布式进行处理了。

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最全面指南以及springboot+java驱动不用编写复杂语句

    **Neo4j** 是一款基于图形数据模型的高度优化的 NoSQL 数据库。它将传统的表格数据结构转变为网络图的形式进行存储,这使得处理高度连接的数据集变得异常高效。Neo4j 不仅是一款高性能的图形数据库,同时也是一款...

    springBoot_neo4j-master.zip

    - 批量操作:使用批量插入和更新,减少网络往返和数据库操作次数。 7. **安全与监控** - 安全性:确保数据库连接的安全性,使用SSL加密通信,限制访问权限。 - 监控:通过Spring Boot Actuator提供的监控端点,...

    springboot_neo4j_fed4iz_springbootneo4j_www.4bb83ec69_WWW,9659J,

    在实际应用中,为提高性能,可能需要考虑缓存策略、索引优化、批量插入和事务管理。Spring Data Neo4j提供了相应的支持,例如使用`@Transactional`注解进行事务控制,使用`@QueryResult`优化查询结果的封装。 综上...

    neo4j_extended:对neo4j驱动程序的扩展,为节点和关系提供了结构化的方法

    - **批处理操作**:可能支持批量插入或更新,提高性能,特别是在处理大量数据时。 - **查询构建器**:可能提供一种构建Cypher查询的API,使得查询构造更加模块化和易于理解。 - **错误处理**:可能封装了错误处理...

    spring-boot-neo4j-2.1.8

    使用Spring Data Neo4j时,了解图形数据库的最佳实践和性能调优策略至关重要,例如批量插入、索引管理、内存优化等。 总结来说,"spring-boot-neo4j-2.1.8"项目展示了如何在Spring Boot应用中使用Neo4j 2.1.8进行...

    neo4j-good-practices:伴随 Neo4j 开发实践演示的代码

    7. **性能优化** - 了解索引、约束和性能分析工具(如 `PROFILE` 关键字)是提高查询效率的关键。 - 示例可能涉及创建自定义索引,优化 Cypher 查询以减少迭代次数,或者使用 Neo4j 的内置缓存机制。 8. **图形...

    neo4j_upload

    8. **性能优化**:根据具体需求,可能需要考虑数据预处理、并发上传等策略来提高整体上传速度。 9. **安全与权限**:确保连接到Neo4j时使用安全的连接方式,例如使用HTTPS,并合理设置数据库的访问权限,防止未授权...

    spring-data-neo4j:SDN 4

    4. **批处理和流处理**:支持批量插入和更新操作,以及使用Java 8的Stream API进行高效的数据处理。 5. **性能优化**:通过缓存策略和批处理,SDN 4提升了整体性能,减少了对数据库的不必要的访问。 **在项目中...

    batch-import

    7. **性能优化**: - 分区策略:根据数据的特性进行分区,可以提高导入效率。 - 内存设置:根据数据量调整Java堆大小,确保有足够的内存进行数据加载。 - 并行导入:如果硬件资源充足,可以考虑并行导入多个数据...

    Python库 | py2neo-4.1.0.tar.gz

    py2neo提供了批量操作的功能,例如批量插入节点和关系,这在处理大量数据时能显著提高效率。此外,合理设计节点和关系的索引,以及使用恰当的查询策略,也能提升查询性能。 **8. 集成其他Python库** py2neo可以与...

    主流NoSQL和应用场景详解.docx

    - 高性能的批量插入和更新。 NoSQL数据库的应用场景广泛,但选择哪种类型的NoSQL取决于具体业务需求。例如,社交网络应用可能更适合使用图数据库,而电子商务网站则可能受益于键值或文档数据库。随着互联网规模的...

    py2neo-py2neo-2.0.2.tar.gz

    6. **性能优化**:虽然Py2neo 2.0.2相比最新版本可能缺乏一些优化,但它仍提供了批量操作功能,如批量插入节点和关系,以提高性能。 7. **错误处理**:Py2neo库对可能出现的错误进行了封装,如网络问题、数据库错误...

    mysql的建立连接,读取数据

    此外,对于大型项目,我们还应该关注性能优化,比如使用索引、分页查询、避免全表扫描,以及合理设计数据库架构。事务处理和错误处理也是数据库开发中不可忽视的部分,它们确保数据的一致性和安全性。 总的来说,...

    tech_analysis

    对于数据导入,可能涉及到一些关键的步骤,例如数据预处理(清洗、验证和转换)、性能优化(如批量插入而非单条插入)以及错误处理。如果这个工具是针对图数据库,那么它可能使用了如Neo4j这样的图数据库管理系统,...

    Getting.Started.With.NoSQL

    - **批量插入**:高效地添加新数据。 - **批量更新**:同时更新多个记录。 - **批量删除**:删除大量数据。 #### 查询选项 查询能力是衡量NoSQL数据库适用性的重要标准,包括: - **按ID获取**:根据唯一标识符...

    北风数据库

    最后,"北风数据库"对于学习数据库备份、恢复、性能优化也有很大的帮助。我们可以实践如何备份数据库以防止数据丢失,以及如何进行恢复测试。通过分析查询执行计划,我们可以了解如何调整索引以提升查询速度,或者...

Global site tag (gtag.js) - Google Analytics