发布
社区首页 >问答首页 >在RoR中使用循环图

在RoR中使用循环图
EN

Stack Overflow用户
提问于 2010-11-13 23:33:27
回答 3查看 431关注 0票数 0

我以前没有尝试过在Rails中使用图形,我很好奇最好的方法是什么。一些背景知识:

我正在创建一个Rails3站点,我认为将某些对象及其关系存储为图形会很有趣,其中每个对象都是一个节点,其中一些对象被连接起来,以表明这两个对象是相关的。图中确实包含循环,并且图中的节点不会超过100-150个(可能只有接近50个)。一个节点可能不会有超过五条边,平均每个节点有三到四条边。

我认为包含两列(每列都是对象的ID )的简单连接表可能是最简单的方法,但我怀疑这是最好的方法。另一个想法是使用像acts_as_tree这样的插件(它似乎没有在Rails3中更新...)或者acts_as_tree_with_dotted_ids,但我不确定他们是否有能力使用循环而不是层次树。

我目前最想做的就是轻松地从一个节点遍历到它的兄弟节点。我真的想不出有什么理由要遍历节点的同级节点,这就是为什么我考虑只做一个SQL连接表的原因。我只想在站点上有一个部分来显示与指定对象相关的对象,这个图是我指定关系的方法之一。

建议?我应该检查的东西吗?谢谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-11-14 03:24:08

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

这个策略应该和查找、安装、学习使用和实现插件一样简单(如果不是更容易的话)。

票数 1
EN

Stack Overflow用户

发布于 2010-12-13 10:14:53

根据您主要关注的是图上的操作,还是图的存储,您需要的可能是完全不同的。如果您想要方便的图形操作,请研究gem "rgl“(ruby图形库)。它实现了大多数基本的经典遍历和搜索算法。

如果您正在处理大约150个节点,那么您可能可以在数据库本身或关联列表中使用最小邻接表表示。然后,您可以将其提供给RGL以进行遍历和搜索操作。

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

票数 1
EN

Stack Overflow用户

发布于 2010-12-13 08:12:55

假设它是一个有向图,使用一个映射表,比如

代码语言:javascript
代码运行次数:0
复制
id | src | dest

其中srcdest是对象表的FK。

如果您的对象并非都属于同一类型,请让它们都继承一个拼音类或使用另一个表:

代码语言:javascript
代码运行次数:0
复制
id | type | type_id

其中type是它所属的对象类型,type_id是它在另一个表中的id。

通过这样做,您应该能够使用以下命令为它指向的每个对象获取一个对象数组:

代码语言:javascript
代码运行次数:0
复制
select dest 
from maptable 
where dest = self.id

如果需要知道它的入站边缘,可以使用src代替dest执行相同类型的查询。

在此基础上,您应该能够轻松地编写所需的任何图形算法。如果需要权重,可以这样修改映射表。

代码语言:javascript
代码运行次数:0
复制
id | src | dest | weight
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4173272

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档