之前我没有尝试使用Rails中的图形,并且对最佳方法感到好奇。一些背景:
我正在创建一个Rails 3站点,并认为将某些对象及其关系存储为图形会很有趣,其中每个对象都是一个节点,而另一些对象则显示这两个对象是相关的。该图确实包含周期,图中的节点数不会超过100-150个(可能只接近50个)。一个节点可能不会有超过五条边,每个节点平均有三到四条边。
我认为一个简单的连接表有两列(每个对象的ID)可能是最简单的方法,但我怀疑这是最好的方法。另一个想法是使用一个插件,例如acts_as_tree(似乎没有为Rails 3更新...)或acts_as_tree_with_dotted_ids,但我不确定他们是否有能力使用循环而不是分层树。
我目前最喜欢的是轻松地从一个节点遍历到它的兄弟节点。我真的想不出一个我想要遍历节点的兄弟兄弟的原因,这就是我考虑制作一个SQL连接表的原因。我只想在网站上有一个部分来显示与指定对象相关的对象,这个图是我指定关系的方式之一。么?我应该看看的东西?谢谢!
答案 0 :(得分:1)
我会使用两个SQL表node
和link
,其中链接只是两个外键,源和目标。这样,您可以通过约束源节点ID或目标节点ID来执行SQL select查询,从而获取到节点的入站或出站链接集。您可以通过向两个表添加“graph_id”列来更进一步,这样您就可以在两个查询中检索图形的所有数据,并将其构建为后处理步骤。
这个策略应该与查找,安装,学习使用和实现插件同样容易(如果不是更容易),恕我直言。
答案 1 :(得分:1)
根据您的关注主要是关于图表操作还是图表存储,您需要的可能是完全不同的。如果您想在图表上进行方便的操作,请调查gem“rgl”(ruby图库)。它具有大多数基本经典遍历和搜索算法的实现。
如果您正在处理大约150个节点的事情,您可能会在数据库本身或事件列表中使用极简主义邻接列表表示。然后,您可以将其提供给RGL以进行遍历和搜索操作。
如果我没记错的话,RGL有足够的抽象,你可以使用现有的类结构,你只需提供获取相邻节点的方法。
答案 2 :(得分:0)
假设它是有向图,请使用映射表,例如
id | src | dest
其中src
和dest
是对象表的FK。
如果你的对象不是同一个类型,要么让它们都继承ruby类或者有另一个表:
id | type | type_id
type
是对象的类型,type_id
是另一个表中的id。
通过这样做,你应该能够为它指向的每个对象获取一个对象数组:
select dest
from maptable
where dest = self.id
如果您需要知道其入站边缘,则可以使用src
而不是dest
预先形成相同类型的查询。
从那里,你应该能够轻松编写你想要的任何图形算法。如果需要权重,可以修改映射表。
id | src | dest | weight