使用 Graphviz 進行 XQuery/圖形視覺化
外觀
< 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")}
要使用 SVG 處理 dot 格式檔案,我們可以使用像這樣在<a href="https://github.com/KitWallace/xquery-graphviz">GitHub</>上的模組。由於此模組使用 process:module,因此指令碼必須以 db 訪問許可權執行。
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)