2012-08-15 55 views
4

我需要遍歷和更新SQL中的圖形。更新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表達式是唯一的方法。

NOTES:

  • 結構沒有一棵樹,它是一個有序循環圖。
  • 圖形數據庫現在不是一個選項(這只是系統的一小部分)
  • 更新不需要是立即就可以的,它們可以保持一致(談論幾秒鐘分鐘)。
+0

圖中有周期嗎?如果圖是非循環的,這有助於公平的一點。使用帶有SQL CTE的循環圖,可能會很「有趣」。 – 2012-08-15 07:28:14

+0

給出示例數據來演示正常情況和拐角情況可能有助於獲得確切答案。然後我們有無用的數據來處理,而不是從你的描述中推斷細節。 – MatBailie 2012-08-15 07:53:57

+0

這是循環的好或壞:( – 2012-08-15 07:55:30

回答

3

聽起來像你需要保持每個主題圖的傳遞閉包。看看a paper about how to implement an incremental evaluation system (IES) with SQL,似乎能夠做到這一點。本文針對有向無環,無向和任意有向圖,提供了廣泛的SQL實例。

看起來,對於您的每個主題,圖都是非循環的,這是幸運的最簡單的情況。

+0

論文!不再...:) – 2012-08-15 08:06:02

+1

看看吧!它寫得很好。我會在這裏複製文本以使文本變得更糟。 – jpe 2012-08-15 08:08:11

+0

是的,將不得不花時間閱讀。哈哈,不要在這裏複製:) – 2012-08-15 08:11:12