У меня есть следующий DAGзаселение Закрытия таблицы с несколькими родителями
A --> B
| |
v v
C --> D
Вот таблица закрытия
| Ancestor | Descendant | Depth |
---------------------------------
| A | A | 0 |
| A | B | 1 |
| A | C | 1 |
| A | D | 2 |
| A | D | 2 |
| B | B | 0 |
| B | D | 1 |
| C | C | 0 |
| C | D | 1 |
| D | D | 0 |
Как будет идти об удалении пути B > D
(таким образом удаляя A > B > D
) без удаления A > C > D
и C > D
.
Сейчас я использую следующий запрос, но он работает только тогда, когда каждый узел имеет только 1 родительский элемент.
DELETE FROM `Closure`
WHERE `Descendant` IN (SELECT `Descendant` FROM `Closure` WHERE `Ancestor`[email protected])
AND `Ancestor` NOT IN (SELECT `Descendant` FROM `Closure` WHERE `Ancestor`[email protected]);
Дубликат (A, D) на самом деле является корнем этого вопроса - он существует, чтобы показать, что в таблице замыкания у вас будет один (A, D), вызванный ABD и один из ACD. Как определить, когда другой путь пересекается в этом алмазе, а не удалять (A, D)? Предпочтительно использовать только SQL и задавать только край (B, D). – NtscCobalt
@NtscCobalt - Нет смысла иметь '(A, D)' там дважды. Таблица закрытия не описывает * как * один узел соединяется с другим; только *, что * один узел соединяется с другим. Таким образом, если '' '(A, D)' находится в таблице, не имеет значения, был ли путь, чтобы перейти от 'A' к' D', был 'A> B> C> E> .....> X > Y> D' или 'A> D'. В этом-то и дело. Стол закрывания избавляет вас от необходимости вычислять этот путь каждый раз. Если вы пытаетесь захватить пути, используемые для перехода от одного узла к другому, то закрывающая таблица не является решением. Вместо этого сохраните граф в таблице ребер и вычислите путь. – Thomas
ах, да, я с трудом помню, почему я задал этот вопрос, если честно. Я не могу вспомнить, что мы решили сделать в качестве решения. Я думаю, что первоначальное намерение состояло в том, чтобы выяснить способ удаления края из (B, D) и удалить любые записи в таблице замыкания, вызванные им, без случайного удаления ребер, которые все еще существуют. Единственное решение, о котором я могу сразу подумать, состоит в том, чтобы перестроить всю таблицу закрытия из узлов, которые вы знаете, всего в 1 шаге. – NtscCobalt