A configuração
Eu tenho um aplicativo .NET que usa a biblioteca cliente Neo4j para realizar operações CRUD em um banco de dados backend Neo4j. Os nós e relacionamentos neste banco de dados representam fórmulas e parâmetros.
Existem dois rótulos de nó: BusinessRule
e ChartField
.
Para cada BusinessRule
nó, haverá um único OUTPUTS
relacionamento com um ChartField
nó e poderá haver 1 para muitos USES
relacionamentos com outros ChartField
nós que representam os parâmetros da BusinessRule
fórmula.
Quando um usuário termina de configurar todas as suas regras, ele publica suas alterações, o que reconstruirá o gráfico.
O problema
Estou lutando com o desempenho de adicionar os relacionamentos no gráfico.
Em uma única "publicação", posso ter 3.000 BusinessRule
s distintos. A adição de todos os nós BusinessRule
e ChartField
ocorre rapidamente e o desempenho não é um problema.
Mas adicionar as relações para cada um dos 3.000 BusinessRule
s está demorando muito.
Abaixo está um exemplo da consulta Cypher que adicionaria os relacionamentos para um único arquivo BusinessRule
. Ele tem que ser executado 3.000 vezes para completar a tarefa. Eu tenho um índice na Id
propriedade para ambos os tipos de nó.
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)
Esta consulta funciona combinando os nós relevantes BusinessRule
e ChartField
onde p1 é o nó de destino BusinessRule
, t1 é o ChartField
nó de destino e v* são os ChartField
parâmetros. Então, com eles, podemos adicionar os relacionamentos.
Alguém tem alguma sugestão sobre como acelerar esse processo? Demorou quase 22 minutos para executar esta cifra (3.000) vezes.
Considerei agrupar em lote até 100 dessas consultas cifradas para economizar nas idas e vindas, mas isso fica um pouco complexo, pois os nomes de alias devem ser todos exclusivos.
Em alguns testes em lote, vi algumas melhorias, mas nada significativo.
Fazer milhares de consultas separadas definitivamente não é uma boa prática. Isso não apenas envolve muita sobrecarga desnecessária de rede/transação, mas o servidor neo4j terá que analisar e gerar um novo plano para cada consulta.
Você deve ser capaz de criar relacionamentos de maneira fácil e eficiente usando uma única consulta.
Primeiro, crie uma lista de mapas com 3.000 elementos, onde cada mapa tem o formato:
Em seguida, passe essa lista como
$data
parâmetro para esta consulta:Como você
$data
teria apenas 3.000 elementos, não deve haver problema com a transação ficando sem memória. Mas se você tiver uma quantidade muito grande de dados, considere dividi-los em partes gerenciáveis.