¿Cómo representar un gráfico dirigido con varios padres?

8

http://dirtsimple.org/2010/11/simplest-way-to-do-tree-based-queries.html proporciona un algoritmo para insertar y eliminar de una tabla de cierre.

Me gustaría modelar una estructura de datos similar, excepto que los nodos pueden tener múltiples padres.

Dado:

Gráfico # 1

Si eliminamos [B, C], espero terminar con:

Gráfico # 2

y si eliminamos el nodo B, espero terminar con:

Gráfico # 3

Sin embargo, si utiliza el algoritmo del autor para eliminar enlaces o nodos, notará que se etiqueta [D, C, 1]para su eliminación, lo que no es deseable.

Lo que he probado hasta ahora

Intenté adaptar la estructura de datos original agregando una referencescolumna que indica cuántas formas hay de viajar entre dos nodos. En el ejemplo anterior, puede viajar de Aa Ctravés Bo a través D. La idea habría sido que, cuando Bse elimina, se mantiene el camino de Aa Cy el recuento de referencias disminuye de 2 a 1. Fue agradable en teoría, pero no pude averiguar cómo hacer que la implementación funcione y ahora me pregunto si es posible (la estructura de datos puede no contener suficiente información para determinar qué filas eliminar).

Lo que pregunto

¿Cómo adaptaría las tablas de cierre para apoyar a varios padres? ¿Qué estructuras de datos alternativas recomendarías? https://stackoverflow.com/q/4048151/14731 contiene una lista exhaustiva de tales estructuras de datos, pero no está claro cuáles admiten (o son mejores para) varios padres.

Gili
fuente
Entonces, ¿qué has intentado? ¿Y cuál es la referencescolumna?
ypercubeᵀᴹ
No creo que uno podría adaptar las tablas de cierre en su escenario. Las tablas de cierre son buenas para muchas aplicaciones basadas en árboles, pero esta pregunta alude a un tipo de DAG (gráfico acíclico dirigido) mucho menos restrictivo. Este es un tema que podría ser adecuado para una tesis de maestría y, como muchas cosas cuando se trata de bases de datos, una solución óptima dependerá en gran medida de su caso de uso exacto y específico. Esto o esto podría ayudarlo a comenzar.
Avarkx
¿Qué software de db?
Neil McGuigan el
@NeilMcGuigan, H2 y PostgreSQL, aunque obviamente prefiero una solución independiente de DB.
Gili

Respuestas:

3

Por lo general, crea una tabla de nodos y una tabla de relaciones. Los gráficos dirigidos no son realmente jerárquicos y pueden tener bucles, lo que dificulta las consultas. Pero si piensa en un DAG como un árbol generalizado (es decir, un árbol que permite múltiples padres pero que sigue siendo estrictamente jerárquico) y un gráfico dirigido como un DAG generalizado (es decir, como un DAG pero no estrictamente jerárquico) las cosas se vuelven más fáciles.

Entonces, para una solución PostgreSQL muy simple, podríamos hacer algo como:

CREATE TABLE node (
    id serial primary key,
    payload jsonb not null
);

CREATE TABLE relationship (
    id serial primary key,
    relationship_type text not null,
    from_node int references node(id) not null,
    to_node int references node(id) not null,
    payload jsonb not null
);

Entonces puedes consultar algo como esto:

with recursive dg as (
    select n.id as node_id, null::Int as parent, array[n.id] as path
      from node n
    union all
    select to_node, from_node, path || to_node
      FROM relationship
      JOIN dg on dg.node_id = from_node AND NOT from_node = ANY(path)
)
select * from dg;
Chris Travers
fuente