1

我有一个表,它存储有向图的边缘,如下所示:

Table EDGES
  FROM_NODE | TO_NODE | STRENGTH
  1         | 1       | 8
  1         | 2       | 5
  2         | 1       | 4
  1         | 3       | 2
  3         | 4       | 1

而且我正在尝试搜索在两个方向上都支持强度 > 3 的边。在上面的示例中,1 -> 2 和 2 -> 1 都存在,但是,1 <-> 3 在两个方向上都不存在. 1 -> 1 不算数,原因很明显。

主要的复杂性是有超过 1,000,000 条边要搜索,并且到目前为止我尝试过的所有查询都失败了,然后我才能检查它们是否有效。

任何建议将不胜感激!

4

2 回答 2

1

对我来说,最直接的解决方案是:

select one.from_node, one.to_node 
from edges one 
join edges other on (one.to_node = other.from_node AND one.from_node = other.to_node)
where one.strength > 3 AND other.strength > 3
    AND one.from_node <> one.to_node

如果您有大量数据,那么重新考虑表上的索引并提高执行限制可能是个好主意。

是一个用于检查查询的 sql fiddle。

于 2012-11-27T14:55:24.473 回答
0

我认为你可以使用这样的东西:

select
  least(FROM_NODE, TO_NODE) as n1,
  greatest(FROM_NODE, TO_NODE) as n2
from
  edges
where FROM_NODE<>TO_NODE and nodes.strength>3
group by n1, n2
having count(*)=2
于 2012-11-27T15:25:46.863 回答