Ruby on rails 如何在RubyonRails中实现无向图?
我需要在RubyonRails中实现一个无向图G=(V,E),并考虑构建一个顶点和一个顶点有很多边的边模型 当一条边正好连接两个顶点时,您将如何在Rails中实现这一点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
你知道有哪一个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类进行如此复杂的关联。下面是不够的吗?类顶点
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 ]
)