【问题标题】:How do I turn a list of interconnected pairs of ids into a cluster of ids?如何将互连的 id 对列表转换为 id 集群?
【发布时间】:2017-06-26 11:31:47
【问题描述】:

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

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

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

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

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

解决方案

我将使用 node.js 查询大批量的行(每批几千行),处理它们,并将它们插入到我自己的带有家庭 id 的表中。

问题

问题是我有数以万计的 id 对,在最初创建家庭表之后,我还需要随着时间的推移添加新的 id,并且我需要将 id 添加到现有的家庭中

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

【问题讨论】:

  • 这通常可能需要一个递归分层查询,这是 MySQL 不擅长的,然后是一些更多的奥运会来分配家庭编号。可能,但有点工作。你试过了吗?
  • 在过去的几个月里我做过一些非常相似的事情,但是当我在做这件事时,我没有计划地做,只是开始使用大的 json 数组,合并、映射、归约和做了一大堆所说的“奥运会”并最终找到了解决方案。只是现在我不知道如何回溯并再做一次。这就是为什么我现在在这里,试图找出是否有更“官方”的东西可以帮助我在没有电子表格潜水的情况下做到这一点。
  • 好的……家谱有固定的深度吗?如果没有,那么您几乎肯定需要为此使用动态 SQL;这高于我的工资等级。
  • 我不打算为我执行此操作的单个 sql 查询,我正在考虑从第一个表中查询批量数据,进行一些 node.js 处理,并将其插入新表,可能包含多个语句。
  • 不,我可能会尝试完全在数据库中处理这个问题,除非有迫切的理由不这样做。层次结构有多深?

标签: mysql node.js data-science


【解决方案1】:

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

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 行,这表明它们都是链接的。

如果您想尝试一下,看看它是否能应对更复杂的场景,会很感兴趣。

【讨论】:

    【解决方案2】:

    这看起来很像在图形数据集上进行聚类,其中“familyid”是聚类中心数。

    Here is a question I think is relevant.

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

    【讨论】:

      猜你喜欢
      • 2016-07-15
      • 2017-12-24
      • 2020-05-05
      • 1970-01-01
      • 2011-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-19
      相关资源
      最近更新 更多