组织有向图数据的好方法是什么?

时间:2012-04-02 22:06:35

标签: data-structures graph graph-theory neo4j

这是我的情况。我有一个图表,在不同的时间添加不同的数据集。例如,set1可能有几千个节点,然后set2稍后出现,我们应用业务逻辑来创建从set1到set2的边(并且从set1中没有边缘到set2的任何顶点)。然后在稍后,我们得到set3,set4等等,并且在每个集合及其先前集合之间应用相同的过程。

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

我认为一般的解决方案是应用程序,但如果它有助于我使用neo4j(因此对该数据库的任何特定解决方案都会很好)。

2 个答案:

答案 0 :(得分:3)

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

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

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

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

答案 1 :(得分:1)

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