isql コマンドライン・インタフェースから Virtuoso を使ってみる

概要

OpenLink Virtuosoは,リレーショナル,グラフ,文書などの多様なデータモデルを一つのシステムで管理できるデータベース管理システム(マルチモデルデータベース)である.異なる形式のデータソースを一つに見せる仮想的な統合(データ仮想化)を実現する.HTTP,ODBC,JDBCといった標準的な接続方式に対応し,SQLによるリレーショナルデータの操作と,SPARQLによるWebデータの検索が可能である.

このページでは,isql のコマンドライン・インタフェースを使った基本的なデータベース操作を,具体的な手順とともに説明する.テーブルの定義から,データの挿入・問い合わせ・更新・削除,一貫性制約の確認までを順に扱う.

公式ページ: https://virtuoso.openlinksw.com/

目次

関連する外部ページ

Virtuosoの機能と使い方の詳細は,公式ドキュメントを参照.isql(Interactive SQL)の詳細は,Interactive SQL Utilityを参照.

サイト内の関連情報

1. このWebページの学習目標と内容

2. 環境設定と準備作業

Virtuosoのインストール手順(Ubuntu環境)

インストールするには,ターミナルで次のコマンドを実行する.

sudo apt -y install virtuoso-opensource

Virtuosoの詳しい使い方と機能は,公式ドキュメントを参照.

3. isqlの起動と基本操作

isqlの起動手順

isqlの機能と使い方の詳細は,公式ドキュメントを参照.次のコマンドで起動する(isql-vt はVirtuoso用のisqlクライアントである).

isql-vt

ヘルプ機能の利用方法

help;」を実行すると,isqlで使えるコマンドの一覧が表示される.

isqlの終了手順

exit;」を実行すると,isqlを終了する.

4. SQLを用いたテーブル定義と一貫性制約の実装

SQLを使い,order_recordsテーブルの構造と一貫性制約を定義する.

リレーショナル・スキーマ (relational schema): order_records(id, year, month, day, customer_name, product_name, unit_price, qty)

  1. 次のSQL文を実行し,テーブルを作成する.
    
    create table order_records (
        id            INTEGER  PRIMARY KEY not null,
        year          INTEGER  not null CHECK ( year > 2008 ),
        month         INTEGER  not null CHECK ( month >= 1 AND month <= 12 ),
        day           INTEGER  not null CHECK ( day >= 1 AND day <= 31 ),
        customer_name VARCHAR  not null,
        product_name  VARCHAR  not null,
        unit_price    REAL     not null CHECK ( unit_price > 0 ),
        qty           INTEGER  not null DEFAULT 1 CHECK ( qty > 0 ),
        created_at    DATETIME not null,
        updated_at    DATETIME,
        CHECK ( ( unit_price * qty ) < 200000 ) );
    

5. テーブルへのデータ挿入手順

order_recordsテーブルに具体的なデータを登録する.次の手順で進める.

  1. SQLコマンドの実行

    「insert into ...」文でデータを挿入する.

    insert into order_records values( 1, 2022, 10, 26,  'kaneko',   'orange A', 1.2, 10, now(), NULL );
    insert into order_records values( 2, 2022, 10, 26,  'miyamoto', 'Apple M',  2.5, 2,  now(), NULL );
    insert into order_records values( 3, 2022, 10, 27,  'kaneko',   'orange B', 1.2, 8,  now(), NULL );
    insert into order_records values( 4, 2022, 10, 28,  'miyamoto', 'Apple L',  3,   1,  now(), NULL );
    

    now()関数を使うと,システムの現在日時がDATETIME型(YYYY-MM-DD HH:MM:SS形式)で設定される.

    トランザクション制御には,次のコマンドを使える.
    • set autocommit off;
    • commit work;
    • rollback work;
  2. データ挿入結果の確認
    SELECT * FROM order_records;
    
insert into文には次の2つの書き方がある.

* すべての属性値を,テーブル定義の順に指定する方式.

insert into order_records values( 1, 2022, 10, 26,  'kaneko', 'orange A', 1.2, 10, now(), NULL );

* 挿入する属性を明示的に指定する方式.

この方式では,指定しなかった属性には,テーブル定義時のデフォルト値が適用される.

insert into order_records (id, year, month, day, customer_name, product_name, unit_price, qty, created_at) values( 2, 2022, 10, 26,  'miyamoto', 'Apple M',  2.5, 2, now() );

6. 一貫性制約違反の検証

データベース管理システムは,定義された一貫性制約を監視し,違反する操作を検出して拒否する.以下に検証例を示す.

主キー制約の検証(PRIMARY KEY)

insert into order_records values( 3, 2022, 10, 30, 'kaneko', 'banana', 10, 3, now(), NULL );

* 属性idの値3はすでに存在するため,主キー制約「PRIMARY KEY」に違反し,挿入は拒否される.

非NULL制約の検証(not null)

insert into order_records values( 3, 2022, 10, 30,  NULL, 'melon', 10, 3, now(), NULL );

* 属性customer_nameには非NULL制約「not null」が定義されているため,NULL値の設定は許可されない.

データ整合性制約の検証

制約違反の検証例

insert into order_records values( 6, 1009, 10, 30,  'kaneko', 'melon', 10, 3, now(), NULL );

* 年度の制約「CHECK ( year > 2008 )」に違反するため,挿入は拒否される.

複合制約違反の検証

insert into order_records values( 7, 2022, 10, 31,  'kaneko', 'strawberry', 4.6, 100000, now(), NULL );

* 総額の制約「CHECK ( ( unit_price * qty ) < 200000 )」に違反するため,挿入は拒否される.

7. SQL問い合わせの実行と結果確認

ここでは,よく使うSQL問い合わせの例を示す.より高度なSQL問い合わせは,別ページで解説している.ここでは,テーブルの内容を確認する方法に焦点を当てる.

全データの表示

SELECT * FROM order_records;