跳至内容

使用 Graphviz 进行 XQuery/图形可视化

来自维基教科书,开放世界中的开放书籍

AT&T 开发的 Graphviz 提供了一个代码包,用于从文本定义生成图形图像。

可以使用带有文本输出的 XQuery 脚本生成 'dot' 格式的输入文件。

您希望创建图形以可视化复杂结构,例如分类法、对象层次结构或组织层次结构。

数据库可视化

[编辑 | 编辑源代码]

empdept 示例中员工和经理之间关系的图形表示。

此脚本生成dot格式文件,以员工作为(隐式)节点,并从员工到经理的弧线来显示由...管理关系。

输出被序列化为文本。序列化会剥离所有 XML 标签,因此 XML 可用于构建输出,并且无需序列化每个项目。Graphviz dot 格式使用 { } 花括号作为分隔符,因此需要在 XQuery 中对其进行转义(加倍)。

let $dot :=
<graph>
  digraph {{
 { for $emp in //Emp
  let $mgr := //Emp[EmpNo = $emp/MgrNo]
  where exists($mgr)
  return
    concat( $emp/Ename, " -> ", $mgr/Ename, ";")
 }
  }}
</graph>
return element result {util:serialize($dot,"method=text")}

生成 dot 文件

要使用 SVG 处理 dot 格式文件,我们可以使用像这样在<a href="https://github.com/KitWallace/xquery-graphviz">GitHub</>上的模块。由于此模块使用 process:module,因此脚本必须以 db 访问权限运行。

gv:dot-to-svg($dot)

SVG 图像

如果图形反转,这将看起来更像典型的组织结构图。Graphviz 提供了广泛的控制,可以控制图形的内容和外观。

let $dot :=
<graph>
  digraph {{
  rankdir=BT;
 { for $emp in //Emp
  let $mgr := //Emp[EmpNo = $emp/MgrNo]
  where exists($mgr)
  return
    concat( $emp/Ename, " -> ", $mgr/Ename, ";")
 }
  }}
</graph>
return qv:dot-to-svg($dot)

SVG 图表


由于 Enames 不一定是唯一的,因此最好使用 EmpNo 作为节点标识符,并使用名称标记节点

let $dot := 
<graph>
   digraph {{
   
  {for $emp in //Emp
  let $mgr := //Emp[EmpNo = $emp/MgrNo]
  return
      <emp>
       {$emp/EmpNo} [label="{$emp/Ename}"];
       {if ( exists($mgr))
       then  
          <arc>
            {$mgr/EmpNo}  -> {$emp/EmpNo} ;
          </arc>
       else ()
       }
     </emp>
  }
   }}
</graph>
return qv:dot-to-svg($dot)

SVG 图表

同样,部门/员工层次结构也可以用图形表示

let $dot :=
<graph>
  digraph {{
  {for $dept in //Dept
  return 
  <dept>
        Company  -> {$dept/DeptNo} ;   
        {$dept/DeptNo} [ label="{$dept/Dname}" ];
        { for $emp in //Emp[DeptNo = $dept/DeptNo]
          return
             <emp>
                {$emp/EmpNo}  [label="{$emp/Ename}" ];
                {$dept/DeptNo}  -> {$emp/EmpNo} ;
              </emp>
        }
    </dept>
   }
  }}
</graph>
return qv:dot-to-svg($dot)

SVG 图表

华夏公益教科书