21

グラフデータベースの言語をインポートし、理解する

  1. ノード円で表されます)、
  2. エッジ矢印で表される)、および
  3. プロパティノード/エッジのメタデータ

グラフデータベースプロパティグラフ

グラフィック(ウィキペディアの提供)は、有向グラフを説明しています。

Railsで無向グラフをモデル化する最良の方法は何ですか?

つまり、すべてのエッジが逆数であり(上の図のように)、各エッジのプロパティが方向に関係なく同じであるグラフ(上の図とは)。

ActiveRecord経由でSQLストアを使用したデフォルトのRails3セットアップを想定しましょう。

二重ポリモーフィックアソシエーションは、上の画像で説明されているデータをモデル化できる有向グラフを作成します。

def Edge < ActiveRecord::Base
  belongs_to :head, polymorphic: true
  belongs_to :tail, polymorphic: true
end

class Node < ActiveRecord::Base
  has_many :from, as: :head
  has_many :to, as: :tail
end

class Group < ActiveRecord::Base
  # a Node of Type: Group
  has_many :from, as: :head
  has_many :to, as: :tail
end

逆の関係を管理するためにこのモデルを拡張する必要がありますか、それともより良いモデルが利用可能ですか?


アプリの1つの要素はグラフの問題である可能性がありますが、アプリが問題の中心にあること、データに対してグラフの横断を実行する必要があること、データセットが使用可能なメモリよりも大きいことを意味するものではありません。

4

3 に答える 3

13

無向グラフでは、知っておく必要があるのは、ノードが別のノードに接続されているかどうかだけです。そして、方向性などはありません。

簡単なアプローチ:

class Node
  has_many :connected_nodes
  has_many :nodes, :through => :connected_nodes
end

class ConnectedNode
  belongs_to :node
  belongs_to :connected_node, :class_name => 'Node'
end

これは隣接リストとも呼ばれます。ノードごとに、隣接する(接続されている)ノードのリストを簡単に取得できます。

このアプローチで考えられる問題:接続を2回保存します。AはBに接続され、BはAに接続されます。

したがって、各接続を1回だけ保存するように正規化する方が適切であるように思われます。そうすれば、元の提案に非常に近くなります。

class Connection
  belongs_to :node1, :class_name => 'Node'
  belongs_to :node2, :clasS_name => 'Node'
end

ネーミングを通じて順序や方向性を課さないように最善を尽くします。

node1接続されたノードを取得することは、asまたはasに接続されたすべてのノードnode2であるため、考えられる方向を事実上無視します。

この場合、(node1、node2)との接続が一意であるが、(node2、node1)は実際には同じであり、2回挿入できないという検証も表現する必要があります。

私の個人的な選択は、2番目のスキーマを使用することですが、最初のソリューションを維持する方が速い場合があります(この質問も参照してください)。

また、著者がグラフをデータベースに保存する方法を説明している非常に興味深い記事を見つけました。非常に深遠ですが、データベース中心です。

お役に立てれば。

于 2011-11-11T21:03:57.027 に答える
4

Neo4Jを使ってみませんか?

http://wiki.neo4j.org/content/Ruby

https://github.com/andreasronge/neo4j-rails-example

https://github.com/andreasronge/neo4j

于 2011-11-07T11:07:18.683 に答える
3

ポリモーフィックな関連付けを使用する代わりに、has_many、:throughを使用してみてください

class Group < ActiveRecord::Base
  has_many :memberships
  has_many :persons, :through => :memberships
end

class Membership < ActiveRecord::Base
  belongs_to :group
  belongs_to :person
end

class Person < ActiveRecord::Base
  has_many :memberships
  has_many :groups, :through => :memberships
end

エッジのプロパティをメンバーシップモデルに格納できます。

于 2011-11-02T17:49:43.377 に答える