我有一个表存储有向图的边缘,如下所示:
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 - 1。 3在两个方向上都不存在。 1 - >由于显而易见的原因,1不算数。
主要的复杂因素是搜索边缘超过1,000,000个,到目前为止我尝试的所有查询都失败了,然后我才能检查它们是否有效。
任何建议都将不胜感激!
答案 0 :(得分: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
如果您有大量数据,那么重新考虑表上的索引并提高执行限制可能是个好主意。
Here是一个用来检查查询的小提琴。
答案 1 :(得分: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