是否有与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
);我有一个关于苏格兰城市和场地的例子。苏格兰是等级制度的根源。苏格兰的后裔是城市和场所。在这篇文章中,父母“包含”一个孩子,所以我们这样说。巴罗兰在格拉斯哥,格拉斯哥在苏格兰。
此语句使用示例数据填充NodeHierachy表:
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');SELECT * FROM NodeHierarchy;输出
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)在弗利明德中,我绘制了一个等价的图表:

有什么工具可以用最少的手工工作来帮我做到这一点呢?
编辑:最初我说我想要可视化层次结构的“全部或部分”。这里发布的解决方案无条件地可视化了整个层次结构。对于小型示例层次结构来说,这很好,但是对于更大的层次结构,只可视化其中的一部分可能更有用。
因为我没有说明我所说的“部分”是什么意思,所以我把它从问题中删除了。我已经询问过在另一个问题中部分可视化的问题。
发布于 2011-08-22 16:46:20
我研究了Cade答案中的线索,并开发了一个使用GraphViz的解决方案。
为了理解GraphViz,我首先阅读了这个介绍性文章和命令行调用文档。在成功地从本文中的示例代码列表生成了图形之后,我感到有信心处理自己的数据。
正如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输出

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程序员可能会想出更干净的东西。
发布于 2011-08-18 17:35:59
导出并通过GraphViz运行--甚至不必生成层次结构(仅导出节点和边缘)--只需根据NodeID列分配唯一的节点名称,并在边缘使用相同的节点名称。
如果您想要交互式的东西,微软有一个自动图形布局库,可以从.NET中使用。
这是一个GraphViz简介。
您要做的是输出一个DOT文件,方法是使用如下脚本导出SQL:https://data.stackexchange.com/stackoverflow/q/109885/,它将通过GraphViz运行并生成图片。
DOT语法相对简单--您可以先手工编写它,然后从SQL生成它,然后简单地将它粘贴到一个文件或其他东西(如.NET或PowerShell)中,读取这些SQL集并生成该文件。
您可以使用SSIS实现自动化。我制作了一个包,它写出了DOT文件,并在上面运行了graphviz,并且每天保存我们系统的石墨化快照。
https://stackoverflow.com/questions/7111467
复制相似问题