使用Nebulagraph数据库探索地理空间数据
#database #datascience #nosql #graphdatabase

什么是地理空间数据?

地理空间数据是与地理空间实体有关的信息,例如点,线和多边形。

Nebulagraph 2.6支持地理空间数据。您可以在Nebulagraph中存储,计算和检索地理空间数据。地理是Nebulagraph支持的数据类型。它由代表地理空间数据的纬度和经度组成。

如何在Nebulagraph中使用地理空间数据?

创建模式

以下示例显示了如何创建标签。您可以以相同的方式创建边缘类型。

Nebulagraph当前支持三种类型的地理空间数据:点,Linestring和多边形。以下显示了如何创建地理类型以及如何插入地理空间数据。

CREATE TAG any_shape(geo geography);
CREATE TAG only_point(geo geography(point));
CREATE TAG only_linestring(geo geography(linestring));
CREATE TAG only_polygon(geo geography(polygon));

当未指定地理类型时,这意味着您可以存储任何类型的数据;指定类型时,这意味着只能存储该类型的地理空间数据,例如geography (point),这意味着您只能存储点的空间信息。

插入数据

any_shape标签的geo列中插入数据。

INSERT VERTEX any_shape(geo) VALUES "101":(ST_GeogFromText("POINT(120.12 30.16)"));
INSERT VERTEX any_shape(geo) VALUES "102":(ST_GeogFromText("LINESTRING(3 8, 4.7 73.23)"));
INSERT VERTEX any_shape(geo) VALUES "103":(ST_GeogFromText("POLYGON((75.3 45.4, 112.5 53.6, 122.7 25.5, 93.9 28.6, 75.3 45.4))"));

only_point标签的geo列中插入数据。

INSERT VERTEX only_point(geo) VALUES "201":(ST_Point(120.12,30.16)"));;

only_linestring标签的geo列中插入数据。

INSERT VERTEX only_linestring(geo) VALUES "302":(ST_GeogFromText("LINESTRING(3 8, 4.7 73.23)"));

only_polygon标签的geo列中插入数据。

INSERT VERTEX only_polygon(geo) VALUES "403":(ST_GeogFromText("POLYGON((75.3 45.4, 112.5 53.6, 122.7 25.5, 93.9 28.6, 75.3 45.4))"));

当插入的数据不符合指定类型的要求时,数据插入失败。

(root@nebula) [geo]> INSERT VERTEX only_polygon(geo) VALUES "404":(ST_GeogFromText("POINT((75.3 45.4))"));
[ERROR (-1005)]: Wrong value type: ST_GeogFromText("POINT((75.3 45.4))")

我们可以看到地理空间数据插入方法相当特殊,并且与插入基本类型(例如intstringbool)的插入非常不同。

让我们以ST_GeogFromText("POINT(120.12 30.16)")为例,ST_GeogFromText是一个地理位置信息解析功能,它接受WKT中的地理位置数据的字符串类型(著名文本)标准格式。

POINT(120.12 30.16)代表一个地理点,其经度为120°12,而纬度为30°16。 ST_GeogFromText函数解析并从WKT参数构建地理数据对象,然后INSERT语句将其存储在WKB(著名的二进制)标准中的Nebulagraph中。

地理空间功能

nebulagraph支持的地理空间功能可以分为以下主要类别:

  • 构建功能

    • ST_Point(longitude, latitude):基于纬度和经度对构建一个geography point对象。
  • 解析功能

    • ST_GeogFromText(wkt_string):解析wkt文本的geography对象。
    • ST_GeogFromWKB(wkb_string):从WKB文本中解析geography对象。 #尚未支持,因为Nebulagraph尚未支持二进制字符串。
  • 格式设置功能

    • ST_AsText(geography):以WKT文本格式输出geography对象。
    • ST_AsBinary(geography):以WKB文本格式输出geography对象。 #尚未支持,因为Nebulagraph尚未支持二进制字符串。
  • 转换功能

    • ST_Centroid(geography):计算geography对象的重心,这是geography point对象。
  • 谓词函数

    • ST_Intersects(geography_1, geography_2):确定两个geography是否相交。
    • ST_Covers(geography_1, geography_2):确定第一个geography对象是否完全覆盖了第二个。
    • ST_CoveredBy(geography_1, geography_2):st_covers的倒数。
    • ST_DWithin(geography_1, geography_2, distance_in_meters):确定两个geography对象之间的最短距离是否小于给定的距离。
  • 公制函数

    • ST_Distance(geography_1, geography_2):计算两个geography对象之间的距离。

这些功能接口遵循OpenGIS简单功能访问和ISO SQL/MM标准。有关详细信息,请参见NebulaGraph doc

地理空间指数

什么是地理空间索引?

地理空间索引是索引,可用于基于谓词ST_IntersectsST_Covers函数快速过滤数据。

Nebulagraph使用Google S2库作为地理空间索引。

S2库将地球的表面投射到切线正方形,然后递归四倍的平方表面四倍,并使用填充空间曲线,即希尔伯特曲线,以连接这些小方形晶格的中心。<<<<<<<<<<<<<<<<< /p>

当n无限大时,此希尔伯特曲线几乎填满了正方形。

S2库使用订单30的希尔伯特曲线。

Image description

下图显示地球充满了希尔伯特曲线。

Image description

可以看出,这些希尔伯特曲线将地球表面分为细胞。对于地球表面上的任何地理形状,例如城市,河流或人的位置,我们可以使用其中几个细胞完全覆盖地理形状。

每个单元通过唯一的INT64细胞识别。因此,地理对象的空间索引是构建以完全覆盖地理形状的S2单元的集合。

构造地理空间对象的索引时,构造了完全覆盖索引对象的不同S2单元的集合。基于空间谓词函数的索引查询通过在覆盖查询对象的一组S2单元与覆盖索引对象的S2单元之间找到相交来迅速过滤大量无关的地理对象。

创建地理索引

CREATE TAG any_shape_geo_index on any_shape(geo)

对于带有point类型的地理空间数据,它可以由30顺序的S2单元表示,因此一个点对应于一个索引条目。对于使用inestring类型和polygon的地理空间数据,我们使用多个不同级别的S2单元格来覆盖它,因此它将对应于多个索引条目。

空间索引用于加快所有地理谓词的查找,例如:

LOOKUP ON any_shape WHERE ST_Intersects(any_shape.geo, ST_GeogFromText("LINESTRING(3 8, 4.7 73.23)"));

any_shapegeo列上没有空间索引时,此语句将首先将any_shape的所有数据读取到内存中,然后使用它来计算它是否与点(3.0,8.0)相交,这通常是更多昂贵的。当any_shape中的数据量很大时,计算开销将是不可接受的。

any_shapegeo列具有空间索引时,该语句将首先使用空间索引来滤除该行相交的大多数数据,但是当读取内存,读取中时,仍然会有一些数据可能会相交。因此,仍然还有一个计算要做。这样,空间索引迅速滤除了大多数不太可能以较小成本相交的数据,并且很小的百分比被过滤,从而大大降低了计算开销。