Neo4j 第五篇:批量更新数据

简介:

相比图形数据的查询,Neo4j更新图形数据的速度较慢,通常情况下,Neo4j更新数据的工作流程是:每次数据更新都会执行一次数据库连接,打开一个事务,在事务中更新数据。当数据量非常大时,这种做法非常耗时,大多数时间耗费在连接数据库和打开事务上,高效的做法是利用Neo4j提供的参数(Parameter)机制和UNWIND子句:在一次数据更新中,进行一次连接,打开一次事务,批量更新数据;参数用于提供列表格式的数据,UNWIND子句是把列表数据展开成一行一行的数据,每行数据都会执行结构相同的Cypher语句。再批量更新图形数据之前,用户必须构造结构固定的、参数化的Cypher语句。当Cypher语句的结构相同时,Neo4j数据库直接从缓存中复用已生成的执行计划,而不需要重新生成,这也能够提高查询性能。

除了官方的Neo4j Driver之外,本文分享使用Neo4jClient对图形数据批量更新,Neo4jClient提供的功能更强大,并支持参数和批量更新操作。

 

我的Neo4j系列的文章收录在:Neo4j

 

一,参数和UNWIND子句

1,通过RESTful API传递参数

Neo4j提供HTTP API处理Cypher语句和参数,在示例代码中,Neo4j的参数通过HTTP请求传递,statement定义的是查询语句,parameters定义的是参数。

在批量更新数据时,没有必要发送多个HTTP请求,通过参数,可以在一个HTTP请求(Request)中,开始一个事务,在事务中执行Cypher语句批量更新数据,最后提交该事务。

在发送HTTP请求传递参数批量更新数据时,设置HTTP Request的参数如下:

POST http://localhost:7474/db/data/transaction/commit
Accept: application/json; charset=UTF-8
Content-Type: application/json

注意:在HTTP API中,引用参数的格式是:{param}。

复制代码
{
  "statements" : [ {
    "statement" : "CREATE (n {props}) RETURN n",
    "parameters" : {
      "props" : {
        "name" : "My Node"
      }
    }
  } ]
}
复制代码

2,展开(UNWIND)子句

UNWIND子句把列表式的数据展开成一行一行的数据,每一个行都包含更新所需要的全部信息,列表式的数据,可以通过参数来传递。

例如,定义参数events,该参数是一个JSON字符串,键events是参数名,其值是一个数组,包含两个数组元素。

{
  "events" : [ {  "year" : 2014, "id" : 1}, {"year" : 2014, "id" : 2 } ]
}   

通过$events引用参数,UNWIND子句把events数组中的两个元素展开,每个元素执行一次Cypher语句,由于Cypher的语句结构固定,因此,执行计划被缓存起来,在执行数据更新任务时,参数被UNWIND子句展开,复用执行计划,提高数据更新的速度。

UNWIND $events AS event
MERGE (y:Year { year: event.year })
MERGE (y)<-[:IN]-(e:Event { id: event.id })
RETURN e.id AS x
ORDER BY x

二,在Neo4j Browser中使用参数

Neo4j Browser是Neo4j内置的浏览器,用于管理数据库,更新数据库和查询数据,再命令窗体中,通过“:”能够引用内置的命令,例如,通过 ":param"能够定义参数,并能够在下一个Cypher语句中引用参数。

1,通过:param命令定义参数

在Neo4j Browser中,输入第一个命令,通过:param 命令定义参数,

2,通过$param引用参数

紧接着,输入Cypher语句,通过$param引用参数

3,查看创建的图形

参数是一个列表格式的数据,在参数events中,两个event的year属性都是2014,因此,MERGE子句只会创建一个Year节点;由于两个event的id属性不同,因此MERGE子句会创建两个Event节点,并创建Year节点和Event节点之间的关系,图形如下图:

三,使用Neo4jClient批量更新数据

在工程(Projects)中输入命令安装Neo4jClient,

Package-Install Neo4jClient

1,连接Neo4j数据库

创建客户端,连接到数据库,创建的Uri的格式是:http://host_name:7474/db/data,并输入用户名和密码,然后创建图形客户端,并连接到Neo4j数据库。

复制代码
private GraphClient _client;
public Neo4jClientProvider()
{
    _client = new GraphClient(new Uri("http://localhost:7474/db/data"), "user_name", "password");
    _client.Connect();
}
复制代码

2,批量创建节点

传递List<T>参数,通过Unwind函数引用List,并为参数命名为"ns",在Cypher语句中引用参数"ns"

复制代码
public void CreateNodes(List<DataModel> nodes)
{
    _client.Cypher
        .Unwind(nodes, "ns")
        .Create("(n:NodeLable)")
        .Set("n.NodeID=ns.NodeID")
        .Set("n.Name=ns.Name")
        .ExecuteWithoutResults();
}
复制代码

