ラベル グラフ の投稿を表示しています。 すべての投稿を表示
ラベル グラフ の投稿を表示しています。 すべての投稿を表示

2025年2月7日金曜日

Oracle DevelopersのYouTubeのOracle APEX Graph Visualization Plug-in Enhancementの実装を試してみる

YouTubeのチャンネルにOracle Developersがあります。そのチャンネルに以下の動画が投稿されています。

Oracle APEX Graph Visualization Plug-in Enhancement - Drill Down into Details

APEX Graph Visualization Plug-inはOracle Graphの開発チームより提供されている、APEXのアプリケーションに組み込めるグラフを表示するプラグインです。この動画では、グラフ・プラグインに表示されているノードのツールチップ上に、APEXアプリケーションのページを開くボタンを作る方法を解説しています。

本記事では、この動画の内容にそって、Graph Visualization Plug-inのサンプル・アプリケーションに、ページを開くボタンを追加します。

以前にGraph Visualization Plug-inのサンプル・アプリケーションの導入方法を紹介しています。記事「Graph Visualization Plug-inのサンプル・アプリケーションをOracle Database 23aiのAPEXにインストールする」です。こちらの記事ではOracle APEX 24.1のサンプル・アプリケーションのブランチを参照しています。今回のYouTubeの動画では24.2のブランチを参照しています。


インストールするファイルsample-graph-visualizations_23ai.sqlとgvt_sqlgraph_to_json.sqlを24.1と24.2で比較しましたが、実質的には同一(コメントが1行違う)でした。そのため、この記事の手順に従ってGraph Visualization Plug-inのサンプル・アプリケーションを準備します。

Oracle Database 23ai FreeにOracle APEX 24.2の組み合わせで、サンプル・アプリケーションにドロワーの表示を組み込んでみます。

追加した機能は以下のGIF動画のように動作します。


先に紹介した記事の作業を行い、Sample Graph Visualizationsのアプリケーションが作成済みであることを前提とします。

ドロワーを開く機能は、Interactionのページに実装します。


グラフに表示されているノード上で右クリックすると、ツールチップが表示されます。このツールチップ上にボタンを追加します。


最初に従業員をドロワーとして表示するページを作成します。

アプリケーション・デザイナよりページの作成をクリックします。


フォームを選択します。


ページの名前はEmployee Detailとし、ページ・モードにドロワーを選択します。データ・ソースの表/ビューの名前に、EBA_GRAPHVIZ_EMPLOYEESを指定します。この表はサンプル・アプリケーションのインストール時に、サポートするオブジェクトとしてデータベースにインストールされます。

次へ進みます。


主キー列1はEMPLOYEE_ID(Number)になります。

ページの作成をクリックします。


ドロワーのページが作成されます。

ページ・プロパティの識別の別名を確認します。通常はページ名がEmployee Detailであれば別名はemployee-detailになります。この値をAPEX_PAGE.GET_URLの引数p_pageに与えます。


ページ・アイテムP2_EMPLOYEE_IDの主キーがオンであることを確認します。


以上でドロワーのページは完成です。

静的アプリケーション・ファイルとして、今回の機能拡張を実装したJavaScriptファイルを作成します。

セミナー講師が準備したGitHubリポジトリより、graphDrillDown.jsとgraphDrillDownPageLoad.jsの内容を組み込みます。


上記のファイルとほとんど同じですが、graphDrillDownPageLoad.jsの内容をDOMContentLoadedのイベントで実行するようにして、graphDrillDown.jsに追加しました。

それとgraphDrillDown.jsの68行目の以下の行を、

window.location.href = response.url; // uncomment this line to enable redirection

APEXのドロワーを開く、以下のコードに変更しています。

apex.navigation.dialog(response.url, {} );

このファイルを静的アプリケーション・ファイルとして作成します。

共有コンポーネントの静的アプリケーション・ファイルを開きます。


ファイルの作成をクリックします。


ディクレクトリはjs、ファイル名はgraphDrillDown.jsとします。

作成をクリックします。


本記事に掲載したgraphDrillDown.jsのコードを貼り付け、変更の保存をクリックします。


ファイルが保存され、縮小されました。とメッセージが表示されます。参照をコピーします。この参照の値をページ・プロパティのJavaScriptのファイルURLに設定します。

取消をクリックし、スクリプト・エディタを閉じます。


ページ・デザイナに戻り、ページ・プロパティのJavaScriptのファイルURLに以下の値を設定します。

[defer]#APP_FILES#js/graphDrillDown#MIN#.js


ドロワーのページを開くURLを取得するために呼び出すAjaxコールバックを作成します。

名前はREDIRECT_USERとします。この名前はgraphDrillDown.jsの定数ajaxCallbackに設定されているため、変更する場合はgraphDrillDown.jsも変更が必要です。

こちらのコードは元の動画のコードより、かなり簡素化しています。



以上でアプリケーションは完成です。アプリケーションを実行すると、記事の先頭のGIF動画のように、ツールチップからドロワーを開くことができます。

開いたページはドロワーなので、ドロワーを閉じたときにダイアログ・クローズのイベントが発生します。

