设置
我有一个 .NET 应用程序,它使用 Neo4j 客户端库在后端 Neo4j 数据库上执行 CRUD 操作。该数据库中的节点和关系代表公式和参数。
有两个节点标签:BusinessRule
和ChartField
。
对于每个节点,与某个节点之间BusinessRule
存在单一关系,并且与代表公式参数的其他节点之间可能存在一对多的关系。OUTPUTS
ChartField
USES
ChartField
BusinessRule
当用户完成所有规则的配置后,他们会发布更改,这将重建图表。
问题
我正在努力解决在图表中添加关系的性能问题。
在一次“发布”中,我可能有 3,000 个不同的BusinessRule
s。添加所有BusinessRule
和ChartField
节点的速度很快,并且性能不存在问题。
但是为这 3,000 个中的每一个添加关系BusinessRule
需要很长时间。
下面是 Cypher 查询的示例,它将添加单个BusinessRule
.它必须运行 3,000 次才能完成任务。我确实有Id
两种节点类型的属性索引。
MATCH (p1:BusinessRule {Id: '2025-BUDGET-10000184-11061345'})
MATCH (t1:ChartField {Id: '2025-BUDGET-11061345'})
MATCH (v1:ChartField {Id: '2025-BUDGET-11061472'})
MATCH (v2:ChartField {Id: '2025-BUDGET-11062722'})
CREATE (p1)-[:OUTPUTS {Type: 'OUTPUTS', TargetCFID: 11061345, BusinessRuleId: '2025-BUDGET-10000184-11061345'}]->(t1)
CREATE (p1)-[:USES {Type: 'USES', ParamCFID: 11061472, BusinessRuleId: '2025-BUDGET-10000184-11061345'}]->(v1)
CREATE (p1)-[:USES {Type: 'USES', ParamCFID: 11062722, BusinessRuleId: '2025-BUDGET-10000184-11061345'}]->(v2)
该查询通过匹配相关的BusinessRule
和ChartField
节点来工作,其中 p1 是BusinessRule
,t1 是目标ChartField
节点,v* 是ChartField
参数。然后,我们可以添加关系。
有人对如何加快这个过程有什么建议吗?执行这个密码(3,000)次花费了近 22 分钟。
我考虑过将最多 100 个密码查询批处理在一起,以节省来回的时间,但这有点复杂,因为别名必须都是唯一的。
在一些批处理测试中,我看到了一些改进,但没有什么显着的。
进行数千个单独的查询绝对不是一个好习惯。它不仅涉及大量不必要的网络/事务开销,而且 Neo4j 服务器必须为每个查询解析并生成新计划。
您应该能够使用单个查询轻松有效地创建关系。
首先,创建一个包含 3000 个元素的映射列表,其中每个映射的格式如下:
然后,将该列表作为
$data
参数传递给此查询:由于您
$data
只有 3000 个元素,因此事务内存不足应该不会出现问题。但如果您有大量数据,那么您应该考虑将其分解为可管理的块。