我正在维护一个小程序,该程序遍历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不在缓存中,则将当前帖子放在列表的底部。最终,它们都将被处理。
答案 0 :(得分:1)
如果存在1
关系的循环,那么您提议的方法将无效。
例如,您展示的帖子2
与帖子1
类似。假设您首先遇到帖子2
。它指的是帖子1
,它尚未在缓存中,因此您将帖子2
推回到队列的末尾。现在您可以发布1
。它指的是帖子2
,它尚未在缓存中,因此您将帖子Post
推回到队列的末尾。这种情况永远存在。
您可以通过两次构建post对象来解决此问题。在第一次传递过程中,您制作similar
个对象,并使用除map[int]*Post
引用之外的所有信息填充它们,然后构建一个将ID号映射到帖子的similar
。在第二次传递中,对于每个帖子,您迭代*Post
ID号,在地图中查找每个ID,并使用生成的[]*Post
值填充类似的Map
切片讯息。