2010-10-22 120 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中的值用戶進行排序也可以提高性能。由於連接更可能通過流行的人進行。