高级图形SQL问题

时间:2011-06-06 17:20:16

标签: sql algorithm graph

我有一个由A -> B描述的有向图,意味着存在一个连接,总是权重1,从A到B.我想要解决的问题(这不是一个学术项目)是如何判断的两个节点之间有多少公共连接。

就A和B而言 有两件事需要完成,
*查看我所有的B,链接进来(所有A到某些B)
*计算所有My,Original 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

如果我想知道从NODE 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.  

1 个答案:

答案 0 :(得分:0)

我不使用子查询,而只使用JOIN:

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

这给出了您在示例中期望的答案。您可能希望在更广泛的样本上进行测试。

如果您的数据集规模很大,您还应该对此进行性能测试。