当我运行一个尝试批量合并特定类型的所有节点的脚本时,我得到了一些奇怪的性能结果。
当合并 2 个节点集合 (~42k) 和 (~26k) 时,性能良好且快速。
但是当我合并(~42)和(5)时,性能急剧下降。我正在对 ParentNode 进行批处理(因此 (~42k) 分成 500 个批次。为什么当我实质上合并较少的节点时(当批处理集相同,但批处理集的源较高而目标集较低时),性能会下降?
关系查询:
MATCH (s:ContactPlayer)
WHERE has(s.ContactPrefixTypeId)
WITH collect(s) AS allP
WITH allP[7000..7500] as rangedP
FOREACH (parent in rangedP |
MERGE (child:ContactPrefixType
{ContactPrefixTypeId:parent.ContactPrefixTypeId}
)
MERGE (child)-[r:CONTACTPLAYER]->(parent)
SET r.ContactPlayerId = parent.ContactPlayerId ,
r.ContactPrefixTypeId = child.ContactPrefixTypeId )
性能结果:
进程启动
开始插入联系人项目
[++++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++++++++++++++
++++++]
- 42149个联系人项目的总时间:19176.87ms
- 每批平均时间(500):213.4ms
- 最长批处理时间:663ms
开始插入 ContactPlayer 项目
[++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++]
- 27970 个 ContactPlayer 项目的总时间:9419.2106ms
- 每批次平均时间(500):167.75ms
- 最长批处理时间:689ms
开始将联系人与 ContactPlayer 关联起来
[++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++]
- 将联系人关联到 ContactPlayer 所需的总时间:7907.4877ms
- 每批平均时间(500):141.151517857143ms
- 最长批处理时间:883.0918ms 批处理编号:0
开始插入 ContactPrefixType 项
[+]
- 5 个 ContactPrefixType 项目的总时间:22.0737ms
- 每批次平均时间(500):22ms
- 最长批处理时间:22ms
已插入联系人数据。
开始将 ContactPrefixType 与联系人关联起来
[++++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++++++++++++++
++++++]
- 将 ContactPrefixType 与联系人关联所需的总时间:376540.8309ms
- 每批平均时间(500):4429.78643647059ms
- 最长批处理时间:14263.1843ms 批处理号:63
到目前为止,我能想到的最好的方法如下(这是一个针对我的环境的黑客攻击):
如果/否则条件:
If childrenNodes.count() < 200
-> 假设它们是父级的类型标识符...即ContactPrefixType
否则假设它是一个将多个项目类型关联在一起的矩阵(即联系地址)
If childNodes < 200
MATCH (parent:{parentLabel}),
(child:{childLabel} {{childLabelIdProperty}:parent.{parentRelationProperty}})
CREATE child-[r:{relationshipLabel}]->parent
每个关系类型大约需要 3-5 秒才能完成
Else
MATCH (child:{childLabel}),
(parent:{parentLabel} {{parentPropertyField : child.{childLabelIdProperty}})
WITH collect(parent) as parentCollection, child
WITH parentCollection[{batchStart}..{batchEnd}] as coll, child
FOREACH (parent in coll |
CREATE child-[r:{relationshipLabel}]-parent )
我不确定这是最有效的方法,但在尝试了许多不同的选项之后,这似乎是最快的。
Stats:
- 插入具有 2,070,977 个属性的 225,018 个节点
- 创建 464,606 个关系
总计:331 秒。
因为这是直接导入,而且我还没有处理更新,所以我假设所有关系都是正确的,不需要担心无效数据...但是,我将尝试将属性设置为关系类型,以便以便稍后能够执行清理功能(即将父级和子级 Id 作为属性存储在关系类型中以供以后参考)
如果有人可以改进这一点,我会很高兴。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)