Graph Visualization Plug-inのリージョンに静的IDとして、例えばGRAPHVIZを設定します。


URLの取得時に呼び出すAPEX_PAGE.GET_URLの引数p_triggering_elementに、上記の静的IDをセレクタとした#GRAPHVIZを渡すと、ダイアログのクローズ時に動的アクションを実行できます。
    /*
    * p_pageに開くページのページ名、p_itemsに主キーのアイテム名を指定する。
    */
    l_url := apex_page.get_url(
        p_page => 'employee-detail'
        ,p_items => 'P2_EMPLOYEE_ID'
        ,p_values => APEX_APPLICATION.G_X01
        ,p_triggering_element => '#GRAPHVIZ'
    );
しかし、Graph Visualization Plug-inにはリージョンをリフレッシュするメソッドが未実装(に見える)なため、ダイアログ・クローズにイベントを受け取ってもグラフを更新できません。

操作感は良くありませんが、リージョンをリフレッシュする代わりにwindow.location.reload()を呼び出すことで、グラフを更新することができます。


今回の記事は以上になります。

今回作成したAPEXアプリケーションのエクスポートを以下に置きました。
https://github.com/ujnak/apexapps/blob/master/exports/sample-graph-visualization-with-drilldown.zip

Oracle APEXのアプリケーション作成の参考になれば幸いです。

完

2023年4月7日金曜日

PGQLを使ったAPEXアプリを23cのSQL Property Graphで置き換えてみる

PGQLをトランスレートして生成したSQLをレポートのソースとした、Oracle APEXのアプリケーションを作成したことがあります。

PGQLの2層モードで生成されるSQLをAPEXのレポートに組み込む

Oracle Database 23cよりSQL/PGQ(Property Graph Queries)がサポートされ、グラフ形式のデータを直接扱うことができるようになりました。

以前の記事で作成したAPEXアプリケーションを、SQL/PGQを使うように見直してみます。

使用するのはこちらの記事で作成した、Oracle Database 23c FreeにOracle APEX 22.2をインストールした環境です。Oracleが提供しているVirtualBoxのAPEXを日本語化した環境でも同様に作業ができるでしょう。

ワークスペースとしてAPEXDEV(紐づいているスキーマもAPEXDEV)が作成されていることを前提とします。ワークスペースやスキーマ名が異なる場合は、APEXDEVの部分を置き換えてください。

最初にスキーマAPEXDEVにSQL Property Graphを扱う権限を与えます。

4.1.5 Granting System and Object Privileges for SQL Property Graphs
GRANT CREATE PROPERTY GRAPH, CREATE ANY PROPERTY GRAPH, 
      ALTER ANY PROPERTY GRAPH, DROP ANY PROPERTY GRAPH, 
      READ ANY PROPERTY GRAPH TO APEXDEV;

ユーザーsystemで接続し、スキーマAPEXDEVに権限を与えます。

