我以前没有尝试过在Rails中使用图形,我很好奇最好的方法是什么。一些背景知识:
我正在创建一个Rails3站点,我认为将某些对象及其关系存储为图形会很有趣,其中每个对象都是一个节点,其中一些对象被连接起来,以表明这两个对象是相关的。图中确实包含循环,并且图中的节点不会超过100-150个(可能只有接近50个)。一个节点可能不会有超过五条边,平均每个节点有三到四条边。
我认为包含两列(每列都是对象的ID )的简单连接表可能是最简单的方法,但我怀疑这是最好的方法。另一个想法是使用像acts_as_tree这样的插件(它似乎没有在Rails3中更新...)或者acts_as_tree_with_dotted_ids,但我不确定他们是否有能力使用循环而不是层次树。
我目前最想做的就是轻松地从一个节点遍历到它的兄弟节点。我真的想不出有什么理由要遍历节点的同级节点,这就是为什么我考虑只做一个SQL连接表的原因。我只想在站点上有一个部分来显示与指定对象相关的对象,这个图是我指定关系的方法之一。
建议?我应该检查的东西吗?谢谢!
发布于 2010-11-14 03:24:08
我将使用两个SQL表,node
和link
,其中一个链接仅仅是两个外键,源和目标。这样,您就可以通过约束源节点或目标节点id来执行SQL select查询,从而获得指向某个节点的入站或出站链接集。您可以更进一步,将"graph_id“列添加到两个表中,这样就可以在两个查询中检索一个图的所有数据,并将其构建为一个后处理步骤。
这个策略应该和查找、安装、学习使用和实现插件一样简单(如果不是更容易的话)。
发布于 2010-12-13 10:14:53
根据您主要关注的是图上的操作,还是图的存储,您需要的可能是完全不同的。如果您想要方便的图形操作,请研究gem "rgl“(ruby图形库)。它实现了大多数基本的经典遍历和搜索算法。
如果您正在处理大约150个节点,那么您可能可以在数据库本身或关联列表中使用最小邻接表表示。然后,您可以将其提供给RGL以进行遍历和搜索操作。
如果我没记错的话,RGL有足够的抽象,您可以使用现有的类结构,您只需提供获取相邻节点的方法即可。
发布于 2010-12-13 08:12:55
假设它是一个有向图,使用一个映射表,比如
id | src | dest
其中src
和dest
是对象表的FK。
如果您的对象并非都属于同一类型,请让它们都继承一个拼音类或使用另一个表:
id | type | type_id
其中type
是它所属的对象类型,type_id
是它在另一个表中的id。
通过这样做,您应该能够使用以下命令为它指向的每个对象获取一个对象数组:
select dest
from maptable
where dest = self.id
如果需要知道它的入站边缘,可以使用src
代替dest
执行相同类型的查询。
在此基础上,您应该能够轻松地编写所需的任何图形算法。如果需要权重,可以这样修改映射表。
id | src | dest | weight
https://stackoverflow.com/questions/4173272
复制相似问题