Ruby on rails 如何在RubyonRails中实现无向图?

Ruby on rails 如何在RubyonRails中实现无向图?,ruby-on-rails,ruby,algorithm,Ruby On Rails,Ruby,Algorithm,我需要在RubyonRails中实现一个无向图G=(V,E),并考虑构建一个顶点和一个顶点有很多边的边模型 当一条边正好连接两个顶点时,您将如何在Rails中实现这一点 你知道有哪一个gem或库可以帮助实现这样一个图形(对重新发明轮子不感兴趣;-)?不知道有哪一个库在ActiveRecord之上提供图形逻辑 您可能需要实现自己的Vertex、Edge ActiveRecord支持模型(请参见Rails安装的Rails/ActiveRecord/test/fixtures目录中的Vertex.rb

我需要在RubyonRails中实现一个无向图G=(V,E),并考虑构建一个顶点和一个顶点有很多边的边模型

当一条边正好连接两个顶点时,您将如何在Rails中实现这一点


你知道有哪一个gem或库可以帮助实现这样一个图形(对重新发明轮子不感兴趣;-)?

不知道有哪一个库在ActiveRecord之上提供图形逻辑

您可能需要实现自己的Vertex、Edge ActiveRecord支持模型(请参见Rails安装的
Rails/ActiveRecord/test/fixtures
目录中的
Vertex.rb
Edge.rb
),例如

上述操作将SQL语句总数(在只读操作中)减少到2条,但如果图形(
Edge.find(:all)
)较大,则可能会给数据库或内存带来压力,此时您可能会考虑进一步限制实际需要的数据量的方法,例如,只关心
red
顶点的连接:

    Edge.find(:all,
              :joins => :sources, # or sinks; indifferent since symmetric
              :conditions => [ 'vertices.red = ?', true ]
    )

嘿,弗拉德,这太酷了!:)。。。虽然我不明白为什么它需要对Vertex类进行如此复杂的关联。下面是不够的吗?类顶点“边缘”,:外键=>“接收器id”有多个:源,:类名称=>“边缘”,:外键=>“源id”结束是的,如果选择选项#2,则只需要两个关联(不需要:通过关联),即“有多个接收器边缘”和“有很多源边”嘿,弗拉德,这可能有点离题了,但我不知道还有什么其他联系方式。:)你对我的另一个问题写了答案()。我知道你一定有答案,但我看不懂。这是格式问题还是一个bug?哈维尔干杯
    edges = Edge.find(:all)
    dg = RGL::AdjacencyGraph.new(edges.inject([]) { |adj,edge|
      adj << edge.source_id << edge.sink_id
    })
    # have fun with dg
    # e.g. isolate a subset of vertex id's using dg, then
    # load additional info from the DB for those vertices:
    vertices = Vertex.find(vertex_ids)
    Edge.find(:all,
              :joins => :sources, # or sinks; indifferent since symmetric
              :conditions => [ 'vertices.red = ?', true ]
    )