2011-06-06 76 views
0

我有A -> B描述這意味着存在一個連接,總重量1,從A到B.我想解決(這不是一個學術項目)的問題有向圖是我怎麼能告訴兩個節點之間有多少個公共連接。高級圖形SQL問題

說,在A和B
方面有2件事情需要去做,
*爲了看我所有的,B的,在鏈接,而(所有A的一些B)
*計算出所有我的,原始的B,A的共同A的數量。

我不知道如果是有道理的,但我會告訴你,我已經走了多遠。
*第一點。

SELECT A 
FROM graph 
WHERE B='myid'; 

大多數人都知道,第1部分是一個非常簡單的問題。第2部分是事情變得棘手的地方。
我已經能夠獲得至少1個連接或更相似的所有A。

第二點。

SELECT G.A, count(G2.A) AS common 
FROM graph AS G2 
JOIN (
    SELECT A, B 
    FROM graph 
    WHERE B = 'myid' 
) AS G ON G.A = G2.B 

所以第二點接近,因爲它會返回所有共同的聯繫,不會返回它沒有共同的鏈路上的所有鏈接。有沒有辦法得到這個?


仍然存在混淆:我試圖用文字畫出一張圖片。
這是表格。

A, B 
----- 
2, 1 
3, 1 
2, 3 

如果我想看看所有傳入連接許多常見的鏈接到節點1我應該看到

A, count 
--------- 
2, 1 // This is for 2's connection to 3. 
3, 0 

隨着當前的SQL語句我有我看到這一點。

A, count 
--------- 
2, 1 // This is for 2's connection to 3. 
+0

哦,還有一件事。表格看起來像這樣[a,b]就是這樣。意思A有一個指向B的鏈接(A => B) – Michael 2011-06-06 17:20:47

+0

你想要計算什麼?從同一個A到B有多少個連接? ....你是什麼意思的「共同」? – 2011-06-06 17:26:41

+0

就像Facebook一樣,你可以看到你有多少朋友與你的朋友有共同點。我想看看有多少通用鏈接到我的一些B(B的所有A的)。現在它只會返回A與B中其他A之間的共同鏈接,但是我想要那些也沒有共同鏈接的鏈接。 – Michael 2011-06-06 17:30:43

回答

0

而不是使用子查詢的,我只想用聯接:

SELECT 
    N1.A, 
    COUNT(N3.A) 
FROM 
    Nodes N1 
INNER JOIN Nodes N2 ON 
    N2.B = 'myid' 
LEFT OUTER JOIN Nodes N3 ON 
    N3.A = N1.A AND 
    N3.B = N2.A 
WHERE 
    N1.B = 'myid' 
GROUP BY 
    N1.A 

這讓你在你的例子期待的答案。您可能想要對更廣泛的樣本進行測試。

你也應該做這樣的性能測試,如果你的數據集是任何顯著的大小。

+0

有沒有更好的方法來做到這一點?我非常喜歡這個陳述,而且你做得很好! – Michael 2011-06-06 18:09:42

+0

這是我頭上的第一件事。如果我想到更好的方法,那麼我會發布它。 – 2011-06-06 18:11:19

+0

是的,即使不是數百萬,也會有成千上萬的數據。所以我需要優化這個!這就是爲什麼我試圖用1個陳述和沒有分組來做到這一點。 – Michael 2011-06-06 18:11:50