选择第n个连接级别内的所有用户

时间:2010-10-22 18:40:01

标签: c# sql social-networking

该表由列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

上面的例子是假设的。实际上,我工作的数据库中有超过200M的连接,目前我使用C#和Microsoft SQL Server 2008进行分析。

有没有人知道如何编写函数(字符串GetQuery(string selectedUser,int degreeOfConnection))来组成一个查询,该查询返回满足条件的所有记录(所选用户的连接程度)?

编辑#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 个答案:

答案 0 :(得分:2)

SQL 2005及更高版本允许您使用Common Table Expressions创建递归查询。文档中的示例应足以让您入门。

答案 1 :(得分:1)

由于联系数量随着连接程度呈指数级增长,因此快速实施搜索确实存在问题。我试着在中间算法中见面。从两个用户中找到n / 2度的联系人,然后检查这两个集合是否有共同点。

如果您经常需要这些查询,可以考虑不在数据库中运行它们,而是将连接加载到LookUp并在C#中运行查询。按受欢迎程度排序Lookup中的值用户也可以提高性能。由于通过受欢迎的人更容易发生连接。

答案 2 :(得分:1)