MySQL互惠搜索

时间:2012-11-27 14:43:45

标签: mysql graph large-data

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

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个,到目前为止我尝试的所有查询都失败了,然后我才能检查它们是否有效。

任何建议都将不胜感激!

2 个答案:

答案 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