Как смоделировать байесовскую сеть или, в более общем смысле, ориентированный взвешенный граф в SQL?
-
11-07-2019 - |
Вопрос
В Интернете я нашел несколько статей, в которых приведены примеры моделирования различных типов графиков (в частности, групп DAG) в SQL, но все они казались чрезвычайно сложными, учитывая относительную простоту моделирования.
Есть ли лучший / стандартный способ сделать это? Мое нынешнее мышление выглядит примерно так:
create table node (
id int not null auto_increment,
name TEXT
)
create table edge (
from_node int not null,
to_node int not null,
weight float
)
Что-то не так с этим? Кто-нибудь знает лучший (возможно, более надежный) способ?
Решение
Это был бы вполне разумный подход. SQL на самом деле плохо работает с рекурсивными структурами, хотя некоторые системы, такие как Oracle или SQL Server, имеют функцию рекурсивного запроса. Р>
Хотя вы можете найти структуру, которая лучше работает для определенных типов поиска, я не думаю, что вы найдете заметно лучшую структуру в общем случае. Если требования вашего приложения таким образом ограничены, такая оптимизация может принести вам пользу.
Байесовская сеть является направленным ациклическим графом (DAG), чисто рекурсивным родителем. Отношения -child недостаточно для моделирования сети (т. е. узел может иметь более одного родителя), поэтому потребуется отношение M: M описанного вами типа.
Различные книги «SQL для умных» от Джо Селко дает хороший обзор методов для реализации и запроса иерархических и графовых структур в SQL. Это, безусловно, лучший ресурс на эту тему, который я знаю. Настоятельно рекомендуется.