猿问

递归链接对象的算法

我正在维护一个小程序,它遍历 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 不在缓存中,则将当前帖子放在列表的底部。最终,它们都将被处理。


烙印99
浏览 183回答 1
1回答

BIG阳

如果similar存在可能存在的关系循环,您提出的方法将不起作用。例如,您展示了一个1类似于 post 的帖子2。假设您1首先遇到帖子。它指的2是尚未在缓存中的 post ,因此您将 post 推1回到队列的末尾。现在你可以发帖了2。它指的1是尚未在缓存中的 post ,因此您将 post 推2回到队列的末尾。这将永远持续下去。您可以通过分两次构建 post 对象来解决这个问题。在第一遍期间,您创建Post对象并用除similar引用之外的所有信息填充它们,然后构建一个map[int]*Post将 ID 号映射到帖子的对象。在第二遍中,对于每个帖子,您迭代similarID 号,在地图中查找每个 ID 号,并使用结果*Post值填充[]*Post相似帖子的一部分。
随时随地看视频慕课网APP

相关分类

Go
我要回答