跳轉到內容

使用 Graphviz 進行 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")}

生成 dot 檔案

要使用 SVG 處理 dot 格式檔案,我們可以使用類似於 https://github.com/KitWallace/xquery-graphviz 上的模組。由於此模組使用 process:module,因此指令碼必須以資料庫訪問許可權執行。

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 圖

華夏公益教科書