使用 Graphviz 进行 XQuery/图形可视化
外观
< XQuery
(重定向自 XQuery/图形可视化)AT&T 开发的 Graphviz 提供了一套用于从文本定义生成图形图像的代码。
'dot' 格式的输入文件可以通过带有文本输出的 XQuery 脚本生成。
您想创建一个图形来可视化复杂结构,例如分类法、对象层次结构或组织层次结构。
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")}
要使用 SVG 处理 dot 格式文件,我们可以使用类似于 https://github.com/KitWallace/xquery-graphviz 上的模块。由于此模块使用 process:module,因此脚本必须以数据库访问权限运行。
gv:dot-to-svg($dot)
如果图形反转,这将看起来更像典型的组织结构图。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)
由于 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)
类似地,可以绘制部门/员工层次结构
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)