2010-10-22 115 views
3

表的n次中的所有用户包括列用户1,用户2,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(字符串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分钟的查询,所以我会很感谢任何人只要检查陈述是否正确。

谢谢!

+0

您正在寻找具有累积距离<= N从目标用户的所有用户?你必须在一个查询中完成它,还是允许创建具有查询作为帮助器的c#过程并使用少量查询调用构造数据集? – 2010-10-22 18:47:35

回答

2

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

+3

您应该可以使用'OPTION(MAXRECURSION @n)'' – Brad 2010-10-22 18:47:35

+0

'控制递归到N个级别谢谢您的链接! – 2010-10-23 09:24:17

1

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

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