2011-06-06 57 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