批量导入数据结点 然后进行测试

明白Neo4j存储结点的的文件是什么

是以CSV文件进行存储的

CREATE语句 LOAD CSV语句 Batch Inserter Batch Import Neo4j-import
适用场景 1 ~ 1w nodes 1w ~ 10 w nodes 千万以上 nodes 千万以上 nodes 千万以上 nodes
速度 很慢 (1000 nodes/s) 一般 (5000 nodes/s) 非常快 (数万 nodes/s) 非常快 (数万 nodes/s) 非常快 (数万 nodes/s)
优点 使用方便,可实时插入。 使用方便,可以加载本地/远程CSV;可实时插入。 速度相比于前两个,有数量级的提升 基于Batch Inserter,可以直接运行编译好的jar包;可以在已存在的数据库中导入数据 官方出品,比Batch Import占用更少的资源
缺点 速度慢 需要将数据转换成CSV 需要转成CSV;只能在JAVA中使用;且插入时必须停止neo4j 需要转成CSV;必须停止neo4j 需要转成CSV;必须停止neo4j只能生成新的数据库,而不能在已存在的数据库中插入数据。

提示

  1. LOAD CSV前面加上USING PERIODIC COMMIT 1000,1000表示每1000行的数据进行一次Transaction提交,提升性能。
  2. 建立index可以使得查询性能得到巨大提升。如果不建立index,则需要对每个node的每一个属性进行遍历,所以比较慢。 并且index建立之后,新加入的数据都会自动编入到index中。 注意index是建立在label上的,不是在node上,所以一个node有多个label,需要对每一个label都建立index。

生成Neo4j CSV的文件的规范是什么?

关系如何表示

下载的数据集 里面的格式是否与Neo4j兼容

具体情况解析

现在要导入的是来自斯坦福大学中的开放数据库中关于Facebook中一些用户数据,里面的数据进行了一定的用户匿名化处理。必须按照里面所给的数据的完成相应的内容。数据集转化成对应CSV格式

1
2
3
4
5
6
7
USING PERIODIC COMMIT 10
LOAD CSV FROM “file:///roles.csv” AS line
MATCH (from:movies{movieId:line[2]}),(to:actors{personId:line[0]})
merge (from)-[r:ACTED_IN{miles:line[1]}]-> (to)
return r

MATCH p=()-[r:ACTED_IN]->() RETURN p LIMIT 25

下面是导入0feat中用户的结点。就是先确定结点

导入demo

1
2
LOAD CSV FROM "file:///0feat.csv" AS line
create (a:person{personId:line[0]})

输出结果:

1
Added 347 labels, created 347 nodes, set 347 properties, completed after 177 ms.

输出图片:

输出图片

下面是导入结点与结点的边缘。就是确定边

导入demo

1
2
3
LOAD CSV FROM "file:///0edges.csv" AS line
match (from:person{personId:line[0]}),(to:person{personId:line[1]}) //换一个备注
merge (from)-[r:unknown]-(to) //建立关系

输出结果文本显示:

1
Created 2519 relationships, completed after 2211 ms.

输出结果图片显示:

输出结果图片

导出结果分析:

其中300多个结点就出现群的现象,大部分图都是以及或多或少周围的结点有关系。简单说来,就是存在一些结点里面的互有关系,形成了群结构,群里面的结点同时都与外界结构存在关系。出现了大群与小群,群与群之间存在了A群结点的与B群结点可能存在联系,或者是通过更多的外部结点建立群与群之间的联系。 另外 这种生成结点的情况与生成结点的数据存在很大延迟。猜测:调用数据库中的数据实时生成的

其他例子

这是某大厂公司提供的一部分数组,数据类型如下所示

ds server id_src id_dst type value
2019/2/1 ec8ce6abb3e952a85b8551ba726a1227 010201b896d12a5490b85496ebbc4942 8d23d7129fe497cfbc6cd987a569a9ff 交易 1
2019/2/1 ec8ce6abb3e952a85b8551ba726a1227 14113d884811507bda833ba754dd52d6 96e411381b757d31ba351b77d78fc7c9 交易 1

导入Neo4j 结点的语法如下、

1
2
3
//先取关系图中的一行作为结点数据源
LOAD CSV WITH HEADERS FROM 'file:///relation.csv' AS row
MERGE (e:person {personId: row.id_src})

载入结点的时间

1
Added 7370 labels, created 7370 nodes, set 7370 properties, completed after 84254 ms.

导入边的语法

1
2
3
4
LOAD CSV WITH HEADERS FROM 'file:///relation.csv' AS row
match (from:person{personId:row.id_src}),(to:person{personId:row.id_dst}) //换一个备注

merge (from)-[r:relation{rela:row.type}]-(to) //建立关系,最终显示的是relation

载入边的时间

1
Set 15360 properties, created 15360 relationships, completed after 274246 ms.

csv动态导入关系(对上面的例子进行优化)

之前所提到的那个大厂的数据关系csv文件中,一般都有源节点,目标结点,以及关系的名称(类型)三大要素。而刚才利用neo4j导入关系的时候,只能将结点间关系统一命名之后(加入原本的关系的名称,作为neo4j显示关系的属性)才可以导入结点。如果需要直接将文件里面的关系名称放入neo4j里面的话,需要安装apoc插件。

apoc 插件安装

  1. 将最新的插件 jar 包下载后放进 neo4j 的 plugins 目录中
  2. 修改配置文件加入 dbms.security.procedures.unrestricted=apoc.*
  3. 重启 neo4j

具体实现导入方式

源csv文件
source target label
刘迪迪 蔡彩莲 单相思
刘迪迪 冯学勇 同桌
刘迪迪 冯桂源 室友
刘迪迪 刘峻成 同桌
导入节点

注意:在我测试的csv的文件中因为源节点和目标节点都有可能是新结点,所以在导入结点时,目标结点和源节点都要取。

1
2
3
4
//关系图中的两列作为结点数据源
LOAD CSV WITH HEADERS FROM 'file:///data.csv' AS row
MERGE (e:person {personId: row.source})
MERGE (b:person {personId: row.target})

输出结果

1
Added 36 labels, created 36 nodes, set 36 properties, completed after 20 ms.
导入边
1
2
3
4
5
6
LOAD CSV FROM 'file:///data.csv' AS row 
MATCH (p1:person {personId: row[0]})
MATCH (p2:person {personId: row[1]})
WITH p1, p2, row
CALL apoc.merge.relationship(p1, row[2], {name: row[2]},{}, p2) YIELD rel
RETURN rel

输出结果

1
Started streaming 40 records after 119 ms and completed after 120 ms.
最终输出

image-20200624222955102

参考资料

Neo4j 导入动态类型关系

其他例子升级

导入结点效果如下

1
Added 17756 labels, created 17756 nodes, set 17756 properties, completed after 1048507 ms.

导入边效果如下

思维导图

1
![思维导图](https://res.cloudinary.com/drldihlua/image/upload/v1586669911/Facebook中的结点.svg)