2011-08-18 34 views
9

有沒有一種工具可以與SQL Server一起使用來從分層數據模型生成樹狀圖?什麼工具從SQL Server分層數據生成圖表?

我正在處理一個很大的地理層次結構,並希望將其可視化。

這裏是一個例子。

我有一個NodeHierarchy表,存儲節點之間的層次關係。表中的每一行代表一個節點。除了一個節點之外,每個節點都有一個父節點如果層次結構沒有父節點,則爲根節點。

這是我如何創建我的表:

CREATE DATABASE HierarchyTest; 
GO 

USE HierarchyTest; 
GO 

CREATE TABLE NodeHierarchy (
    PK_NodeID INT NOT NULL 
    CONSTRAINT PK_NodeHierarchy PRIMARY KEY, 
    FK_ParentNodeID INT NULL 
    CONSTRAINT FK_NodeHierarchy_NodeHierarchy FOREIGN KEY 
     REFERENCES NodeHierarchy(PK_NodeID), 
    Name NVARCHAR(255) NOT NULL 
); 

我有蘇格蘭城市和場館的例子層次結構。蘇格蘭是層級的根源。蘇格蘭的後裔是城市和場地。在這個hiearchy中,父母'包含'一個孩子,所以我們說例如「巴羅蘭在格拉斯哥,格拉斯哥在蘇格蘭」。

此語句填充NodeHierachy表eample數據:

輸出 SELECT * FROM NodeHierarchy;
INSERT INTO NodeHierarchy(PK_NodeID, FK_ParentNodeID, Name) 
VALUES 
    (1, NULL, N'Scotland'), 
    (2, 1, N'Glasgow'), 
    (3, 1, N'Edinburgh'), 
    (4, 1, N'St Andrews'), 
    (5, 2, N'The Barrowlands'), 
    (6, 2, N'The Cathouse'), 
    (7, 2, N'Carling Academy'), 
    (8, 2, N'SECC'), 
    (9, 2, N'King Tut''s Wah-Wah Hut'), 
    (10, 3, N'Henry''s Cellar Bar'), 
    (11, 3, N'The Bongo Club'), 
    (12, 3, N'Sneaky Pete''s'), 
    (13, 3, N'The Picture House'), 
    (14, 3, N'Potterrow'), 
    (15, 4, N'Aikman''s'), 
    (16, 4, N'The Union'), 
    (17, 4, N'Castle Sands'); 

PK_NodeID FK_ParentNodeID Name 
----------- --------------- --------------------------------- 
1   NULL   Scotland 
2   1    Glasgow 
3   1    Edinburgh 
4   1    St Andrews 
5   2    The Barrowlands 
6   2    The Cathouse 
7   2    Carling Academy 
8   2    SECC 
9   2    King Tut's Wah-Wah Hut 
10   3    Henry's Cellar Bar 
11   3    The Bongo Club 
12   3    Sneaky Pete's 
13   3    The Picture House 
14   3    Potterrow 
15   4    Aikman's 
16   4    The Union 
17   4    Castle Sands 

(17 row(s) affected) 

Freemind我編這相當於圖: mindmap of Scottish venues

什麼工具可以做這對我來說至少需要手動的努力?


編輯:本來我說,我想以可視化的層次結構的「全部或部分」。這裏發佈的解決方案無條件地顯示整個層次結構。這對於小示例層次結構來說很好,但對於較大的示例層次結構來說,可能只是對其中的一部分進行可視化更爲有用。

因爲我沒有詳細說明我的「部分」是什麼意思,所以我從這個問題中刪除了這個。我在another question中詢問了部分可視化。

+0

+1這是一個很好的問題。我也想知道答案。 –

+0

+1我真的很喜歡你已經包含'CREATE DATABASE'和'INSERT',這樣我就可以剪切和粘貼了! –

+0

謝謝,柯克。這是'短暫的,獨立的,正確的,可編輯的例子'的精神:http://sscce.org/。 –

回答

6

我研究了Cade Roux的答案,並使用GraphViz開發了一個解決方案。

要了解GraphViz,首先我讀了introductory articleCommand-line Invocation文檔。在從文章中的示例代碼清單成功生成圖表之後,我感到有信心使用我自己的數據。

正如Cade所建議的,學習GraphViz的DOT語言的最好方法是自己寫出來。我學的是本文中的示例(清單1,2和6),然後想出了這個venues.gv來形容我自己的數據:

