我们正在构建一个联系人管理应用程序。每个联系人是一个节点。如果发现2个或更多的联系人是重复的,我们希望提供将它们合并到单个节点的功能。此外,我们希望保持合并前的节点状态,以便我们可以在需要时撤销合并(*)。
我们建议通过创建一个新节点并将旧节点与"merged_into"边连接起来,并将状态属性设置为"removed"来建模。
现在我们有两个选项:
-
我们将两个合并节点的所有现有边复制到新节点
-
我们没有。
选项2提供了一个更简单的数据结构,但是它使我们所有的查询更加复杂。因为我们需要返回到合并节点的多个层次来获取所有的边
选项1将保持查询相同,但会引入许多额外的边。
我们还在考虑第三种选择,即创建一个完整数据库的副本,所有合并的节点都折叠起来。也就是说,只是当前联系人的视图。这将需要与主数据库保持同步。
对于如何处理这件事,我将非常感激。
我还想建议一个新的"折叠"查询功能,这将使选项2更容易工作....像这样:
select out("attended_class") collapse("merged_into") from 10#12
将折叠指定的边,直到没有进一步的出站"merged_into"边,从而检索附加到先前(预合并)节点的所有边
- 为了保持简单,我们不允许在新节点 上定义任何边后进行unmerge操作。
亲切的问候
哲人Kevala
我认为这个问题取决于你期望合并发生的频率。如果它们很少出现,请使用选项1,并运行一个cron作业,不时地删除剩余的内容。
如果它们经常出现,你应该选择选项2,因为合并/取消合并要快得多。您仍然应该使用一个cron-job来"清理"您的数据并移动到合并节点的边缘(只要明确它们不会被合并)。
顺便说一句:如果节点的属性是相同的(除了它们的_key),并且不需要合并,那么您可以使用一个简单的技巧:
当节点A需要与节点B合并时,在连接A和B的集合merged
中增加一条边,并将B标记为"已移除"。然后修改您的查询,检查是否有来自集合merged
中的节点的边,将它们放入查询的起始顶点集合中。如果要撤销合并,只需删除此边即可。如果要在合并节点上添加其他边,则可以将其添加到任意一个节点上。这将使取消合并节点成为可能,即使已经添加了边。