|
|
|
Поиск циклических ссылок в графе
|
|||
|---|---|---|---|
|
#18+
Здравствуйте! Есть граф с множеством вершин, единого корня нет. Связи графа описаны таблицей вида: Код: sql 1. 2. 3. Необходимо при попытке добавления новой связи проверить, не приведет ли ее добавление к цикличности графа. Ткните, плиз, носом, куда посмотреть? FB 2.5.2 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2014, 11:18:52 |
|
||
|
Поиск циклических ссылок в графе
|
|||
|---|---|---|---|
|
#18+
Kirill Razuvaev, это довольно сложный вопрос. Если добавление делать в процедуре, то после INSERT можно сделать рекурсивный запрос (WITH RECURSIVE) и если глубина рекурсии превышает некую максимально допустимую считать, что у тебя есть цикл и генерировать исключение, откатывая транзакцию. Глубина рекурсии для рекурсивного запроса ограничена значением 1023. Но в многопользовательской среде никаких гарантий это не даст. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2014, 11:30:21 |
|
||
|
Поиск циклических ссылок в графе
|
|||
|---|---|---|---|
|
#18+
Симонов Денисэто довольно сложный вопрос. Если добавление делать в процедуре, то после INSERT можно сделать рекурсивный запрос (WITH RECURSIVE) и если глубина рекурсии превышает некую максимально допустимую считать, что у тебя есть цикл и генерировать исключение, откатывая транзакцию. Глубина рекурсии для рекурсивного запроса ограничена значением 1023. Но в многопользовательской среде никаких гарантий это не даст.Поисковые системы уже дали понять, что легких путей нет, но в моем случае наиболее вероятны циклы на глубине от 2 до 10, а длина цепочки редко превышает 15. Вопрос в том, как грамотно поиск организовать. Пока не понимаю даже, как к нему подойти. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2014, 11:52:35 |
|
||
|
Поиск циклических ссылок в графе
|
|||
|---|---|---|---|
|
#18+
with recursive? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2014, 12:37:46 |
|
||
|
Поиск циклических ссылок в графе
|
|||
|---|---|---|---|
|
#18+
Kirill Razuvaev, для начала в саму таблицу ссылок надо добавить собственный ПК. Так проще будет. Код: sql 1. 2. 3. 4. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. Если flag = 1 есть цикл. Правда если за max_depth шагов не найдёт, значит цикл не определит ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2014, 12:37:52 |
|
||
|
Поиск циклических ссылок в графе
|
|||
|---|---|---|---|
|
#18+
Симонов Денисдля начала в саму таблицу ссылок надо добавить собственный ПК. Так проще будет. Спасибо, посмотрю! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2014, 14:00:58 |
|
||
|
Поиск циклических ссылок в графе
|
|||
|---|---|---|---|
|
#18+
Симонов Денис, ой. Вот это конечно надо поправить Код: sql 1. на Код: sql 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2014, 14:06:08 |
|
||
|
Поиск циклических ссылок в графе
|
|||
|---|---|---|---|
|
#18+
Симонов Денисдля начала в саму таблицу ссылок надо добавить собственный ПК. Так проще будет.А если вместо ПК обойтись RDB$DB_KEY? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2014, 14:58:57 |
|
||
|
Поиск циклических ссылок в графе
|
|||
|---|---|---|---|
|
#18+
Kirill RazuvaevА если вместо ПК обойтись RDB$DB_KEY? не уверен что это будет правильно работать. Тогда уж лучше по составному ключу OBJ1_ID, OBJ2_ID. Ведь между двумя вершинами ставиться всегда только одна связь (по крайней мере в заданном направлении)? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2014, 15:03:56 |
|
||
|
|

start [/forum/topic.php?fid=40&msg=38553132&tid=1563908]: |
0ms |
get settings: |
8ms |
get forum list: |
8ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
166ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
49ms |
get tp. blocked users: |
1ms |
| others: | 204ms |
| total: | 450ms |

| 0 / 0 |
