2012-04-02 60 views
1

这是我的情况。我有一张图表,在不同的时间添加不同的数据集。例如,set1可能有几千个节点,然后set2进来,我们应用业务逻辑来创建从set1到set2的边(并且将set1中没有边的任何顶点排除在set2之外)。然后在稍后的时间,我们得到set3,set4等等,并且在每个集合和它之前的集合之间应用相同的过程。什么是组织有向图数据的好方法?

问题,组织这个的最好方法是什么?我之前做的是命名节点set1-xx,set2-xx等。我遇到的问题是当我试图在当前集和前一集之间运行分析时,我将不得不在整个图中运行循环并查找以“setx”开头的所有节点。随着图形增长需要很长时间,所以我想到了另一种解决方案,即创建一个名为“set1”的节点,并将它连接到该特定集合的所有节点。我正在测试它,但我想知道是否有更有效的方式或构建方式处理这样的数据结构?有没有办法以某种方式细分这样的数据?

我认为一个通用的解决方案将是应用程序,但如果它有帮助我使用neo4j(所以任何具体的解决方案,该数据库也会很好)。

回答

3

您有一个非常特殊的有向图类型,称为分层图

数据结构的选择主要取决于预期的图形密度(前一个集合/图层中多少个节点通常连接到当前集合/层中的节点)以及您需要执行的操作大部分时间。将每个图层直接用数字索引表示(也就是说,最外层的结构将是一个集合/图层的数组),并且大概您也可以使用每层的一个顶点数组,这绝对是一个好主意。然而,每个顶点边缘(下,或仅在和流出集取决于你是否曾经遍历层向后边缘)的列表可以是任何以下的:

  • 链接顶点标识符的列表;如果图非常稀疏并且边通常被添加/删除,这很好。
  • 排序的顶点标识符数组;如果图很稀疏且不可变,这是很好的。
  • 由顶点标识符索引的布尔值数组,确定给定顶点是否通过当前顶点的边连接;如果图形密集,这很好。

“顶点标识符”可以采用多种形式。例如,它可以是下一层顶点数组的索引。

1

你的第二个解决方案是我会做的 - 创建一个setX节点并将属于该set的所有节点连接到setX。这样你的数据就被分区了,而且查询起来也更容易。

相关问题