Как смоделировать байесовскую сеть или, в более общем смысле, ориентированный взвешенный граф в SQL?

StackOverflow https://stackoverflow.com/questions/323456

Вопрос

В Интернете я нашел несколько статей, в которых приведены примеры моделирования различных типов графиков (в частности, групп 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. Это, безусловно, лучший ресурс на эту тему, который я знаю. Настоятельно рекомендуется.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top