2,批量创建关系

在List<T>参数中,传递两个节点的映射,在Neo4j数据库中,关系必须具有类型,因此,在把参数传递到Neo4j数据中时,需要确定两个节点和关系类型,以创建关系

复制代码
public bool CreateRelationships(List<RelationshipModel> nodes)
{
    _client.Cypher
        .Unwind(nodes, "ns")
        .Match("(n:Lable1),(s:Lable2)")
        .Where("n.NodeID=ns.NodeID and s.NodeID=ns.RelatedID")
        .Merge("(n)-[r:RelationshipType]->(s)")
        .ExecuteWithoutResults();
}
复制代码

 

 

 

参考文档:

3.3.6. UNWIND

Getting Started with Neo4j in .NET with Neo4jClient Library

Batch insert nodes and relations neo4jclient

5 Tips & Tricks for Fast Batched Updates of Graph Structures with Neo4j and Cypher

关于Neo4j和Cypher批量更新和批量插入优化的5个建议





本文转自悦光阴博客园博客,原文链接:http://www.cnblogs.com/ljhdo/p/5554560.html,如需转载请自行联系原作者

目录
相关文章
|
9月前
|
SQL
SQL基础——查询基础(上)
SQL基础——查询基础(上)
55 0
SQL基础——查询基础(上)
|
11月前
|
NoSQL MongoDB 索引
软件开发入门教程网 之MongoDB 覆盖索引查询
【摘要】 本章将会讲解由于所有出现在查询中的字段是索引的一部分, MongoDB 无需在整个数据文档中检索匹配查询条件和返回使用相同索引的查询结果。 因为索引存在于RAM中,从索引中获取数据比通过扫描文档读取数据要快得多。
|
11月前
|
机器学习/深度学习 SQL 数据库
NEO4J的入门和一些简单的操作
> 持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第29天,[点击查看活动详情](https://juejin.cn/post/7147654075599978532 "https://juejin.cn/post/7147654075599978532") # 引言 今天我们继续学习NEO4J. # 创建 创建语句我们一般会使用create指令 我们首先在控制台上输入`neo4j.bat console`启动neo4j 然后打开你的浏览器,然后在浏览器地址栏中输入 `http://localhost:7687 - Neo4j Browser](http:
|
存储 NoSQL 关系型数据库
推荐系统-Task02数据库基本使用
MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。 在高负载的情况下,添加更多的节点,可以保证服务器性能。 MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案。 MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。
126 0
|
NoSQL 数据库 数据安全/隐私保护
Neo4j图数据库的安装与基本增删改查
Neo4j图数据库的安装与基本增删改查
217 0
Neo4j图数据库的安装与基本增删改查
|
存储 JavaScript 前端开发
使用 Sequelize 快速构建 PostgreSQL 数据的 CRUD 操作
之前写过一个专栏《布道API》来介绍API的REST风格及推荐实践,今天开始来构建一个管理系统的API服务,首先需要处理的就是数据存储,本文将结合实际开发总结在 NodeJS 下使用 Sequelize 快速构建 PostgreSQL 数据的 CRUD 操作。
406 0
使用 Sequelize 快速构建 PostgreSQL 数据的 CRUD 操作
|
SQL NoSQL 前端开发
前端培训-中级阶段(51)- nodeJS操作,MongoDB,文档CURD操作
前端最基础的就是 HTML+CSS+Javascript。掌握了这三门技术就算入门,但也仅仅是入门,现在前端开发的定义已经远远不止这些。前端小课堂(HTML/CSS/JS),本着提升技术水平,打牢基础知识的中心思想,我们开课啦(每周四)。
111 0
前端培训-中级阶段(51)- nodeJS操作,MongoDB,文档CURD操作
|
NoSQL MongoDB
阿里云DLA新功能来袭 查询MongoDB嵌套字段更方便
DLA之前对于MongoDB只支持简单类型的映射查询,对于嵌套字段无法直接查询,最近我们加入了对嵌套字段直接查询的支持,这篇文章给大家介绍一下。
11582 0
|
数据库
【自然框架.视频】基础设置(二)下载演示程序用的数据库,和数据表结构简介
  本来想这个月做一套视频演示的,但是现在看来是做不出来了。客观原因是家里拆迁、买房子、搬家,确实有点忙;主观原因是自己还是比较懒。     虽然有客观原因,但是主要的还是主观原因。既然没做好,那就不要找理由,而要为能够做好找点方法!     今天是第二个视频—— demo用的数据库的下载,下载后附加数据库以及数据库里表(元数据、人员、角色等)的简介。
718 0