设置
我有一个 .NET 应用程序,它使用 Neo4j 客户端库在后端 Neo4j 数据库上执行 CRUD 操作。该数据库中的节点和关系代表公式和参数。
有两个节点标签:
BusinessRule
和ChartField
。
对于每个
BusinessRule
节点,与 OUTPUTS
节点将有一个 ChartField
关系,并且与代表 USES
参数的其他 ChartField
节点可能存在一对多 BusinessRule
关系公式。
当用户完成所有规则的配置后,他们会发布更改,这将重建图表。
问题
我正在努力解决在图表中添加关系的性能问题。
在一次“发布”中,我可能有 3,000 个不同的
BusinessRule
。添加所有 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 个密码查询批量处理在一起,以节省来回的时间,但这有点复杂,因为别名必须都是唯一的。
在一些批处理测试中,我看到了一些改进,但没有什么显着的。
您应该能够使用单个查询轻松高效地创建关系。
假设您将所有输入数据传递到
$data
参数中,其值是地图列表,其中每个地图的格式为:
{p1: '2025-BUDGET-10000184-11061345',
t1: '2025-BUDGET-11061345', t1CFID: '...', t1Br: '...',
v1: '...', v1CFID: '...', v1Br: '...',
v2: '...', v2CFID: '...', v2Br: '...'}
那么您的更快查询将如下所示:
UNWIND $data AS d
MATCH (p1:BusinessRule {Id: d.p1})
MATCH (t1:ChartField {Id: d.t1})
MATCH (v1:ChartField {Id: d.v1})
MATCH (v2:ChartField {Id: d.v2})
CREATE (p1)-[:OUTPUTS {Type: 'OUTPUTS', TargetCFID: d.t1CFID, BusinessRuleId: d.t1Br}]->(t1)
CREATE (p1)-[:USES {Type: 'USES', ParamCFID: d.v1CFID, BusinessRuleId: d.v1Br}]->(v1)
CREATE (p1)-[:USES {Type: 'USES', ParamCFID: d.v2CFID, BusinessRuleId: d.v2Br}]->(v2)