首页 > Berkeley DB, Linchun Sun, SQL > BerkeleyDB 11gR2的R-Tree功能

BerkeleyDB 11gR2的R-Tree功能

2010年4月20日 linchunsun

1 背景

R-Tree是一种和BTree类似的数据结构,支持高维数据的快速检索,被广泛应用于各种空间数据中。R-Tree的一个典型的应用是从许多空间对象的信息中找出用户关心的那个。如给定一座城市各个建筑物的经纬度坐标并存储于R-Tree中,用户可以通过“查找当前位置向西五公里内的所有餐厅”,“查找会展中心方圆一公里内的所有汽车站”等方式来查询自己感兴趣的某些特定建筑。

2 BDB11gR2的R-Tree功能

新发布的BerkeleyDB 11gR2(以下简称BDB11gR2)版本能够无缝地兼容SQLite的接口,从而支持各种基于SQLite的应用,包括SQLite自带R-Tree扩展应用。关于SQLite的R-Tree细节,可参见http://www.sqlite.org/rtree.html
下面,本文将从编译和使用两方面,介绍如何在BDB11gR2中使用R-Tree功能。

2.1 编译

BDB11gR2通过编译开关控制是否启用R-Tree功能。默认情况下,BDB11gR2是不启用R-Tree的。要获得R-Tree的支持,则应该在编译时加上SQLITE_ENABLE_RTREE标志。

Linux平台

cd build_unix
../dist/configure CPPFLAGS=-DSQLITE_ENABLE_RTREE --enable-sql
make dbsql

Windows平台

在工程文件的属性中,选择 Properties -> Configuration Properties -> c/c++ -> Command Line -> Additional Options, 加入/D DSQLITE_ENABLE_RTREE,并重新编译工程。

2.2 使用R-Tree

一棵R-Tree实际上对应于一张虚拟表。建立R-Tree索引的过程,实际上就是建立虚拟表的过程。和普通表类似的,我们也可以对这张特殊的虚拟表进行插入,删除,更新等操作。

我们以下面这张图为例来说明R-Tree的典型操作和应用。

"rtree-pic"

在图1中,有三个蓝色的矩形,代表三个建筑的边界,标记为1,2,3。它们的坐标信息如图所示。我们要建立一棵R-Tree,来存储这些矩形的坐标信息,并在此基础上进行一些简单的查询。

建立R-Tree索引

CREATE VIRTUAL TABLE demo_index USING rtree(
id,
minX, maxX,
minY, maxY
);

以上操作建立了一张R-Tree索引表。该索引表中每一条记录代表了一个矩形框。每条记录由5列组成,其中id是一个整数类型的主键,minX,maxX分别代表矩形框横坐标的最小值和最大值,minY,maxY分别代表矩形框纵坐标的最小值和最大值。注意,BDB11gR2中的R-Tree表的列数必须是3-11之间的基数,其中第一列是表的主键,2k和2k+1列分别代表第k维数据的下界和上界(k=1~5).

插入数据

向R-Tree的表中插入数据,和向普通表中插入数据的语法是完全一致的。
以下三条语句插入了图1中的三个矩形:

INSERT INTO demo_index VALUES(
1,
0, 2,
0, 1
);
INSERT INTO demo_index VALUES(
2,
3, 5,
3, 5
);
INSERT INTO demo_index VALUES(
3,
4, 5,
1, 4
);

基于R-Tree的查询

和普通表类似的,用户卡可以对R-Tree表进行查询。如

SELECT id FROM demo_index
WHERE id=1;

但R-Tree表上更为常用和典型的查询则是范围查询(Range-Query). 举例如下:

SELECT id FROM demo_index
WHERE minX>=0 AND maxX<=3
AND minY>=0 AND maxY<=2;

查询的结果为
1

上面这条查询的含义是找出图1中所有被包含在红色虚线矩形框中的矩形。

SELECT id FROM demo_index
WHERE maxX>=1 AND minX<=4
AND maxY>=0 AND minY<=4;
查询结果为
1
2

上面这条查询的含义是找出图1中所有和黑色虚线矩形框有交集的矩形。

总结

R-Tree在高维数据的检索中有着广泛的应用。各种地理信息,带时间记录的归档信息等,都可以通过建立基于R-Tree的索引,来达到快速检索的目的。欢迎通过使用Berkeley DB11gR2的RTree功能来构建自己的R-Tree索引,若有任何相关问题,请联系  Linchun dot sun at Oracle dot com。

建立R-Tree索引

CREATE VIRTUAL TABLE demo_index USING rtree(
   id,               
   minX, maxX,       
   minY, maxY        
);
以上操作建立了一张R-Tree索引表。该索引表一共由5列组成,每一条记录代表了一个矩形框。其中id是一个整数类型的主键,minXmaxX分别代表矩形框横坐标的最小值和最大值,minYmaxY分别代表矩形框纵坐标的最小值和最大值。注意,r-tree的列数n必须为2m+1,其中m为表示对象的维数。
 
插入数据
R-Tree的表中插入数据,和往普通表中插入数据的语法是完全一致的。
以下三条语句插入了图1中的三个矩形:
INSERT INTO demo_index VALUES(
1,                   
0, 2,  
0, 1     
);
INSERT INTO demo_index VALUES(
    2,
    3, 5,
    3, 5
);
INSERT INTO demo_index VALUES(
    3,
    4, 5,
    1, 4
);
 
 
基于R-Tree的查询
和普通表类似的,用户卡可以对R-Tree表进行查询。如
SELECT id FROM demo_index
 WHERE id=1;
 
R-Tree表上更为常用和典型的查询则是范围查询(Range-Query). 
 
SELECT id FROM demo_index     
 WHERE minX>=0 AND maxX<=3
   AND minY>=0 AND maxY<=2;
 
查询的结果为
1
这条查询的含义是找出图1中所有被包含在红色虚线矩形框中的矩形。
SELECT id FROM demo_index     
 WHERE maxX>=1 AND minX<=5
   AND maxY>=0 AND minY<=4;
查询结果为
1
2
3
这条查询的含义是找出图2中所有和黑色虚线矩形框有交集的矩形。
分类: Berkeley DB, Linchun Sun, SQL 标签: , , ,
  1. tangmi
    2010年12月30日18:07 | #1

    您好:请问最新的Java版je-4.1.6支持R-Tree吗?

  2. taozhang
    2010年12月31日11:09 | #2

    tangmi:

    你好!BDB JE现在不支持R-Tree,但是BDB Core支持。

本文的评论功能被关闭了.
Դ