2

我有一个带有一组特定类的 n 叉树数据结构。数据结构经过一组转换,例如 1 到 n。在上述转换结束时,最终的树是用于检索信息的输出结果。

有没有一种方法可以在每次正确转换后(二进制)转储树。转储将反映上一次转换后树的状态。因此,如果任何转换出错,我可以恢复内存中的转储,而无需再次进行正确的转换。它类似于GDB提供的用于保存程序状态快照的检查点功能。

  • 我查看了 NoSQL 数据库,如 MongoDB、CouchDB、Redis 等,但它们主要是键值数据存储(Redis)或将信息存储在文档类型结构中,不存储树中节点之间的关联/关系(MongoDB)。
  • 我还查看了 Neo4j 图形数据库,它是表示图形结构的绝佳工具。

Redis-dumpNeo4j-dumpMongoDB-dump可用,但我无法决定在其中选择哪一个。由于转储创建和恢复时间不应该很大,因此上述哪个更容易填充。

我想知道遇到这个问题的程序员同行的意见和反馈,以及他们是如何解决的。这样做的最佳方法是什么?

PS 我现有的实现是在 C++ 中。如果有任何不清楚的地方,请告诉我,我会尝试以更好的方式解释它。

4

3 回答 3

2

我相信你想要的是 boost::serialize 提供的功能。它将为您序列化和反序列化 STL 集合。

见这里: http: //www.boost.org/doc/libs/1_54_0/libs/serialization/doc/tutorial.html#stl

于 2013-10-16T13:58:50.523 回答
2

您需要做的是serialize为树中的每个节点添加一个方法。此方法需要知道如何序列化自身及其所有子级。

序列化节点本身特定于节点中存储的数据,尽管您可能会使用某种形式的 Type-Length-Value 格式。序列化孩子是递归完成的。

唯一棘手的事情是找出你需要创建多大的缓冲区。为此,您可能需要一种可以计算缓冲区大小的递归方法。

如果您将数据保存在一个漂亮的平面缓冲区中,您可以将其保存到平面文件中,或者如果更简单,可以保存到某种数据库中。

于 2013-10-14T09:08:43.057 回答
1

在 Neo4j 中,您是否可以简单地维护数据库中的每一代模式,直到您对结果满意,然后删除多余的代?您可以创建一个节点,例如

(t1:Transformation {transformationId:1})

作为一组转换的索引或锚点,然后创建每一代新的模式并将其与具有排序属性的关系的转换节点相关联

(t1)-[:STEP {order:0}]->(root)-[:..*]->(branch) //tree
(t1)-[:STEP {order:1}]->(transformedRoot)-[:..*]->(transformedBranch) //first transformed tree
(t1)-[:STEP {order:2}]->(transformedRoot2)-[:..*]->(transformedBranch2) //second transformed tree

在转换中未更改的节点可以直接包含在新模式中

(t1)-[:STEP {order:3}]->(transformedRoot)-[:..*]->(originalBranch) // transformed tree with original branch

直到它们确实被改变

(t1)-[:STEP {order:4}]->(transformedRoot)-[:..*]->(transformedBranch)

只要您愿意,您就会拥有每个转换的快照,并且您可以与它交互以在数据库中回滚、比较或做任何您想做的事情,而不是导出/导入转储。

编辑:
关于您的评论
1)
Neo4j 会扩展或替换您的 C++ 实现吗?如果替换,有几个工具可以将初始数量的数据导入 Neo4j,特别是注释12

如果扩展,则取决于您将如何与数据交互。据我所知,没有非常好的用于 C++ 的 Neo4j 驱动程序,尽管有一些或多或少成熟的项目(1233,还有4)可能会有所帮助。我会将Neo4j 作为服务器运行并构建一个 RESTful 客户端(123),该客户端使用Cypher和(反)序列化JSON与其通信。我会花时间学习制作好的密码查询,并利用事务服务器端点. 但是,我会在 Java 或 Python 或其他对 Neo4j 具有良好驱动程序支持的语言中执行此操作,可能不是 C++。

2)
没有数据很难举出例子。从查看建模示例开始,然后在Google Group 讨论中搜索人们详细了解他们如何建模其域和设计查询的线程。例如,这里这里提到了两种不同的关系排序方式;按关系属性和关系类型。然后,如果您需要建模或查询方面的帮助,请将示例数据放入Neo4j 控制台并与您在 SO 上的问题一起分享链接。(我在链接的控制台中放了一个带有查询的小样本,你可以开始玩了。)

于 2013-10-16T11:02:16.200 回答