複数の親を持つ有向グラフを表す方法は?


8

http://dirtsimple.org/2010/11/simplest-way-to-do-tree-based-queries.htmlは、クロージャーテーブルの挿入と削除のアルゴリズムを提供します。

ノードに複数の親がある場合を除いて、同様のデータ構造をモデル化したいと思います。

与えられた:

グラフ#1

削除する[B, C]と、次のようになると予想します。

グラフ#2

ノードを削除すると、次のようになりますB

グラフ#3

ただし、リンクまたはノードを削除するために作成者のアルゴリズムを使用すると、[D, C, 1]削除のタグが付けられることに気付くでしょう。これは望ましくありません。

これまでに試したこと

references2つのノード間を移動する方法がいくつあるかを示す列を追加することにより、元のデータ構造を適応させてみました。上記の例では、からAまでCBまたはを経由して移動できますDB削除されると、AtoへのパスCが保持され、参照カウントが2から1に減少すると考えられていました。理論的には良かったのですが、実装を機能させる方法を理解できなかったので、それはまったく可能です(データ構造には、削除する行を特定するのに十分な情報が含まれていない可能性があります)。

私が求めていること

複数の親をサポートするために、クロージャテーブルをどのように調整しますか?どの代替データ構造をお勧めしますか?https://stackoverflow.com/q/4048151/14731には、そのようなデータ構造の説得力のあるリストが含まれていますが、複数の親をサポートしている(または最適な)構造は明確ではありません。


では、何を試しましたか?そして、references列は何ですか?
ypercubeᵀᴹ

私はあなたがあなたのシナリオでクロージャーテーブル適合させるとは思わない。クロージャーテーブルは、多くのツリーベースのアプリケーションに適していますが、この質問は、DAG(有向非巡回グラフ)の制限の少ないタイプを示唆しています。これは修士論文に適したトピックであり、データベースに関しては多くのことと同様に、最適なソリューションは正確な特定のユースケースに大きく依存します。これまたはこれはあなたが始めるのに役立つかもしれません。
Avarkx 2014年

どのdbソフトウェア?
Neil McGuigan、2014年

@ NeilMcGuigan、H2、およびPostgreSQLですが、明らかにDBに依存しないソリューションを好みます。
ギリ2014年

回答:


3

通常、ノードテーブルと関係テーブルを作成します。有向グラフは実際には階層的ではなく、ループが存在する可能性があり、クエリが困難になります。しかし、DAGを一般化されたツリー(つまり、複数の親を許可するが厳密に階層化されているツリー)であり、有向グラフを一般化されたDAG(つまり、DAGのように厳密に階層化されていない)であると考えると、より簡単になります。

したがって、非常に単純なPostgreSQLソリューションの場合、次のようなことを行うことができます。

CREATE TABLE node (
    id serial primary key,
    payload jsonb not null
);

CREATE TABLE relationship (
    id serial primary key,
    relationship_type text not null,
    from_node int references node(id) not null,
    to_node int references node(id) not null,
    payload jsonb not null
);

次に、次のようなクエリを実行できます。

with recursive dg as (
    select n.id as node_id, null::Int as parent, array[n.id] as path
      from node n
    union all
    select to_node, from_node, path || to_node
      FROM relationship
      JOIN dg on dg.node_id = from_node AND NOT from_node = ANY(path)
)
select * from dg;
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.