Cytoscape.jsで表からデータフロー図を描く

この記事でやったこと

ネットワークグラフを描くJSライブラリ(Cytoscape.js)を使って、データやプロセスの繋がりが記述された表からデータフロー図を描いてみた。

背景

前々からデータフローのような意味が明確なもの(このプロセスのインプットはこれでアウトプットはこれ、このデータはこことここに流れる、etc.)をExcelで図にすることで、内部的には本来の意味が死んでしまい、図形と線と図形の繋がりでしか無くなってしまうことが嫌だった。
PlantUML(DFD無いけど...)みたいな仕組みも根本的には同じ問題を抱えており、結局のところ要素Aと要素Bが繋がっているという情報をテキストで持つのか図形の配置で持つのかというだけの違いに過ぎない。あと、たぶんExcelの方が長文コメント書けたりして表現力が高い。

仕事で大きめのシステム群のデータフローを起こすことになってExcelで作業を始めたものの、以下のようなことがあって嫌になってしまった。

  • データフローが多いので線がごちゃごちゃになって見にくい
  • 現段階では確定情報ではないものが多く、変更が発生した場合にせっかく見やすく整えた図形の配置とか線の曲がり具合とかが台無しになる可能性が高い
  • 量が多いので絶対どこかで線繋ぐ先ミスる
  • 相当頑張ったところで結局何がどこに繋がっているのかいまいち見にくい図で終わる気がした
  • より明確に定義を記述した表との二重管理になる

そこで、ゴールデンウィークの宿題として、表からデータフロー図を自動で描いてくれる仕組みを作ってみることにした。

要件

仕事での使いやすさを考え、以下のような要件を想定した。

  • データやプロセスを記述した表からデータフロー図を作れる
  • 図中の各要素について補足コメントが書ける
  • 図中の各要素に色を付けられる
  • データやプロセスのまとまりを示すことができる(例:データAとデータBがシステムAに属することが図で表現できる)
  • データベース、帳票、外的要素、プロセスを図形の違いで描き分けることができる
  • 単一のファイルとしてクライアント等に共有でき、共有先で特殊なアプリケーションをインストールすることなく内容が確認できる
    →Office系や画像を除くとたぶんHTML一択

やったこと

技術選定

候補となるライブラリについて、ここがよくまとまっていた。 qiita.com

この中から,実装のしやすさに惹かれてvis.jsを試したが機能が足りなかった。機能の豊富さと拡張性を見てCytoscape.jsを試したところ上手く行きそうだったのでこれを採用した。

要件との対応はこんな感じ

要件 vis.js Cytoscape.js
データやプロセスを記述した表からデータフロー図を作れる
図中の各要素について補足コメントが書ける △(拡張機能)
図中の各要素に色を付けられる
データやプロセスのまとまりを示すことができる(例:データAとデータBがシステムAに属することが図で表現できる) ×
データベース、帳票、外的要素、プロセスを図形の違いで描き分けることができる
単一のファイルとしてクライアント等に共有でき、共有先で特殊なアプリケーションをインストールすることなく内容が確認できる

vis.js

とりあえず表(をHTMLファイルにTSVとしてコピペしたもの)からこんな図が書けるようになったが、上記の通りデータやプロセスをグループで示すことができなかった。
ドキュメントを読んだときにグループという概念があったので誤解していたのだが、複数の要素に共通のスタイルを適用するための仕組みだった。

Cytoscape.js

今のところ良い感じに動くやつができた。仕事で想定しているような大規模なものを突っ込んだときにどうなるかは知らない。 図は以下の状態

  • 「データC連携」というプロセスをクリックした結果、該当プロセスと繋がっているフロー、データがハイライトされている
  • 「ユーザ部署」というグループにマウスカーソルを当てた結果、該当要素に設定されているメモがツールチップとして表示されている

とりあえずソースコードを置いておく。 diagram/dfd-cytoscape.html at main · miyake32/diagram · GitHub

作ったものの説明

使っているライブラリ等

  • 図の描画:Cytoscape.js
  • 図のレイアウト(要素配置の計算エンジン):klay(cytoscape.js-klayというExtensionを通じて動かしている)
  • ツールチップの表示:tippy.js

仕組み

以下の3種類の表をExcel等で作成し、HTMLファイルの所定の場所にコピペする(ペースト先ではタブ区切りテキストになる)とデータフロー図が描画される。

  • データやプロセスをまとめるグループ(グループをまとめるグループも定義可能)
  • データ要素(データストア、帳票、外的要素の3種類が定義可能)
  • プロセス(インプットとアウトプットを持つ)

表の列はグループの指定にIDが必要だったりして無機質というか使いにくそうに見えるが、実際に仕事で使う場合はExcel上で関数とか入力制御とか使って、例えばグループの選択肢(名称)を選ぶとIDがLOOKUPされるみたいな感じで使いやすくできるはず。

工夫した点

  • 複数行テキストに対応した(Excel上でセル内に改行を入れるとTSVの構造が少しややこしくなる)
  • 帳票用のアイコンを自分で作った
  • コメントの表示をツールチップで実装し、各要素にコメントが存在することを示すアイコンを付けた

課題

  • 要素の配置に対する制御が不足している気がする
    大まかな階層(例:データソースとなる外部システム群→取り込み直後のデータ→加工後のデータ→加工後のデータを集約したデータ)を定義してその順に並べることができそうだが上手く実現できていない
  • データストアがあんまりデータベースっぽくない