On this page
F.9. cube
该模块实现了用于表示多维数据集的数据类型cube
。
F.9.1. Syntax
Table F.2显示cube
类型的有效外部表示形式。 * x
, y
*等,表示浮点数。
表 F.2.多维数据集外部表示
External Syntax | Meaning |
---|---|
x |
一维点(或零长度一维间隔) |
(x) |
同上 |
x1,x2,...,xn |
n 维空间中的一个点,内部表示为零体积的多维数据集 |
(x1,x2,...,xn) |
同上 |
(x),(y) |
一维间隔,起始于* x ,终止于 y *,反之亦然;Sequences 没关系 |
[(x),(y)] |
同上 |
(x1,...,xn),(y1,...,yn) |
一个 n 维立方体,由一对对角相对的角表示 |
[(x1,...,xn),(y1,...,yn)] |
同上 |
Importing 多维数据集的对角的 Sequences 无关紧要。如果需要,cube
函数会自动交换值以创建统一的“左下-右上”内部表示形式。当拐角重合时,cube
仅存储一个拐角以及“ is point”标志,以避免浪费空间。
Importing 时忽略空格,因此[(x),(y)]
与[ ( x ), ( y ) ]
相同。
F.9.2. Precision
值在内部存储为 64 位浮点数。这意味着有效数字超过约 16 的数字将被截断。
F.9.3. Usage
Table F.3显示为类型cube
提供的运算符。
表 F.3.多维数据集运算符
Operator | Result | Description |
---|---|---|
a = b |
boolean |
立方体 a 和 b 是相同的。 |
a && b |
boolean |
立方体 a 和 b 重叠。 |
a @> b |
boolean |
立方体 a 包含立方体 b。 |
a <@ b |
boolean |
立方体 a 包含在立方体 b 中。 |
a < b |
boolean |
立方体 a 小于立方体 b。 |
a <= b |
boolean |
立方体 a 小于或等于立方体 b。 |
a > b |
boolean |
立方体 a 大于立方体 b。 |
a >= b |
boolean |
立方体 a 大于或等于立方体 b。 |
a <> b |
boolean |
立方体 a 不等于立方体 b。 |
a -> n |
float8 |
获取* n *立方体的第-个坐标(从 1 开始计数)。 |
a ~> n |
float8 |
通过以下方式获取* n * -th 多维数据集的坐标:n = 2 * k-1 表示* k * -th 维度的下限,n = 2 * k 表示* k * -th 维度的上限。负* n *表示相应正坐标的倒数值。该运算符专为 KNN-GiST 支持而设计。 |
a <-> b |
float8 |
a 和 b 之间的欧几里得距离。 |
a <#> b |
float8 |
a 和 b 之间的出租车(L-1 公制)距离。 |
a <=> b |
float8 |
a 和 b 之间的切比雪夫(L-inf 度量)距离。 |
(在 PostgreSQL 8.2 之前,容器运算符@>
和<@
分别称为@
和~
.这些名称仍然可用,但已过时,最终将被淘汰.请注意,旧名称与惯例相反,以前是约定,之后是核心几何数据类型!)
标量排序运算符(<
,>=
等)对于排序实际意义不大。这些运算符首先比较第一个坐标,如果相等,则比较第二个坐标,依此类推。它们主要用于支持cube
的 b 树索引运算符类,例如,如果您希望对cube
列。
cube
模块还为cube
值提供了 GiST 索引运算符类。 cube
GiST 索引可用于在WHERE
子句中使用=
,&&
,@>
和<@
运算符搜索值。
另外,可以使用ORDER BY
子句中的度量运算符<->
,<#>
和<=>
来使用cube
GiST 索引来查找最近的邻居。例如,可以有效地找到 3-D 点的最接近邻居(0.5、0.5、0.5):
SELECT c FROM test ORDER BY c <-> cube(array[0.5,0.5,0.5]) LIMIT 1;
~>
运算符也可以这种方式用于有效地检索按所选坐标排序的前几个值。例如,要获得按第一个坐标(左下角)升序排列的前几个多维数据集,可以使用以下查询:
SELECT c FROM test ORDER BY c ~> 1 LIMIT 5;
并获得按右上角第一个坐标降序排列的二维立方体:
SELECT c FROM test ORDER BY c ~> 3 DESC LIMIT 5;
Table F.4显示可用功能。
表 F.4.多维数据集功能
Function | Result | Description | Example |
---|---|---|---|
cube(float8) |
cube |
使两个坐标相同的一维立方体。 | cube(1) == '(1)' |
cube(float8, float8) |
cube |
制作一维立方体。 | cube(1,2) == '(1),(2)' |
cube(float8[]) |
cube |
使用数组定义的坐标制作零体积的多维数据集。 | cube(ARRAY[1,2]) == '(1,2)' |
cube(float8[], float8[]) |
cube |
使用两个数组定义的具有右上和左下坐标的多维数据集,它们的长度必须相同。 | cube(ARRAY[1,2], ARRAY[3,4]) == '(1,2),(3,4)' |
cube(cube, float8) |
cube |
通过在现有多维数据集上添加一个维度来创建新多维数据集,新坐标的两个端点的值都相同。这对于根据计算值逐个构建多维数据集很有用。 | cube('(1,2),(3,4)'::cube, 5) == '(1,2,5),(3,4,5)' |
cube(cube, float8, float8) |
cube |
通过在现有多维数据集上添加维度来创建新多维数据集。这对于根据计算值逐个构建多维数据集很有用。 | cube('(1,2),(3,4)'::cube, 5, 6) == '(1,2,5),(3,4,6)' |
cube_dim(cube) |
integer |
返回多维数据集的维数。 | cube_dim('(1,2),(3,4)') == '2' |
cube_ll_coord(cube, integer) |
float8 |
返回多维数据集左下角的* n * -th 坐标值。 |
cube_ll_coord('(1,2),(3,4)', 2) == '2' |
cube_ur_coord(cube, integer) |
float8 |
返回多维数据集右上角的* n * -th 坐标值。 |
cube_ur_coord('(1,2),(3,4)', 2) == '4' |
cube_is_point(cube) |
boolean |
如果多维数据集是一个点,即两个定义的角相同,则返回 true。 | |
cube_distance(cube, cube) |
float8 |
返回两个立方体之间的距离。如果两个立方体都是点,则这是正常距离函数。 | |
cube_subset(cube, integer[]) |
cube |
使用数组中的维度索引列表,从现有的多维数据集中创建一个新的多维数据集。可用于提取单个维度的端点,或删除维度,或根据需要对它们进行重新排序。 | cube_subset(cube('(1,3,5),(6,7,8)'), ARRAY[2]) == '(3),(7)' cube_subset(cube('(1,3,5),(6,7,8)'), ARRAY[3,2,1,1]) == '(5,3,1,1),(8,7,6,6)' |
cube_union(cube, cube) |
cube |
产生两个立方体的并集。 | |
cube_inter(cube, cube) |
cube |
产生两个立方体的交集。 | |
cube_enlarge(c cube, r double, n integer) |
cube |
在至少* n 尺寸上以指定的半径 r 增加立方体的大小。如果半径为负,则缩小立方体。所有定义的尺寸都会通过半径 r 进行更改。左下角的坐标减小 r ,右上角的坐标增大 r 。如果左下角坐标增加到大于相应的右上角坐标(这仅在 r < 0) than both coordinates are set to their average. If * n * is greater than the number of defined dimensions and the cube is being enlarged ( * r * >0 0 时发生),则将添加额外的尺寸以使 n *一起; 0 用作额外坐标的初始值。此功能对于在点周围创建边界框以搜索附近的点很有用。 |
cube_enlarge('(1,2),(3,4)', 0.5, 3) == '(0.5,1.5,-0.5),(3.5,4.5,0.5)' |
F.9.4. Defaults
我相信这个 union:
select cube_union('(0,5,2),(2,3,1)', '0');
cube_union
-------------------
(0, 0, 0),(2, 5, 2)
(1 row)
不违背常识,交集也不矛盾
select cube_inter('(0,-1),(1,1)', '(-2),(2)');
cube_inter
-------------
(0, 0),(1, 0)
(1 row)
在对不同维度的多维数据集进行的所有二进制运算中,我都将维数较低的一个假定为笛卡尔投影,即。例如,在字符串表示形式中使用零代替坐标。以上示例等效于:
cube_union('(0,5,2),(2,3,1)','(0,0,0),(0,0,0)');
cube_inter('(0,-1),(1,1)','(-2,0),(2,0)');
以下包含谓词使用点语法,而实际上第二个参数在内部由一个框表示。这种语法使得不必为(box,point)谓词定义单独的点类型和函数。
select cube_contains('(0,0),(1,1)', '0.5,0.5');
cube_contains
--------------
t
(1 row)
F.9.5. Notes
有关用法的示例,请参见回归测试sql/cube.sql
。
为了使人们更难以 break 事物,多维数据集的维数限制为 100.如果您需要更大的设置,请在cubedata.h
中设置。
F.9.6. Credits
原作者:吉恩·塞尔科夫(Gene Selkov,Jr. <selkovjr@mcs.anl.gov>
),阿贡国家实验室 math 和计算机科学系。
我主要感谢 Joe Hellerstein 教授(http://db.cs.berkeley.edu/jmh/)阐明了 GiST(http://gist.cs.berkeley.edu/)的要旨,并感谢他的前学生 Andy Dong 为 Illustra 编写的示例。我也感谢所有 Postgres 开发人员,无论现在还是过去,使我能够创建自己的世界并在其中不受干扰地生活。我还要感谢 Argonne 实验室和美国能源部多年来对数据库研究的忠实支持。
Bruno Wolff III <bruno@wolff.to>
在 2002 年 8 月/ 9 月对该包进行了较小的更新。这些更新包括将精度从单精度更改为双精度,并添加了一些新功能。
Joshua Reich <josh@root.net>
在 2006 年 7 月进行了其他更新。这些更新包括cube(float8[], float8[])
并清理代码以使用 V1 调用协议而不是已弃用的 V0 协议。