如何将一组互连的ID转换为一组ID?

时间:2017-06-26 11:31:48

标签: mysql node.js data-science

我有一个包含id(有时是三元组)id的表,它们充当链中的一种链接

+------+-----+
| from | to  |
+------+-----+
| id1  | id2 |
| id2  | id3 |
| id4  | id5 |
+------+-----+

我想创建一个新表,其中所有链接都聚集到链/族中:

+-----+----------+
| id  | familyid |
+-----+----------+
| id1 |        1 |
| id2 |        1 |
| id3 |        1 |
| id4 |        2 |
| id5 |        2 |
+-----+----------+

即。将链接中的所有链添加到一个系列中,并为其指定一个ID。 在上面的示例中,第一个表的前两行创建一个族,最后一行创建另一个族。

解决方案

我将使用node.js查询大批量的行(每批几千行),处理它们,并将它们插入我自己的具有系列ID的表中。

问题

问题是我有几万个id对,在初始创建族表后我还需要随着时间的推移添加新的ID,我需要将id添加到现有的族

是否有很好的算法可以将数据对聚类到族/群集中,并牢记我的问题?

2 个答案:

答案 0 :(得分:0)

不确定这是否是一个答案,因为更多的想法...... 我创建了两个类似于你所拥有的表,第一个表我填充了与你相同的数据。

Table Base, fromID, toID
Table chain, fromID, chainID (numeric, null allowed)

然后我将Base中的所有唯一值插入到chainID的空值中。这些想法是尚未处理的行。

这是一个反复运行几个陈述的案例......

update chain c 
  set chainID = n 
  where chainid is null and exists ( select 1 from base b where b.fromID = c.fromID )
  order by fromID 
  limit 1

这会将下一个链ID分配给第一行而没有一个(n需要从某个地方生成,并在每次运行时递增)

然后是与所有记录相关的那个......

update chain c 
    join base b on b.toID = c.fromID
    join chain c1 on b.fromID = c1.fromID
    set c.chainID = c1.chainID 
    where c.chainID is null and c1.chainID is not null

重复运行直到它影响0行(即它没有什么可做的)。 然后运行第一个更新以创建下一个链等。再次,如果您运行第一个更新,直到它影响0行,这表明它们都是链接的。

如果你想尝试这个并且看看它是否能够应对更复杂的场景,那么会感兴趣。

答案 1 :(得分:0)

这看起来很像是在图表数据集上进行聚类,其中' familyid'是群集中心号码。

Here is a question I think is relevant.

Here is the algorithm description.您需要在您描述的条件下实施。