首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在图中存储中间值

在图中存储中间值
EN

Stack Overflow用户
提问于 2018-05-20 01:01:17
回答 2查看 107关注 0票数 0

我正在尝试掌握将数据谱系表示为图形(具体地说,是DAG),并将值存储在neo4j之类的东西中的最佳实践。

例如,我有一个多步骤处理流水线-一个带有各种输入值、中间值和最终输出分数的推荐引擎。我希望将任何给定分数的历史表示为其先前值的组件,每个节点表示一个纯函数。

图形数据库本身不负责计算,只负责表示由节点表示的每个纯函数的输入。让我们假设一些节点的计算成本很高,因此持久化中间值是有意义的。当图中的任何值发生变化时,子节点可以被标记为陈旧,以便某些进程异步重新计算它们。

对于那些看过这种体系结构的人来说,围绕这种方法的一些最佳实践是什么,图形数据库是存储这些数据依赖项的合适位置吗?

EN

回答 2

Stack Overflow用户

发布于 2018-05-20 06:53:48

当我不得不自己处理这类事情时,我会在数据库中添加一个dateUpdated列,以便在更新时更加明显。然后,您可以遍历节点的子节点列表,以确保子节点始终在父节点之后更新。我假设:

  • 您始终拥有
  • 拓扑不会更改

然后,您可以在每个段中一次性地将图划分为不相交的段(一次)-将所有根扫入一堆,并处理每个根和根的子节点,并在需要更新节点时更新dataUpdated列。

如果您希望保留完整的历史记录,那么在“更新”dateUpdated时执行一次插入(复制所有未更改的内容,设置dateUpdated =NOW)。如果只想表示当前的已处理状态,则执行更新。

执行更新的一个问题是,如果您有其他进程读取此数据,您可能会出现竞争条件,在此情况下,您会更新父进程,读取未更新的子进程,并获得陈旧的值。另一种方法是,直到所有子对象的更新时间大于其父对象的更新时间(或函数中的任何输入),才实际返回值。如果执行插入操作,那么在处理子节点之前,子节点将不存在,但是您必须处理查询由于重建而不存在的节点的情况,而不是查询不存在的节点的情况。

如果拓扑发生变化,那么您可能需要强制实施DAG约束,然后每次进行分区。

因此,我认为这在某种程度上取决于您想要保留的历史类型(完整历史,或预计算值历史),以及您的图形拓扑如何随时间变化。

我对你添加的四个标签中的三个很在行,但是我对neo4j一无所知,所以很抱歉这里已经有了一个用于这个的数据结构。它似乎总是应该有一些数据库系统,可以存储数据的变化,在不同的版本,但我总是依靠dateUpdated和MySQL…

票数 0
EN

Stack Overflow用户

发布于 2018-05-23 10:43:19

是的,图形数据库在结构上反映了DAG,并且是存储DAG的完美位置。至于最佳实践,这取决于哪个数据库。Neo4j是一个方向属性图,您可以将属性和值分配给节点和关系(图中的“顶点”和“边”)。

因此,对于你的管道,一个好的第一个选择是每个节点代表一个函数,并且可以包括诸如函数标识符和版本、执行时间、服务器配置等属性。

每个关系代表从一个函数到另一个函数的消息。您可以选择,选择哪种方式取决于查询。根据您的描述,我可能会将输入和输出参数值保留在函数中。但您也可以将这些描述为关系的有效负载。后者是管道更真实的表示,但如果需要存储最终输出,则需要一些不一致。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50427605

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档