递归链接对象的算法

时间:2015-09-18 19:10:48

标签: algorithm recursion go

我正在维护一个小程序,该程序遍历Neo4j数据库中的文档并将JSON编码的对象转储到文档数据库。在Neo4j中 - 出于性能原因,我想 - 没有真正的数据,只有ID。

想象一下这样的事情:

posts:
    post:
        id: 1
        tags: 1, 2
        author: 2
        similar: 1, 2, 3

我不知道为什么会这样做,但这是我必须要处理的。然后程序使用ID来获取每个数据结构的信息,从而产生适当的结构。它不是author只是int,而是Author对象,包含姓名,电子邮件等。

这一点很有效,直到添加了similar功能。 Similar由ID引用其他帖子组成。因为在我的循环中我正在构建实际的post对象,我如何以有效的方式引用它们?我唯一能想象的是创建一个缓存,其中包含我已经“转换”的帖子,如果引用的ID不在缓存中,则将当前帖子放在列表的底部。最终,它们都将被处理。

1 个答案:

答案 0 :(得分:1)

如果存在1关系的循环,那么您提议的方法将无效。

例如,您展示的帖子2与帖子1类似。假设您首先遇到帖子2。它指的是帖子1,它尚未在缓存中,因此您将帖子2推回到队列的末尾。现在您可以发布1。它指的是帖子2,它尚未在缓存中,因此您将帖子Post推回到队列的末尾。这种情况永远存在。

您可以通过两次构建post对象来解决此问题。在第一次传递过程中,您制作similar个对象,并使用除map[int]*Post引用之外的所有信息填充它们,然后构建一个将ID号映射到帖子的similar。在第二次传递中,对于每个帖子,您迭代*Post ID号,在地图中查找每个ID,并使用生成的[]*Post值填充类似的Map切片讯息。