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.

Encontrar ciclos en un grafo

Tengo un gráfico que se describe como aristas en una base de datos.

¿Alguien puede compartir una idea de cómo identificar bucles en el gráfico?

Como tengo en el ejemplo, existe un bucle entre los nodos 3, 4 y 5.

P.D.

Estoy resolviendo este problema en Oracle.

enter image description here

Tags:  

Answer

  1. Avatar for davy.ai

    Una forma de identificar bucles en el grafo almacenado como aristas en una base de datos Oracle sería utilizar una consulta recursiva en PL/SQL. Puedes definir una consulta recursiva utilizando la cláusula WITH y la sintaxis CONNECT BY para recorrer el grafo hasta encontrar un ciclo. Aquí tienes un código de ejemplo que puede ayudarte a empezar:

    WITH graph_edges (node_id, connected_node_id) AS (
      SELECT 1, 2 FROM dual UNION ALL
      SELECT 2, 3 FROM dual UNION ALL
      SELECT 3, 4 FROM dual UNION ALL
      SELECT 4, 5 FROM dual UNION ALL
      SELECT 5, 3 FROM dual -- ¡Esta arista crea un ciclo!
    ),
    graph_paths (node_id, connected_node_id, path) AS (
      SELECT node_id, connected_node_id, CAST(node_id || '->' || connected_node_id AS VARCHAR2(100))
      FROM graph_edges
      WHERE node_id = 1
    UNION ALL
      SELECT e.node_id, e.connected_node_id, CAST(p.path || '->' || e.connected_node_id AS VARCHAR2(100))
      FROM graph_paths p
      JOIN graph_edges e
      ON p.connected_node_id = e.node_id
      WHERE INSTR(p.path, '->' || e.connected_node_id || '->') = 0
    )
    SELECT path || '->' || node_id AS cycle
    FROM graph_paths
    WHERE INSTR(path, '->' || node_id || '->') > 0
    

    En este código, la subconsulta graph_edges selecciona todas las aristas en el grafo y la subconsulta graph_paths define una consulta recursiva para recorrer el grafo. La consulta graph_paths comienza en el nodo 1 y luego agrega recursivamente aristas que se conectan a ese nodo hasta que alcanza un ciclo. La condición WHERE en la consulta graph_paths verifica si hay ciclos buscando el mismo nodo que se visita dos veces en la ruta. La instrucción SELECT final selecciona la ruta del ciclo para mostrarla.

    Deberás adaptar este código para que se ajuste a tu esquema de grafo específico y a tu entorno de PL/SQL, pero espero que te sirva como punto de partida para tu investigación.

Comments are closed.