[oracle@apex ~]$ sqlplus system/********@localhost/freepdb1


SQL*Plus: Release 23.0.0.0.0 - Developer-Release on Fri Apr 7 15:34:54 2023

Version 23.2.0.0.0


Copyright (c) 1982, 2023, Oracle.  All rights reserved.


Last Successful login time: Fri Apr 07 2023 15:34:44 +09:00


Connected to:

Oracle Database 23c Free, Release 23.0.0.0.0 - Developer-Release

Version 23.2.0.0.0


SQL> GRANT CREATE PROPERTY GRAPH, CREATE ANY PROPERTY GRAPH, 

      ALTER ANY PROPERTY GRAPH, DROP ANY PROPERTY GRAPH, 

      READ ANY PROPERTY GRAPH TO APEXDEV;  2    3  


Grant succeeded.


SQL> exit

Disconnected from Oracle Database 23c Free, Release 23.0.0.0.0 - Developer-Release

Version 23.2.0.0.0

[oracle@apex ~]$ 


元記事ではSQLclでPGQLを使用するために、色々な作業を行っています。SQL Property Graphを使う場合は、これらの作業は不要です。

以下のSQLを実行し、頂点であるアカウントとエッジであるトランザクションを保存する表を作成します。表SQLCL_BANK_ACCTS、SQLCL_BANK_TXNSは元記事とまったく同じ表です。



作成した表にテスト・データを投入するために、ユーティリティのデータ・ジェネレータを使用します。

データ・ジェネレータでの作業も元記事とまったく同じです。同じ手順を記載するのは冗長になるため、テスト・データの準備については元記事を参照してください。


データ・ジェネレータによるテスト・データの投入が完了したところから継続します。

SQLコマンドより、表SQLCL_BANK_ACCTSに投入されたデータを確認します。

select count(*) from sqlcl_bank_accts;


表SQLCL_BANK_TXNSに投入されたデータを確認します。

select count(*) from sqlcl_bank_txns;


テスト・データより、送金元と送金先が同じ行を削除します。

delete from sqlcl_bank_txns where from_acct_id = to_acct_id;


以上でテスト・データの準備が完了しました。

この表を元にプロパティ・グラフSQLCL_BANK_GRAPHを作成します。



元記事で作成したAPEXアプリケーションをインポートします。
https://github.com/ujnak/apexapps/blob/master/exports/pgql-reports.zip

インポートしたアプリケーションを編集します。

ページ番号2のPGQL1のレポートのソースを以下に変更します。
select acct_id, count(*) as NumDeposits
from graph_table(sqlcl_bank_graph
    match
    (m is account) -[e is transfer] ->(v is account)
    columns (v.acct_id)
)
group by acct_id
order by NumDeposits desc
fetch first :P2_ROWS rows only;

ページを実行すると、以下のように表示されます。


PGQLより生成したSQLをSQL/PGQを使うように置き換えます。マニュアルの主な参照箇所は以下になります。

5 SQL GRAPH_TABLE Queries

ページ番号3のPGQL2のレポートのソースは、以下に変更します。
select from_acct_id, amount, to_acct_id, description
from graph_table(sqlcl_bank_graph
    match
    (s is account where s.acct_id member of apex_string.split_numbers(:P3_ACCT_IDS,',')) -[e is transfer]->(d is account)
    columns (s.acct_id as from_acct_id, e.amount as amount, d.acct_id as to_acct_id, e.description as description)
);

ページを実行すると、以下のように表示されます。


 PGQLからSQLを生成してレポートに組み込むより、はるかに簡単にグラフ構造のデータを活用できるようになっています。

現時点(バージョン22.2)のOracle APEXには、グラフを描画する標準のコンポーネントはありません。地理空間情報に対応しているマップ・リージョンのように、グラフ構造のデータについても専用のリージョンが提供されると、もっとグラフの使い勝手が良くなることが期待されます。

今回の変更を加えたAPEXアプリケーションのエクスポートを以下に置きました。
https://github.com/ujnak/apexapps/blob/master/exports/sqlpgq-report.zip

Oracle APEXのアプリケーション作成の参考になれば幸いです。

完

2023年1月31日火曜日

APEXでCytoscape.jsを使ってみる

 以前にグラフ問合せを扱った記事を書いたことがありますが、問い合わせの結果をレポート、つまり表形式で印刷していました。それではイマイチなので、APEXでCytoscape.jsを使う方法を確認してみました。

Cytoscape.jsのページに記載されているGetting startedをAPEXのアプリケーションとして実装してみました。Getting Startedをそのまま埋め込むのではなく、アプリケーションのサンプルとして役立つように以下の実装を加えています。

  1. elementsとstyleは静的なJSONファイルではなく、サーバー側で生成した値を使う。
  2. ページ・ロード時にグラフを描画するのではなく、ブラウザのイベントより(今回はボタンの押下)生成する。
作成したアプリケーションは以下のように動作します。


簡単なアプリケーションですが、以下に実装を紹介します。

最初に空のアプリケーションを作成します。実装はホーム・ページに行います。

ページ・プロパティのJavaScriptのファイルURLとして、Cytoscape.jsを指定します。バージョンなどは変わるため、実装時はCytoscape.jsのホームページよりリンクを取得してください。

https://unpkg.com/cytoscape@3.23.0/dist/cytoscape.min.js

グラフを描画する領域を作成します。

新規にリージョンを作成します。

作成したリージョンの識別のタイトルはCytoscape、タイプは静的コンテンツとします。ソースのHTMLコードとして以下を記述します。

<div id="cy"></div>

装飾は不要なので、外観のテンプレートとしてBlank with Attributesを選択します。

HTMLコードとして記述したid="cy"のDIV要素にCytoscapeによるグラフが描画されます。描画領域をCSSで指定します。

ページ・プロパティのCSSのインラインに以下を記述します。

#cy {
  width: 300px;
  height: 300px;
  display: block;
}

サーバー側でグラフのデータを生成するプロセスを作成します。

データを生成するプロセスはAjaxコールバックとして作成します。

識別の名前はGET_DATAとします。タイプとしてコードの実行を選択し、ソースのPL/SQLコードとして以下を記述します。Getting Startedに記述されているelementsとstyleと同じデータを出力しています。




Cytoscape.jsを呼び出してグラフを描画する処理は、APEXアクションとして実装します。

JavaScriptのファンクションおよびグローバル変数の宣言に、以下を記述します。


また、ページ・ロード時に実行に以下の1行を記述します。

apex.actions.add([RENDER_CY]);


作成したアクションrender-cyを呼び出すボタンを作成します。

リージョンCytoscapeにボタンを作成します。

識別のボタン名をRENDER、ラベルをRenderとします。レイアウトの位置としてNextを選びます。

動作のアクションとして動的アクションで定義を選択し、詳細のカスタム属性として以下を記述します。

data-action="#action$render-cy"


以上で完成です。作成したアプリケーションを実行すると、記事の先頭のGIF動画のような動作をします。

今回作成したAPEXアプリケーションのエクスポートを以下に置きました。
https://github.com/ujnak/apexapps/blob/master/exports/cytoscape-sample.zip

Oracle APEXのアプリケーション作成の参考になれば幸いです。

完