我有一个包含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添加到现有的族
是否有很好的算法可以将数据对聚类到族/群集中,并牢记我的问题?
答案 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.您需要在您描述的条件下实施。