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

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

Что-то не так с этим? Кто-нибудь знает лучший (возможно, более надежный) способ?

1 Ответ

8 голосов
/ 27 ноября 2008

Это был бы вполне разумный подход. SQL на самом деле плохо работает с рекурсивными структурами, хотя некоторые системы, такие как Oracle или SQL Server, имеют функцию рекурсивного запроса.

Хотя вы можете найти структуру, которая лучше работает для определенных типов поиска, я не думаю, что вы найдете заметно лучшую структуру в общем случае. Если требования вашего приложения таким образом ограничены, такая оптимизация может принести вам пользу.

Поскольку байесовская сеть представляет собой направленный ациклический граф (DAG), чисто рекурсивного отношения родитель-потомок недостаточно для моделирования сети (то есть узел может иметь более одного родителя), M: M отношения описанного вами типа будут необходимыми.

Различные книги 'SQL for Smarties' Джо Селко дают хороший обзор методов реализации и запросов к иерархическим и графовым структурам в SQL. Это, безусловно, лучший ресурс на эту тему, который я знаю. Настоятельно рекомендуется.

...