选择连接
表的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分钟的查询,所以我会很感谢任何人只要检查陈述是否正确。
谢谢!
SQL 2005及更高版本允许您使用Common Table Expressions创建递归查询。文档中的示例应该足以让您入门。
您应该可以使用'OPTION(MAXRECURSION @n)'' – Brad 2010-10-22 18:47:35
'控制递归到N个级别谢谢您的链接! – 2010-10-23 09:24:17
由于联系人的数量随着连接的程度呈指数增长,因此快速实施该搜索确实存在问题。我会尝试在中间算法中见面。从这两个用户找到n/2度的联系人,然后检查这两个组是否有共同点。
如果您经常需要这些查询,您可能会考虑不在数据库中运行它们,而是将连接加载到LookUp中并在C#中运行查询。并且按照流行度对Lookup中的值用户进行排序也可以提高性能。由于连接更可能通过流行的人进行。
也许这会有所帮助: http://techportal.ibuildings.com/2009/09/07/graphs-in-the-database-sql-meets-social-networks/
谢谢你的链接!它帮助我找到解决方案。 – 2010-10-23 19:57:56
您正在寻找具有累积距离 2010-10-22 18:47:35