【问题标题】:How to visualize only the descendants, ancestors, and self of a node in a hierarchy?如何仅可视化层次结构中节点的后代、祖先和自身?
【发布时间】:2011-09-18 15:22:18
【问题描述】:

在另一个question 中,我询问了如何可视化存储在 SQL Server 数据库中的表中的分层数据。我找到了一种使用 GraphViz 可视化整个层次结构的方法,并在 T-SQL 和 Powershell 中使用了一些管道。

我想使用这样的可视化来调试使用类似数据的应用程序。对于小示例层次结构,可视化一切都很好。但在成千上万的层次结构中,这是压倒性的。

当我调试我的应用程序时,我通常只查看与给定节点相关的一小部分节点。目前,对于给定节点而言,对我而言唯一重要的相关节点是后代和祖先,以及节点本身。

所以,我想要一种方法来仅可视化层次结构中作为给定节点的后代、祖先或自身的节点。

以下语句创建链接问题中的示例数据库和表。

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
);

以下语句使用国家、城市和场所层次结构的修改版本填充表格。英国现在是根节点,有更多节点代表英国著名场馆。

INSERT INTO NodeHierarchy(PK_NodeID, FK_ParentNodeID, Name)
VALUES
  (1, 18, 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'),
  (18, NULL, N'United Kingdom'),
  (19, 15, N'Upstairs'),
  (20, 15, N'Downstairs'),
  (21, 16, N'Venue 1'),
  (22, 16, N'Venue 2'),
  (23, 18, N'England'),
  (24, 23, N'Manchester'),
  (25, 24, N'Apollo Theatre'),
  (26, 18, N'Liverpool'),
  (27, 26, N'Cavern Club');

下图是链接问题中列出的 Powershell 脚本generate-graph.ps1 的输出。如果 Stack Overflow 缩小版看起来很难看,请查看 full-size image

我只想看看圣安德鲁斯的后裔和祖先与它的关系。该图包含许多与这些关系无关的信息,因此更难阅读。当我将层次结构扩展到覆盖全球城市和场所的数千个节点时,完整的可视化几乎变得毫无用处。

Freemind 中,我画了一张我希望看到的粗略图表:

如何仅提取与 St Andrews 相关的数据,以便将其提供给 GraphViz?

【问题讨论】:

  • 这是一个危险的问题。我已经有了自己的解决方案,但我也想分享它解决的问题。我很快就会发布我自己的解决方案。
  • 你使用的是 sql server 2008 吗?
  • 我使用的是 SQL Server 2008。顺便说一句,我没有忘记发布我的解决方案;我最近很忙!
  • 我正在走一条路,但没有成功...现在尝试其他方法:)

标签: sql-server tsql visualization hierarchical-data


【解决方案1】:

层次结构的自引用表示对于诸如您只想选择一个分支的工作来说有点笨拙,因此您需要以未知次数递归地加入目标表。很有可能,但是任何时候我在 SQL Server 中处理层次结构时,我都会直接跳转到HierarchyId

我不知道我们是否可以同时递归地查看updown这棵树;一种天真的方法对我来说是失败的,所以我将提出一个更简单的替代方案。

您已经拥有当前节点。获取该节点的子节点,然后获取该节点的父节点。联合他们,你就完成了。在 SQL 中进行递归连接的最简单方法是使用 Common Table Expressions

DECLARE @nodeid INT = 4
DECLARE @nodes TABLE (NodeID INT)

; WITH Parents (NodeID) AS
(
    -- get the parent of the current node
    SELECT FK_ParentNodeID FROM NodeHierarchy WHERE PK_NodeID = @nodeId
        -- not sure if 'null' is a valid parent, but I'm assuming not
        AND FK_ParentNodeID IS NOT NULL
    UNION ALL
    -- recursively get the parents of the parent
    SELECT FK_ParentNodeID FROM NodeHierarchy 
        INNER JOIN Parents ON PK_NodeID = NodeID
        WHERE FK_ParentNodeID IS NOT NULL     
)
INSERT @nodes SELECT NodeID FROM Parents

; WITH Childs (NodeID) AS
(
    -- selecting the current node
    SELECT PK_NodeID FROM NodeHierarchy WHERE PK_NodeID = @nodeId
    UNION ALL
    -- recursively select the children of the branch
    SELECT PK_NodeID FROM NodeHierarchy 
        INNER JOIN Childs ON FK_ParentNodeID = NodeID
)
INSERT @nodes SELECT NodeID FROM Childs

SELECT * FROM @nodes

现在根据您之前的问题,您只需从现有视图中进行选择。

SELECT Node, Label FROM NodeLabels 
WHERE Node IN (SELECT NodeID FROM @nodes)

SELECT Parent, Child FROM Edges
WHERE Parent IN (SELECT NodeID FROM @nodes)

【讨论】:

    【解决方案2】:

    我不认为你在这里使用 union,它更简单:

    declare @nodeid int, @parentID int
    select @nodeid = PK_NodeID, @parentID = FK_ParentNodeID
        from NodeHierarchy where name = 'St Andrews'
    
    select PK_NodeID, FK_ParentNodeID, Name
        from NodeHierarchy 
        where PK_NodeID in (@nodeid, @parentID)
        or FK_ParentNodeID = @nodeid
    

    当然,你可以把它放在一个表函数中,让它通用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-13
      相关资源
      最近更新 更多