Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Отсортировать (в кавычках) взвешенный граф. Возможно ли это на TSQL?
|
|||
|---|---|---|---|
|
#18+
Коллеги, приветствую! Есть задача, к которой даже не знаю, с какой стороны подступиться, весь мозг сломал. Имеется таблица, содержащая набор произвольных графов. Графы в т.ч. - содержат петли. Необходимо "размотать" граф, и "вытащить" его за самый тяжелый узел. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. На выходе нужно получить: parent child1 11 21 31 65 55 4 Граф представлен как совокупность нод: узел -> смежный узел -> вес узла. Преобразовать его нужно, "Навесив" все достижимые узлы на узел, имеющий максимальный вес в каком либо из состояний. Т.е., в первом графе максимальный вес имеет узел 1, см. (1, 3, 10), это вес 10. Поэтому он считается "главным", а остальные достижимые узлы, в т.ч. - он сам - его дочерними. Обратите внимание, что сам граф - имеет петли, а узел №6 - непосредственно из узла №1 - недостижим (но достижим через другие узлы). Второй граф имеет самый "массивный" узел (5, 4, 2), 5 имеет вес 2, остальные состояния - только вес 1, поэтому он и считается главным. Это не совсем взвешенный граф, но так получилось. Собственно, меня устроит любое решение, не обязательно "Одним запросом". В таблице - множество графов. Но если не получится преобразовать ее целиком, меня устроит решение, когда на вход подается нода, например parent = 1, а на выходе возвращается такая "матрица смежности" (это не матрица смежности, я понимаю, но тем не менее). ... я тогда курсором переберу все, объем небольшой, пара миллионов вхождений всего. Может ли облегчить задачу тот факт, что нод в любом из графов - заведомо не более 100? Если кандидатов на самую массивную ноду в графе - несколько, то нужно выбрать одну и только одну главную ноду произвольно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.06.2019, 09:40 |
|
||
|
Отсортировать (в кавычках) взвешенный граф. Возможно ли это на TSQL?
|
|||
|---|---|---|---|
|
#18+
В тему SQL Graph Architecture https://docs.microsoft.com/en-us/sql/relational-databases/graphs/sql-graph-architecture?view=sql-server-2017 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.06.2019, 10:17 |
|
||
|
Отсортировать (в кавычках) взвешенный граф. Возможно ли это на TSQL?
|
|||
|---|---|---|---|
|
#18+
Блин, у меня 2016SP2. Сейчас поставлю триал 2017. Хотя нужно вкуривать новую для себя концепцию. Чисто реляционного решения никто не знает? Фактически, как я понимаю, нужна функция, которая по номеру ноды вернет список всех достижимых из нее узлов, с весами. Всё осложняется произвольными петлями в графе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.06.2019, 10:33 |
|
||
|
Отсортировать (в кавычках) взвешенный граф. Возможно ли это на TSQL?
|
|||
|---|---|---|---|
|
#18+
uaggsterБлин, у меня 2016SP2. Сейчас поставлю триал 2017. Хотя нужно вкуривать новую для себя концепцию. Чисто реляционного решения никто не знает? Фактически, как я понимаю, нужна функция, которая по номеру ноды вернет список всех достижимых из нее узлов, с весами. Всё осложняется произвольными петлями в графе. Решение есть, я просто дал ссылку на тип данных,который уже сделан майкрософтом, может быть его использование поможет. Вы же версию сервера не указали. Кроме того, есть тип HierarchyID, для работы с иерархиями, это так, к слову. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.06.2019, 10:41 |
|
||
|
Отсортировать (в кавычках) взвешенный граф. Возможно ли это на TSQL?
|
|||
|---|---|---|---|
|
#18+
Ролг Хупин, проблема в том, что там как раз не иерархия. Там большая часть - петли, но иногда осложненные перемычками. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.06.2019, 10:54 |
|
||
|
Отсортировать (в кавычках) взвешенный граф. Возможно ли это на TSQL?
|
|||
|---|---|---|---|
|
#18+
uaggsterБлин, у меня 2016SP2. Сейчас поставлю триал 2017. Хотя нужно вкуривать новую для себя концепцию. Чисто реляционного решения никто не знает? Фактически, как я понимаю, нужна функция, которая по номеру ноды вернет список всех достижимых из нее узлов, с весами. Всё осложняется произвольными петлями в графе. 1. Добавь в табличку поле: ID_graph - идентификатор графа 2. Заполни. 3. Все станет тривиальным. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.06.2019, 12:58 |
|
||
|
Отсортировать (в кавычках) взвешенный граф. Возможно ли это на TSQL?
|
|||
|---|---|---|---|
|
#18+
aleks222, А где его взять, идентификатор то? Для того, чтобы сгенерировать идентификатор, нужно определить все ноды, которые в него входят. Ну, т.е. определить сам граф, в куче других. Вот эти ноды - один граф, вот эти - другой. А как это сделать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.06.2019, 13:14 |
|
||
|
Отсортировать (в кавычках) взвешенный граф. Возможно ли это на TSQL?
|
|||
|---|---|---|---|
|
#18+
-- 2 граф (4, 4, 1), (4, 5, 1), (5, 4, 2), (5, 4, 1) что-то странный граф. если верхушка от 4, то почему там 5, 4 варианты попали? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.06.2019, 13:16 |
|
||
|
Отсортировать (в кавычках) взвешенный граф. Возможно ли это на TSQL?
|
|||
|---|---|---|---|
|
#18+
Konst_One-- 2 граф (4, 4, 1), (4, 5, 1), (5, 4, 2), (5, 4, 1) что-то странный граф. если верхушка от 4, то почему там 5, 4 варианты попали? Это не дерево. А граф общего вида. Нет у него верхушки. А ноды - перечислены, как перечислены. (5, 4, 2), (5, 4, 1) - да, перечислена дважды. Но вес "ситуации" - разный. (4, 4, 1) - да, нода указывает на саму себя. (4, 5, 1), (5, 4, 2), (5, 4, 1) - да, две ноды взаимно указывают друг на друга, причем нода 4 указывает на ноду 5 - один раз, а нода 5 на ноду 4 - дважды, имея при этом разные веса (можно трактовать как вес ребра). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.06.2019, 13:31 |
|
||
|
Отсортировать (в кавычках) взвешенный граф. Возможно ли это на TSQL?
|
|||
|---|---|---|---|
|
#18+
graph (parent bigint not NULL, child bigint not NULL как так? у вас сполошное закольцовывание, это замкнутый граф. и другие графы ваши сложно определяемы, так как нет ограничений на "раскрутку", это задача без лимитов и ограничений не решаема. 4,4 4,5 5,4 5,5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.06.2019, 13:36 |
|
||
|
Отсортировать (в кавычках) взвешенный граф. Возможно ли это на TSQL?
|
|||
|---|---|---|---|
|
#18+
uaggster, имо эта задача решается рекурсивными алгоритмами и не с помощью T-SQL. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.06.2019, 13:38 |
|
||
|
Отсортировать (в кавычках) взвешенный граф. Возможно ли это на TSQL?
|
|||
|---|---|---|---|
|
#18+
Konst_Onegraph (parent bigint not NULL, child bigint not NULL как так? у вас сполошное закольцовывание, это замкнутый граф. и другие графы ваши сложно определяемы, так как нет ограничений на "раскрутку", это задача без лимитов и ограничений не решаема. 4,4 4,5 5,4 5,5 Ну вот такие графы :-( Ограничение есть. В каждом конкретном графе - заведомо меньше 100 нод. Точнее даже не нод, а записей вида (4, 4, 1), описывающих связь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.06.2019, 14:04 |
|
||
|
Отсортировать (в кавычках) взвешенный граф. Возможно ли это на TSQL?
|
|||
|---|---|---|---|
|
#18+
Чтобы не зациклиться, надо организовать поле в рекурсивном CTE, в котором накапливать список пройденных узлов, чтобы не проходить узел дважды. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.06.2019, 15:10 |
|
||
|
Отсортировать (в кавычках) взвешенный граф. Возможно ли это на TSQL?
|
|||
|---|---|---|---|
|
#18+
uaggster, Сделайте обход вашего дерева-графа по принципу левый - корень - правый с помощью рекурсии и полученный линейный спиcок пробейте NTILE. Функция NTile(2) порежет ваш список примерно пополам без всяких долгих гемороев. https://docs.microsoft.com/ru-RU/sql/t-sql/functions/ntile-transact-sql?view=sql-server-2017 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.06.2019, 15:41 |
|
||
|
Отсортировать (в кавычках) взвешенный граф. Возможно ли это на TSQL?
|
|||
|---|---|---|---|
|
#18+
a_voroninФункция NTile(2) порежет ваш список примерно пополам без всяких долгих гемороев.ему не нужно "пополам" Нужно найти несвязанные подграфы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.06.2019, 15:47 |
|
||
|
Отсортировать (в кавычках) взвешенный граф. Возможно ли это на TSQL?
|
|||
|---|---|---|---|
|
#18+
Вот что мне нужно, как я понимаю: SHORTEST_PATH https://docs.microsoft.com/ru-ru/sql/relational-databases/graphs/sql-graph-shortest-path?view=sqlallproducts-allversions&viewFallbackFrom=sql-server-2017 Но оно, сцуко, доступно только с 2019. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.06.2019, 16:41 |
|
||
|
Отсортировать (в кавычках) взвешенный граф. Возможно ли это на TSQL?
|
|||
|---|---|---|---|
|
#18+
uaggsterВот что мне нужно, как я понимаю: SHORTEST_PATH https://docs.microsoft.com/ru-ru/sql/relational-databases/graphs/sql-graph-shortest-path?view=sqlallproducts-allversions&viewFallbackFrom=sql-server-2017 Но оно, сцуко, доступно только с 2019. авторФункция SHORTEST_PATH позволяет найти: Кратчайший путь между двумя заданные узлы/сущности Единый источник кратчайшего пути. Кратчайшего пути из нескольких узлов источника для нескольких целевых узлов. и что это тебе даст ? вот тебе возможные пути в графе, - что дальше ? :) Как из этого, "по-простому" определить, что у тебя 2-а подграфа, и уже в них (в 2-х) искать максимальное ребро ... ? Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. start_nodenodepath12/1/2/13/1/3/16/1/3/6/13/1/2/3/16/1/2/3/6/21/2/3/1/26/2/3/6/23/2/3/31/3/1/36/3/6/32/3/1/2/45/4/5/54/5/4/54/5/4/ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.06.2019, 17:16 |
|
||
|
Отсортировать (в кавычках) взвешенный граф. Возможно ли это на TSQL?
|
|||
|---|---|---|---|
|
#18+
Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.06.2019, 19:10 |
|
||
|
Отсортировать (в кавычках) взвешенный граф. Возможно ли это на TSQL?
|
|||
|---|---|---|---|
|
#18+
uaggsteraleks222, А где его взять, идентификатор то? Для того, чтобы сгенерировать идентификатор, нужно определить все ноды, которые в него входят. Ну, т.е. определить сам граф, в куче других. Вот эти ноды - один граф, вот эти - другой. А как это сделать? Элементарно, Ватсон. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.06.2019, 19:59 |
|
||
|
Отсортировать (в кавычках) взвешенный граф. Возможно ли это на TSQL?
|
|||
|---|---|---|---|
|
#18+
Для начала в таблицу графа, я добавил номер графа. Разбираться, где заканчивается один граф и начинается второй, отдельная диссертация-не уму ни сердцу. --Подготовка данных Create table graph (parent bigint not NULL, child bigint not NULL, [weight] int not NULL,graph_id int) go insert into graph Values -- 1 граф (1, 1, 1,1), (1, 2, 1,1), (1, 3, 10,1), (2, 3, 2,1), (3, 1, 3,1), (3, 6, 1,1), (6, 6, 2,1) -- 2 граф insert into graph Values (4, 4, 1,2), (4, 5, 1,2), (5, 4, 2,2), (5, 4, 1,2) go select * from graph ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2019, 18:36 |
|
||
|
Отсортировать (в кавычках) взвешенный граф. Возможно ли это на TSQL?
|
|||
|---|---|---|---|
|
#18+
Второе действие, понадобяться вспомогательные таблицы, не временные, а вспомогательные. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2019, 18:39 |
|
||
|
Отсортировать (в кавычках) взвешенный граф. Возможно ли это на TSQL?
|
|||
|---|---|---|---|
|
#18+
Теперь две процедуры. Одна. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2019, 18:42 |
|
||
|
Отсортировать (в кавычках) взвешенный граф. Возможно ли это на TSQL?
|
|||
|---|---|---|---|
|
#18+
Вторая. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2019, 18:43 |
|
||
|
Отсортировать (в кавычках) взвешенный граф. Возможно ли это на TSQL?
|
|||
|---|---|---|---|
|
#18+
Теперь скрипт для первого графа, хард-кодный параметр 1 Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2019, 18:45 |
|
||
|
Отсортировать (в кавычках) взвешенный граф. Возможно ли это на TSQL?
|
|||
|---|---|---|---|
|
#18+
Скрипт для второго графа, хард-кодный параметр 2 Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2019, 18:47 |
|
||
|
|

start [/forum/topic.php?fid=46&msg=39831784&tid=1687564]: |
0ms |
get settings: |
7ms |
get forum list: |
21ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
64ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
90ms |
get tp. blocked users: |
2ms |
| others: | 223ms |
| total: | 429ms |

| 0 / 0 |
