4

SQL でグラフをトラバースして更新する必要があります。

これを前向きに考えるために、例を挙げます。

  • すべての企業は、特定のテーマについて他の企業を代表することができます。
  • 企業はお互いを代表することができますが、同じ主題についてはできません

これは、次のようなテーブルを想定しています。

companies(id)representations(source_id, destination_id, subject)

しかし、ルールは、私の会社が特定の主題についてあなたの会社を代表しなくなった場合、私の会社からチェーンを下ったどの会社も同じ主題について私の会社を代表することはできないということです.

私の言いたいことを理解していただければ幸いです。

したがって、次のような単純なデータを使用します。

C1:
--sell--> C2
--pay--> C3

C2:
--sell--> C3
--pay--> C1

C3:
--mail--> C1
--sell--> C4

C4:
--deliver-->C1

ここで、表現を削除します (リレーションと呼ぶC2--sell-->C3べきでした)。最終的には次の構造になります ( [X]- 削除)。

C1:
--sell--> C2
--pay--> C3

C2:
[X]--sell--> C3
--pay--> C1

C3:
--mail--> C1
[X]--sell--> C4

C4:
--deliver-->C1

では、問題は、特定のテーマについて、私のチェーンの下流にあるすべての企業をどのように選択できるかということです。

再帰的な CTE 式がそれを行う唯一の方法だと思います。

ノート:

  • 構造はツリーではなく、順序付き巡回グラフです。
  • グラフデータベースは今のところオプションではありません (これはシステムのほんの一部です)
  • 更新は即時である必要はなく、最終的に整合性がとれていれば問題ありません (数秒から数分程度)。
4

1 に答える 1

3

サブジェクトごとにグラフの推移的な閉鎖を維持する必要があるようです。SQL を使用してインクリメンタル評価システム (IES) を実装する方法についての論文を見ると、そのトリックを実行できるようです。この論文には、有向非巡回グラフ、無向グラフ、および任意有向グラフの広範な SQL の例があります。

あなたの主題のそれぞれについて、グラフは非循環的であるように見えますが、これは幸いなことに最も単純なケースです。

于 2012-08-15T07:34:55.907 に答える