跳转至
开发版采用单机部署,无需产品 License 文件。需要多机部署或大规模性能测试? 了解企业版

CREATE SPATIAL INDEX

CREATE SPATIAL INDEX语句用于为特定图创建空间索引。

可选择以下任意方法来指定图:

  • 在本语句前添加 USE 子句来设定工作图。
  • 提前使用 SESSION SET 设置当前会话的图。

若两种方法均使用,则以 USE 子句中的指定为准。若均未使用,则报错。

您可以基于单个点类型或边类型的单个地理空间类型属性创建空间索引,从而加速空间范围、邻近、交集等空间相关的查询。

若要创建其他类型的索引,请参见 CREATE NORMAL INDEX、CREATE VECTOR INDEX 和 CREATE FULLTEXT INDEX。

空间索引实现原理

在悦数图数据库开发版中,空间索引的具体实现原理如下:

  1. 划分网格层级:将地球的整体地理空间投影到球面上,并分解为多个层级的网格。每个后续层级都会进一步分解其上一级,因此上一级别的每个单元都包含下一级别的整个网格。
  2. 确定网格单元的大小和数量:网格层级越高,每个网格单元的覆盖面积越小,因此需要更多的单元来覆盖同一空间对象。
  3. 构建索引:系统计算空间对象覆盖的网格单元,并在索引中记录地理空间对象与网格单元的对应关系。
  4. 检索数据:系统只需检索与目标地理空间对象重叠的网格单元,快速定位目标空间对象。

下图示例将一个空间分解成级别为4的4x4网格,总共产生65,536个第四级单元。

geo index

您可以参考 S2 Cell Statistics 中的level(网格层级)和average area(每个单元的大小)两列,配置参数 s2_max_level 和 s2_max_cells 的值,让空间索引更加适配具体使用场景。

Note

对非默认 Schema 或其中的对象执行操作时,用户既要通过隐式访问规则或显式USAGE授权获得该 Schema 的访问权,也要具备目标操作所需的权限。Schema 访问校验和目标操作所需的权限校验相互独立,满足其中一项不能替代另一项。Schema 访问控制不适用于临时图、内置 Procedure 和内置 Function。更多信息,请参见 Schema 访问控制。

前提条件

  • 图已创建。更多信息,请参见 CREATE GRAPH。
  • 若要创建空间索引,必须是图的所有者,或具备在图上执行INDEX操作的权限,或具备在当前 Schema 执行CREATE INDEX操作的权限。更多信息,请参见角色与权限。

语法

create_spatial_index_statement
CREATE SPATIAL INDEX IF NOT EXISTS index_name ON NODE VERTEX TYPE node_type_name EDGE RELATIONSHIP TYPE edge_type_name ( spatial_index_configuration )
spatial_index_configuration
geography_property_name , s2_max_level = int_value , s2_max_cells = int_value

create_spatial_index_statement ::=
    'CREATE' 'SPATIAL' 'INDEX' ('IF NOT EXISTS')? index_name 'ON' ( ( ('NODE' | 'VERTEX') 'TYPE'? node_type_name) | ( ('EDGE'|'RELATIONSHIP') 'TYPE'? edge_type_name) ) '(' spatial_index_configuration ')'

spatial_index_configuration ::=
    'geography_property_name' ',' 's2_max_level' '=' int_value ',' 's2_max_cells' '=' int_value             

参数

IF NOT EXISTS

该子句会检查是否已存在同名的索引。若已存在,则不会创建索引,也不会抛出异常。

若未指定该子句,且已存在同名的索引,则会抛出异常。

index_name

待创建的空间索引的名称。该名称为常规标识符,在同一个图的所有类型的索引中,索引名称必须唯一。

有关标识符的详细信息,请参见标识符命名规则。

node_type_name

待创建空间索引的点类型的名称。该点类型必须至少有一个值类型为GEOGRAPHY的属性。

edge_type_name

待创建空间索引的边类型的名称。该边类型必须至少有一个值类型为GEOGRAPHY的属性。

spatial_index_configuration

创建空间索引所基于的属性及索引配置,每次仅支持为一个属性创建空间索引。

geography_property_name

待创建空间索引的属性名称,该属性的值类型必须是GEOGRAPHY类型。

s2_max_level

网格可以划分的最大层级。层级越大,网格划分越细,单元越小,但索引体积和维护成本也越大。取值范围为(0,30]。

s2_max_cells

一个地理空间对象可以覆盖的最多网格单元数。数值越低,索引记录的数量越少,进而降低存储需求和查询复杂度,但会影响索引精度。取值范围为(0,256]。

示例

以下示例基于地理空间数据使用示例中创建的图my_graph。

在点类型上创建空间索引

USE my_graph CREATE SPATIAL INDEX IF NOT EXISTS idx_gnode_g ON NODE Person(any_geo, s2_max_level = 30, s2_max_cells = 8)

该示例在点类型Person上基于属性any_geo创建了一个名为idx_gnode_g的空间索引,最大层级为30,最多覆盖8个单元。

在边类型上创建空间索引

USE my_graph CREATE SPATIAL INDEX IF NOT EXISTS idx_gedge_g ON EDGE GEdge(company_location, s2_max_level = 30, s2_max_cells = 8)

该示例在边类型GEdge上基于属性company_location创建了一个名为idx_gedge_g的空间索引,最大层级为30,最多覆盖8个单元。