使用RoR中的循环图

时间:2010-11-13 15:33:27

标签: ruby-on-rails ruby database graph graph-theory

之前我没有尝试使用Rails中的图形,并且对最佳方法感到好奇。一些背景:

我正在创建一个Rails 3站点,并认为将某些对象及其关系存储为图形会很有趣,其中每个对象都是一个节点,而另一些对象则显示这两个对象是相关的。该图确实包含周期,图中的节点数不会超过100-150个(可能只接近50个)。一个节点可能不会有超过五条边,每个节点平均有三到四条边。

我认为一个简单的连接表有两列(每个对象的ID)可能是最简单的方法,但我怀疑这是最好的方法。另一个想法是使用一个插件,例如acts_as_tree(似乎没有为Rails 3更新...)或acts_as_tree_with_dotted_ids,但我不确定他们是否有能力使用循环而不是分层树。

我目前最喜欢的是轻松地从一个节点遍历到它的兄弟节点。我真的想不出一个我想要遍历节点的兄弟兄弟的原因,这就是我考虑制作一个SQL连接表的原因。我只想在网站上有一个部分来显示与指定对象相关的对象,这个图是我指定关系的方式之一。

么?我应该看看的东西?谢谢!

3 个答案:

答案 0 :(得分:1)

我会使用两个SQL表nodelink,其中链接只是两个外键,源和目标。这样,您可以通过约束源节点ID或目标节点ID来执行SQL select查询,从而获取到节点的入站或出站链接集。您可以通过向两个表添加“graph_id”列来更进一步,这样您就可以在两个查询中检索图形的所有数据,并将其构建为后处理步骤。

这个策略应该与查找,安装,学习使用和实现插件同样容易(如果不是更容易),恕我直言。

答案 1 :(得分:1)

根据您的关注主要是关于图表操作还是图表存储,您需要的可能是完全不同的。如果您想在图表上进行方便的操作,请调查gem“rgl”(ruby图库)。它具有大多数基本经典遍历和搜索算法的实现。

如果您正在处理大约150个节点的事情,您可能会在数据库本身或事件列表中使用极简主义邻接列表表示。然后,您可以将其提供给RGL以进行遍历和搜索操作。

如果我没记错的话,RGL有足够的抽象,你可以使用现有的类结构,你只需提供获取相邻节点的方法。

答案 2 :(得分:0)

假设它是有向图,请使用映射表,例如

id | src | dest

其中srcdest是对象表的FK。

如果你的对象不是同一个类型,要么让它们都继承ruby类或者有另一个表:

id | type | type_id

type是对象的类型,type_id是另一个表中的id。

通过这样做,你应该能够为它指向的每个对象获取一个对象数组:

select dest 
from maptable 
where dest = self.id

如果您需要知道其入站边缘,则可以使用src而不是dest预先形成相同类型的查询。

从那里,你应该能够轻松编写你想要的任何图形算法。如果需要权重,可以修改映射表。

id | src | dest | weight