Выбор всех пользователей в пределах n-й степени соединения - PullRequest
3 голосов
/ 22 октября 2010

Таблица состоит из столбцов user1, user2, connectionStrength, а примеры записей следующие:

A,B,0.2
A,C,0.5
A,G,0.1
B,C,0.8
W,Q,0.4
G,Q,0.5

Я хотел бы получить всех пользователей в пределах определенной степени подключения для выбранного пользователя и затем нарисоватьграфик связей.Однако вопрос заключается в том, как выбрать все записи из таблицы, которые удовлетворяют условию.Например, если выбран пользователь A и задано значение 2, следует выбрать следующие записи из примера:

A,B,0.2
A,C,0.5
A,G,0.1
B,C,0.8
G,Q,0.5

Пример выше является гипотетическим.В действительности в базе данных, с которой я работаю, более 200 миллионов соединений, и в настоящее время я использую C # и Microsoft SQL Server 2008 для анализа.

Кто-нибудь знает, как написать функцию (строка GetQuery (строка selectedUser, intстепеньOfConnection)) чтобы создать запрос, который возвращает все записи, которые удовлетворяют условию (степень подключения для выбранного пользователя)?

Edit # 1

Я пыталсяполучить соединения, выполнив рекурсивный запрос следующим образом:

WITH user_connections(user1, user2, link_strength, Level)
AS
(
SELECT user1, user2, link_strength, 0 AS Level FROM [dbo].[monthly_connections] AS mc WHERE user1 = '1ADF1126F26B4AD4441A3C552FCE04A4F7A79760'
UNION ALL
SELECT mc.user1, mc.user2, mc.link_strength, Level + 1 FROM [dbo].[monthly_connections] AS mc INNER JOIN user_connections AS uc ON uc.user2 = mc.user1
)
SELECT user1, user2, link_strength FROM user_connections OPTION(MAXRECURSION 1)

Запрос выполняется уже более 40 минут, поэтому я был бы очень благодарен, если бы кто-нибудь мог просто проверить, правильно ли составлен оператор.

Спасибо!

Ответы [ 3 ]

2 голосов
/ 22 октября 2010

SQL 2005 и выше позволяет создавать рекурсивные запросы, используя Common Table Expressions .Примеров в документации должно быть достаточно для начала работы.

1 голос
/ 23 октября 2010
1 голос
/ 23 октября 2010

Реализовать этот поиск действительно проблематично, поскольку количество контактов растет в геометрической прогрессии в зависимости от степени соединения.Я бы попробовал встретиться в середине алгоритма.От обоих пользователей найдите контакты степени n / 2, а затем проверьте, имеют ли эти два набора кого-то общего.

Если вам часто нужны эти запросы, вы можете не запускать их в базе данных, а загрузить соединенияв LookUp и выполните запросы в C #.И упорядочение значений пользователей в Lookup по популярности может также улучшить производительность.Так как соединение с большей вероятностью происходит через популярного человека.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...