知识的分享,比一味的吸收更重要
引言
noe4j是一个图数据库,存在节点和关系,可以把节点当作java中的一个对象,关系当作java中两个对象的进行交互时发生的条件。
每个点都有自己所属的类,比如卖家类、买家类,包含手机号、身份证号等属性,存在索引,一个用户可以属于卖家类,也开始属于买家类,也可以都属于。
每个关系也可以看做一个类,比如购买类、投诉类,包含订单号、商品号、时间等属性,存在索引,买家购买了卖家的商品,也就达成了购买关系。
多种load方式比较(网图)
数据导入
1)、数据预加载:neo4j-import
- 首次导入,neo4j要停掉,节点唯一
- 删除原有数据库
- 简单,测试成功
- 注意点:csv格式
2)、数据批量插入: Batch import - neo4j要停掉,节点唯一
- 无需删除原有数据库
- 注意点:非官方脚本,与neo4j-import的设计差距较大,按照模版不够灵活,顺序不可变
数据格式:
nodes: :label id:string:SellerID name uname(类、主键、属性)
rels:id:string:ID id:string:ID type sale_id payed_time(起点,终点,类,属性)
并且在batch.properties中指定主键(个人开发的还是存在很多问题的)
3)、近实时数据插入:Load csv
- 使用cypher语法写入从
- https://www.aboutyun.com/thread-21513-1-1.html 可以进一步封装
4)、实时插入:create方法使用java的api
- 2000个点 1000个关系 较慢
- 全新点:18s 一半新点:12s
- 旧点新边:11s 旧点旧边:3s
5)、近实时数据插入: load jdbc
支持从数据库直接导入neo4j,可以做成增量插入
batch-import使用(推荐)
优点:
- 存储数据量大
- 无需删除原有数据库,这也是为什么推荐使用的,neo4j 4.x版本后支持多个库,根据需求也可选择neo4j-import
缺点: - 也需要重启neo4j
- 不是并行的
测试一:
测试设计:
对象一:卖家: buyerId:ID(Buyer-ID), tel, ..., :LABEL
对象二:买家: seller:ID(Seller-ID), tel, ..., :LABEL
关系图:卖家->买家: :START_ID(Actor-ID),sale_id, 成交时间,:END_ID(Movie-ID)
测试结果1:
IMPORT DONE in 7s 668ms.
Imported: 2
93366 nodes
385987 relationships
586732 properties
Peak memory usage: 1.03 GB
测试二:
测试结果2:Using Existing Configuration File
...........
Importing 1125052 Nodes took 38 seconds
...........................................................
Importing 5959112 Relationships skipped (6)
took 313 seconds Total import time: 358 seconds
创建索引后
内存占用9.8G
调优
1、加载预热
MATCH (n)
OPTIONAL MATCH (n)-[r]->()
RETURN count(n.name) + count(r);
2、参数调优
# java heap 初始值
dbms.memory.heap.initial_size=1g
# java heap 最大值,一般不要超过可用物理内存的80%
dbms.memory.heap.max_size=4g
# pagecache大小,官方建议设为:(总内存-dbms.memory.heap.max_size)/2,这样算下来我这台服务器应该设为(32g-16g)/2=8g,但由于服务器上面还有其他程序在占用内存,我这里根据实际情况,调整为2g
dbms.memory.pagecache.size=2g
#********************************************************************
# 添加apoc配置
#********************************************************************
dbms.security.procedures.unrestricted=apoc.*,algo.*
apoc.import.file.enabled=true
apoc.export.file.enabled=true
效果:
MATCH p=(from:Seller{id:'29212695'})-[*..4]->(to:Buyer{id:'28871733'})
RETURN p limit 100
执行以上语句
调优前:10s
调优后:小于4s
提升2-3倍