批量导入数据结点 然后进行测试
明白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;只能生成新的数据库,而不能在已存在的数据库中插入数据。 |
提示
- LOAD CSV前面加上USING PERIODIC COMMIT 1000,1000表示每1000行的数据进行一次Transaction提交,提升性能。
- 建立index可以使得查询性能得到巨大提升。如果不建立index,则需要对每个node的每一个属性进行遍历,所以比较慢。 并且index建立之后,新加入的数据都会自动编入到index中。 注意index是建立在label上的,不是在node上,所以一个node有多个label,需要对每一个label都建立index。
生成Neo4j CSV的文件的规范是什么?
关系如何表示
下载的数据集 里面的格式是否与Neo4j兼容
具体情况解析
现在要导入的是来自斯坦福大学中的开放数据库中关于Facebook中一些用户数据,里面的数据进行了一定的用户匿名化处理。必须按照里面所给的数据的完成相应的内容。数据集转化成对应CSV格式
1 | USING PERIODIC COMMIT 10 |
下面是导入0feat中用户的结点。就是先确定结点
导入demo
1 | LOAD CSV FROM "file:///0feat.csv" AS line |
输出结果:
1 | Added 347 labels, created 347 nodes, set 347 properties, completed after 177 ms. |
输出图片:
下面是导入结点与结点的边缘。就是确定边
导入demo
1 | LOAD CSV FROM "file:///0edges.csv" AS line |
输出结果文本显示:
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 | //先取关系图中的一行作为结点数据源 |
载入结点的时间
1 | Added 7370 labels, created 7370 nodes, set 7370 properties, completed after 84254 ms. |
导入边的语法
1 | LOAD CSV WITH HEADERS FROM 'file:///relation.csv' AS row |
载入边的时间
1 | Set 15360 properties, created 15360 relationships, completed after 274246 ms. |
csv动态导入关系(对上面的例子进行优化)
之前所提到的那个大厂的数据关系csv文件中,一般都有源节点,目标结点,以及关系的名称(类型)三大要素。而刚才利用neo4j导入关系的时候,只能将结点间关系统一命名之后(加入原本的关系的名称,作为neo4j显示关系的属性)才可以导入结点。如果需要直接将文件里面的关系名称放入neo4j里面的话,需要安装apoc插件。
apoc 插件安装
- 将最新的插件 jar 包下载后放进 neo4j 的 plugins 目录中
- 修改配置文件加入
dbms.security.procedures.unrestricted=apoc.*
- 重启
neo4j
具体实现导入方式
源csv文件
source | target | label |
---|---|---|
刘迪迪 | 蔡彩莲 | 单相思 |
刘迪迪 | 冯学勇 | 同桌 |
刘迪迪 | 冯桂源 | 室友 |
刘迪迪 | 刘峻成 | 同桌 |
导入节点
注意:在我测试的csv的文件中因为源节点和目标节点都有可能是新结点,所以在导入结点时,目标结点和源节点都要取。
1 | //关系图中的两列作为结点数据源 |
输出结果
1 | Added 36 labels, created 36 nodes, set 36 properties, completed after 20 ms. |
导入边
1 | LOAD CSV FROM 'file:///data.csv' AS row |
输出结果
1 | Started streaming 40 records after 119 ms and completed after 120 ms. |
最终输出
参考资料
其他例子升级
导入结点效果如下
1 | Added 17756 labels, created 17756 nodes, set 17756 properties, completed after 1048507 ms. |
导入边效果如下
思维导图
1 |  |