本モジュールは線セグメント、浮動小数点間隔を表現するsegデータ型を実装します。 segは間隔の終端内の不確定性を表すことができ、特に実験計測の表現に有用です。
計測の幾何は数値の連続におけるものより通常より複雑です。 計測は通常、多少あいまいな制限を持つ連続の部分部分となります。 不確実性と不規則性のため、さらに、プロテインを安定させる温度範囲など計測される値は本質的に何らかの状態を示す間隔となる可能性があるため、計測は間隔として表れます。
一般的な見方を使うと、こうしたデータは値の組合せではなく間隔としてデータを格納する方が便利なようです。 実際、ほとんどのアプリケーションでより効率的であると判明してさえいます。
一般的な見方をさらに進めると、制限の曖昧さは、伝統的な数値データ型を使用することで情報がある程度損失してしまうことを暗示しています。 これを考えてみましょう。 計測機器で6.50と読み取り、読み取ったデータをデータベースに格納します。 それを取り出す時にどうなるでしょう。 見てみましょう。
test=> select 6.50 :: float8 as "pH"; pH --- 6.5 (1 row)
計測という世界では6.50は6.5と同じではありません。 時としてこれが致命的な違いになる場合があります。 実験者は信頼する桁を書き出し(公開し)ます。 6.50は実質それ以上の値を含むあいまいな間隔であり、(おそらく)その分布におけるもっとも特徴的なものを中央値として持つ6.5という間隔よりもあいまいです。 私達は厳密にこうした異なるデータ項目が同じものとして現れることを好みません。
まとめ? 任意の可変精度を持つ間隔の制限を記録できる特別なデータ型を持つことは素晴らしいことでしょう。 変数はある意味、各データ要素が独自の精度を持ちます。
以下を見てください。
test=> select '6.25 .. 6.50'::seg as "pH"; pH ------------ 6.25 .. 6.50 (1 row)
間隔の外部表現は、1つまたは2つの浮動小数点値を範囲演算子(..または...)で結び付けた形になります。 他にも、中央値と正負の偏差として指定することも可能です。 省略可能な確実性指示子(<、>、~)を格納することもできます。 (しかし、確実性指示子はすべての組込みの演算子で無視されます。)
下表では、x、y、deltaは浮動小数点数値を表します。 delta以外のxとyの前に確実性指示子を付与することができます。
表 F-31. seg外部表現
x | 単一値(幅0の間隔) |
x .. y | xからyまでの間隔 |
x (+-) delta | x - deltaからx + deltaまでの間隔 |
x .. | 下限値xを持つ閉じていない間隔 |
.. x | 上限値xを持つ閉じていない間隔 |
表 F-32. 有効なSEG入力の例
5.0 | 幅0のセグメントを作成します(こうすると点になります)。 |
~5.0 | 幅0のセグメントを作成し、データ内に~を記録します。 ~はseg型の演算では無視されますが、コメントとして保持されます。 |
<5.0 | 5.0という点を作成します。 <は無視されますが、コメントとして保持されます。 |
>5.0 | 5.0という点を作成します。 >は無視されますが、コメントとして保持されます。 |
5(+-)0.3 | 4.7 .. 5.3という間隔を作成します。 (+-)という記述は保持されないことに注意してください。 |
50 .. | 50以上のすべて |
.. 0 | 0以下のすべて |
1.5e-2 .. 2E-2 | 0.015 .. 0.02という間隔を作成します |
1 ... 2 | 1...2、1 .. 2、1..2と同じです(範囲演算子前後の空白は無視されます)。 |
データソースで...が広く使用されるため、..の代わりの綴りとして許可されています。 残念なことにこれにより解析上の曖昧性が生じました。 0...23の上限が23なのか0.23なのかが明確ではありません。 これは、segの入力において、少なくとも1つの桁を数値内の小数点の前に書くことを要求することで解決されます。
健全性検査としてsegは、5 .. 2のような、下限値が上限値より大きな間隔を拒絶します。
内部的にseg値には32ビット浮動小数点数値の組合せが格納されます。 これは7桁以上の有効桁を持つ数値が切り詰められることを意味します。
有効桁が正確に7桁、または7桁未満の数値は元の精度が保たれます。 つまり、問い合わせが0.00を返す場合、最後の0が書式付けのための誤差にならないことが確実です。 これは元のデータの精度を反映します。 最初から続く0は精度の影響を受けません。 0.0067は2有効桁のみを持つものと考えられます。
segモジュールにはseg値用のGiSTインデックス演算子クラスが含まれます。 GiST演算子クラスでサポートされる演算子には以下があります。
[a, b] << [c, d] Is left of
[a, b]が完全に[c, d]の左側に存在します。 つまり、つまり、b <cならば[a, b] << [c, d]は真です。 さもなくば偽です。
[a, b] >> [c, d] Is right of
[a, b]が完全に [c, d]の右側に存在します。 a > dならば[a, b] >> [c, d]は真、さもなくば偽です。
[a, b] &< [c, d] Overlaps or is left of
これは"右側にはみださない"ととらえた方がいいかもしれません。 b <= dならば真です。
[a, b] &> [c, d] Overlaps or is right of
これは"左側にはみださない"ととらえた方がいいかもしれません。 a >= cならば真です。
[a, b] = [c, d] Same as
セグメント[a, b]と [c, d]が同一、つまり、a == bかつc == dです。
[a, b] && [c, d] Overlaps
セグメント[a, b]と[c, d]に重なりがあります。
[a, b] @> [c, d] Contains
セグメント[a, b]はセグメント[c, d]を含有します。つまり、a <= cかつb >= dです。
[a, b] <@ [c, d] Contained in
セグメント[a, b]はセグメント[c, d]に含有されます。つまり、a >= cかつb <= dです。
(PostgreSQL 8.2以前では、含有演算子@>および<@はそれぞれ@および~という名前でした。 以前の名前もまだ利用できますが、廃止予定であり、いずれなくなります。 以前の名前は、コアの幾何データ型で以前従っていた規約と反対であることに注意してください。)
以下の例のように、標準B-Tree演算子も提供されます。
[a, b] < [c, d] Less than [a, b] > [c, d] Greater than
これらの演算子はソート以外の実用的な目的に対して大きな意味を持ちません。 これらの演算子はまず(a)と(c)を比べ、等しければ(b)と(d)を比べます。 論理的にはほとんどの場合優れたソート処理と思えます。 こうした型をORDER BYで使用したい場合に有用です。
使用方法の例はリグレッション試験のsql/seg.sqlを参照してください。
(+-)を通常の範囲に変換する機構は、境界で有効な桁数を徹底するという点で完全に正確ではありません。 例えば以下のように、結果の間隔に10の冪乗が含まれる場合、下限値に余計な桁を追加します。
postgres=> select '10(+-)1'::seg as seg; seg --------- 9.0 .. 11 -- should be: 9 .. 11
R-Treeインデックスの性能は入力値の初期の順序に大きく依存する可能性があります。 seg列で入力テーブルをソートすることは非常に役に立つでしょう。 例としてsort-segments.plスクリプトを参照してください。
原作者:Gene Selkov, Jr. <selkovjr@mcs.anl.gov>
,
Mathematics and Computer Science Division, Argonne National Laboratory.
GiST (http://gist.cs.berkeley.edu/)の要旨(gist)を説明していただいたJoe Hellerstein博士に感謝します。 また、自分の世界を作成できるようにし、静かに生活できるようにしてもらった、過去から現在までのすべてのpostgres開発者に感謝します。 データベース研究に長年誠実にサポートしてくれたArgonne LabとU.S. Department of Energyにも感謝します。