我正在(大约)大型图形(具有约380K边)上进行操作.我编写了一个程序来计算图中的3个小数.一个简单的例子:
List of edges:
A - B
B - C
C - A
C - D
List of cliques:
A - B - C
MysqL表结构:
+-------+------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+-------+
| v1 | bigint(20) | YES | MUL | NULL | |
| v2 | bigint(20) | YES | MUL | NULL | |
+-------+------------+------+-----+---------+-------+
3-clique只是图中的三角形.目前,我正在使用PHP MysqL执行此操作.不出所料,它不够快.有没有办法在纯MysqL中做到这一点? (也许是一种将所有3-clique插入到表中的方法?)
最佳答案
SELECT T1.v1,T2.v1,T3.v1 FROM TableName T1,TableName T2,TableName T3
WHERE T1.v1 < T1.v2 AND T2.v1 < T2.v2 AND T3.v1 < T3.v2
AND T1.v1 = T3.v1 AND T1.v2 = T2.v1 AND T2.v2 = T3.v2
应该做到的.我在这里所做的工作是确保所有考虑的边缘的v1都小于v2,只是为了删除重复项.然后,通过边缘的起点/终点将边缘连接起来很简单.返回每个对中的第一个点.
如果边缘从一个节点回到同一节点,则可能需要适当添加其他检查.
编辑:感谢Legend.进行了更改.提醒我,我们需要确保T3中找到的边缘与T1中的边缘匹配,因此我们必须将每个中的第一个链接在一起!最初我有T3.v1> T3.v2在where子句的第一行中,但是为了减少混乱而对其进行了更改,但是却忘记了更改第二部分!