digraph Venues 
{ 
    N1[label = "Scotland"]; 
    N2[label = "Glasgow"]; 
    N3[label = "Edinburgh"]; 
    N4[label = "St Andrews"]; 
    N5[label = "The Barrowlands"]; 
    N6[label = "The Cathouse"]; 
    N7[label = "Carling Academy"]; 
    N8[label = "SECC"]; 
    N9[label = "King Tut's Wah-Wah Hut"]; 
    N10[label = "Henry's Cellar Bar"]; 
    N11[label = "The Bongo Club"]; 
    N12[label = "Sneaky Pete's"]; 
    N13[label = "The Picture House"]; 
    N14[label = "Potterrow"]; 
    N15[label = "Aikman's"]; 
    N16[label = "The Union"]; 
    N17[label = "Castle Sands"]; 

    N1 -> N2; 
    N1 -> N3; 
    N1 -> N4; 
    N2 -> N5; 
    N2 -> N6; 
    N2 -> N7; 
    N2 -> N8; 
    N2 -> N9; 
    N3 -> N10; 
    N3 -> N11; 
    N3 -> N12; 
    N3 -> N13; 
    N3 -> N14; 
    N4 -> N15; 
    N4 -> N16; 
    N4 -> N17; 
} 

我喂這circo,只是許多圖形繪製命令的一個是GraphViz的的一部分,並且得到了令人愉悅的輸出:

輸出 circo -Tpng venues.gv -o venues.png

Visualization of hierarchical venue data

的GraphViz的文件是在兩個塊構成。一個塊爲每個節點聲明一個標籤,另一個塊聲明圖的邊。

爲了提供每個塊的數據,我創建了一個NodeHierarchy的視圖。

該視圖提供數據,以用於在節點聲明標籤:

CREATE VIEW NodeLabels (
    Node, 
    Label 
) 
AS 
SELECT 
    PK_NodeID AS Node, 
    Name AS Label 
FROM 
    NodeHierarchy; 

該視圖提供數據到節點之間的聲明邊:

CREATE VIEW Edges (
    Parent, 
    Child 
) 
AS 
SELECT 
    FK_ParentNodeID AS Parent, 
    PK_NodeID AS Child 
FROM NodeHierarchy 
WHERE FK_ParentNodeID IS NOT NULL; 

這稱爲generate-graph.ps1 Powershell的腳本選擇來自所述數據視圖,將其轉換爲GraphViz輸入,並將其導入至circo以生成類似以上所示的完整層次結構的可視化效果:

"digraph Venues {" + (
    Invoke-Sqlcmd -Query "SELECT * FROM HierarchyTest.dbo.NodeLabels" | 
    ForEach-Object {"N" + $_.Node + "[label = """ + $_.Label + """];"} 
) + (
    Invoke-Sqlcmd -Query "SELECT * FROM HierarchyTest.dbo.Edges" | 
    ForEach-Object {"N" + $_.Parent + " -> N" + $_.Child + ";"} 
) + 
"}" | circo -Tpng -o venues.png 

腳本必須在sqlps而不是powershell中運行,以便Invoke-Sqlcmd cmdlet可用。 sqlps的默認工作目錄是SQLSERVER,所以我必須在通過sqlps運行腳本時指定驅動器。

這是我使用,以產生類似上面的曲線圖中的命令:

sqlps C:.\generate-graph.ps1 

此輸出一個稱爲在C工作目錄venues.png文件。

此PowerShell解決方案感覺有點不雅,但這是我所需要的。更有經驗的Powershell程序員可能會想出更清晰的東西。

+0

這僅可視化整個層次結構。對於我的小樣本數據集,這很好,但對於更大的一組數據,我可能只想查看一小部分層次結構。我將發佈一個更新的解決方案,使其成爲可能。 –

7

導出並運行它通過GraphViz - 甚至不必生成層次結構(只導出節點和邊) - 只需根據NodeID列分配節點名稱,並在邊緣使用相同的節點名稱。

如果您想要某種交互功能,Microsoft有一個Automatic Graph Layout library可以從.NET使用。

這是introduction to GraphViz

你打算做的是輸出一個DOT文件,通過使用這樣的腳本導出你的SQL:http://data.stackexchange.com/stackoverflow/q/109885/它將運行GraphViz並生成你的圖片。

DOT語法相對簡單 - 您可以先手動編寫它,然後從SQL生成該文件,然後將其粘貼到文件或其他(如.NET或PowerShell)中,該文件讀取SQL集並生成文件。

您可以使用SSIS自動執行該操作。我製作了一個包,它寫出了DOT文件並在其上運行graphviz並每天保存了我們系統的graphiacl快照。

+0

我不熟悉GraphViz,我不知道'export'是什麼意思。你能否更詳細地解釋這個過程?謝謝! –

+0

@isme我已經添加了一些指針 –

+0

我閱讀了介紹,寫於2004年。版本2.28的GraphViz在作者使用的版本的某些代碼列表上產生不同的輸出,但它們仍然有效並且是一個很好的學習援助。謝謝! –