es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Actualización en cascada de nodos en árbol

Tengo un grafo como un árbol acíclico con profundidad indefinida. Necesito contar el número de descendientes para cada nodo incluyendo el propio nodo. Entonces, el resultado final debería ser algo así:

9
| \
4 4
| \ \
2 1 3
| | \
1 1 1

Por lo tanto, para cada nodo este número sería la suma del número de sus descendientes + 1. ¿Cómo se puede hacer en una sola consulta?
Podría probar algo así:

MATCH (n)
SET n.count = SIZE((n) <-[:PARENT*0..]-());

Pero esto significa una subconsulta para cada nodo. Teniendo más de 1 300 000 nodos, esto lleva siglos.
Una forma mejor sería establecer “1” para cada hoja y ascender al nodo raíz calculando cada nodo. ¿Es posible hacer esto en una sola consulta?

Tags:  

Answer

  1. Avatar for davy.ai

    Sí, es posible hacer esto en una sola consulta. Puede usar una consulta recursiva para recorrer el grafo y calcular el número de descendientes para cada nodo.

    La siguiente consulta debería hacer el trabajo:

    MATCH (n)
    CALL apoc.path.expandConfig(n, {relationshipFilter: 'PARENT', minLevel: 0, maxLevel: -1}) YIELD path
    WITH last(nodes(path)) AS node, length(path) AS descendants
    SET node.count = descendants + 1
    RETURN node.count

Comments are closed.