Обновить данные графика в SQL

Мне нужно пройти и обновить график в SQL.

Чтобы представить это в перспективе, я приведу пример:

  • Каждая компания может представлять другую компанию по данному вопросу.
  • Компании могут представлять друг друга, но не по одному и тому же предмету

Это предполагает такие таблицы, как:

companies(id), representations(source_id, destination_id, subject).

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

Надеюсь, вы понимаете, что я имею в виду.

Итак, с простыми данными, такими как:

C1:
--sell--> C2
--pay--> C3

C2:
--sell--> C3
--pay--> C1

C3:
--mail--> C1
--sell--> C4

C4:
--deliver-->C1

Теперь мы удаляем представление (мне следовало бы назвать его отношением) C2--sell-->C3 мы должны получить следующую структуру ([X] - удалено):

C1:
--sell--> C2
--pay--> C3

C2:
[X]--sell--> C3
--pay--> C1

C3:
--mail--> C1
[X]--sell--> C4

C4:
--deliver-->C1

Итак, вопрос в том, как можно выбрать все компании, которые находятся ниже по цепочке от моей по заданной тематике?

Я полагаю, что рекурсивное выражение CTE - единственный способ сделать это.

ПРИМЕЧАНИЯ:

  • Структура — это не дерево, это упорядоченный циклический граф.
  • База данных Graph пока не вариант (это лишь небольшая часть системы)
  • Обновления не обязательно должны быть немедленными, и вполне нормально, если они в конечном итоге будут согласованными (речь идет о нескольких секундах или минутах).

person Dmytrii Nagirniak    schedule 15.08.2012    source источник
comment
Есть ли циклы в графе? Если граф ациклический, это немного помогает. Работа с циклическим орграфом с SQL CTE может быть интересной.   -  person Craig Ringer    schedule 15.08.2012
comment
Предоставление примеров данных для демонстрации нормального случая и крайних случаев может помочь получить точный ответ. Тогда у нас есть имперические данные для работы, а не выводы из вашего описания.   -  person MatBailie    schedule 15.08.2012
comment
Это циклично в лучшую или худшую сторону :(   -  person Dmytrii Nagirniak    schedule 15.08.2012
comment
Из компаний могут представлять друг друга, но не для одного и того же предметного бита Я бы понял, что у вас ациклические графы, но их много, по одному графу на каждый предмет.   -  person jpe    schedule 15.08.2012
comment
@jpe да, это правильно. Я добавил несколько упрощенный пример этого.   -  person Dmytrii Nagirniak    schedule 15.08.2012


Ответы (1)


Похоже, вам нужно поддерживать транзитивное закрытие графика для каждого субъекта. Посмотрите статью о том, как внедрить систему поэтапной оценки (IES). с SQL, кажется, может добиться цели. В документе есть обширные примеры SQL для ориентированных ациклических, неориентированных и произвольных ориентированных графов.

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

person jpe    schedule 15.08.2012
comment
Посмотри на это! Чертовски хорошо написано. Я бы сделал текст хуже, скопировав его сюда. - person jpe; 15.08.2012
comment
да, придется потратить время на чтение. Ха-ха, нет, не копирую сюда :) - person Dmytrii Nagirniak; 15.08.2012
comment
@DmytriiNagirniak: Прежде чем приступить к чтению статей, вот небольшое введение в иерархические модели в SQL и особенно в Transitive Closure: Модели для иерархических данных Билла Карвина - person ypercubeᵀᴹ; 15.08.2012
comment
@ypercube Это отличная презентация и действительно хорошее введение в проблему. - person jpe; 15.08.2012
comment
@ypercube, вы заметили, что вопрос был о графах, а не о деревьях? :) - person Dmytrii Nagirniak; 15.08.2012
comment
Замыкание также может представлять ориентированные графы. (ациклические проще, чем графы с циклами). - person ypercubeᵀᴹ; 15.08.2012