Page 168 - 《软件学报》2026年第3期
P. 168

刘孟怡 等: 基于大语言模型的空间数据库自然语言查询转换方法                                                  1131


                    根据空间对象与查询范围的关系, 空间范围查询可分为如下两类.
                    (1) 相交查询, 返回与查询地点具有非空交集的所有空间对象, 如检索穿过某一区域的道路或河流. 该类查询
                 需要的实体信息为空间关系和查询地点, 运算符为                intersects, 结构化语言模型为:
                    query <relation> feed filter [.GeoData intersects <location>] consume;
                    (2) 包含查询, 提取完全位于查询范围内的空间对象, 如查询某区域内的建筑物. 该类查询需要的实体信息为
                 空间关系和查询地点, 运算符为         within, 结构化语言模型为:
                    query <relation> feed filter [.GeoData within <location>] consume;
                    最近邻居查询需要的实体信息为空间关系、查询地点和最近邻居数, 运算符为                           creatertree 和  distancescan. 运
                 算符  creatertree 为空间关系构建  R  树索引. 运算符   distancescan  根据查询地点、存储在    R  树中的对象和最近邻居
                 数  k, 返回  R  树中对象距离查询地点的      k 个最近邻居. 结构化语言模型为:
                    query <relation> creatertree [GeoData] <relation> distancescan [<location>, <k>] consume;
                    空间  Join  查询的核心在于基于空间关系 (如位置、距离等) 进行连接, 包括如下具体形式.
                    (1) 基于位置关系的     Join, 返回两个空间对象集合中所有满足空间相交条件的对象对, 例如分析每个行政区的
                 公园. 该类查询需要的实体信息为空间关系, 运算符为                symmjoin  和  intersects. 运算符  symmjoin  将两个空间关系的
                 元组结合起来, 等同于      SQL  中的  JOIN  关键字. 运算符  intersects 用于构成  symmjoin  运算符的连接条件. 结构化语
                 言模型为:
                    query <relation1> feed {a} <relation2> feed {b} symmjoin [.GeoData_a intersects ..GeoData_b] consume;
                    (2) 基于距离关系的     Join, 返回两个空间对象集合中距离在给定阈值内的对象对, 例如查找距离工业园区一定
                 范围内的住宅区. 该类查询需要的实体信息为空间关系, 运算符为                    symmjoin  和  distance. 运算符  distance 用于构成
                 symmjoin  运算符的连接条件. 结构化语言模型为:
                    query <relation1> feed {a} <relation2> feed {b} symmjoin [distance (.GeoData_a, ..GeoData_b) ≤ <d>] consume;
                    根据聚合类型的不同, 空间聚合查询包括如下典型形式.
                    (1) 数量统计, 统计与查询地点相交的空间对象数量, 例如评估某一生态保护区内的树木分布密度. 该类查询
                 需要的实体信息为空间关系和查询地点, 运算符为                intersects 和  count, 结构化语言模型为:
                    query <relation1> feed extend [Cnt: fun(t: TUPLE) <relation2> feed filter [.GeoData intersects attr(t, GeoData)]
                 count] consume;
                    (2) 总和统计, 计算空间对象集合中与查询地点相交部分的面积总和, 例如估算某一洪水区的受灾土地面积.
                 该类查询需要的实体信息为空间关系和查询地点, 运算符为                   intersection  和  sum, 结构化语言模型为:
                    query <relation> feed extend [IntersectionArea: area ( intersection (.GeoData, <location>))] sum [IntersectionArea];
                    (3) 最大值统计, 返回空间对象集合中, 与另一集合对象相交数量最多的对象, 例如查询南京市中拥有最多公
                 园的行政区. 查询需要的实体为空间关系, 运算符为               intersects、sortby  和  head, 结构化语言模型为:
                    query <relation1> feed extend [Cnt: fun(t: TUPLE) <relation2> feed filter [.GeoData intersects attr (t, GeoData)]
                 count] sortby [Cnt desc] head [1] consume;
                    结构化语言模型的设计基于两个关键原则: 查询逻辑的普适性和功能映射的灵活性. 查询逻辑是空间数据查
                 询的基础, 它描述了查询的目标和过程, 具有很强的通用性. 此外, 不同空间数据库系统在运算符和函数的命名、
                 参数形式上可能有所不同, 但功能本质上是相通的. 因此, 只要目标空间数据库系统具备类似功能的运算符和函
                 数, 上述构造的结构化语言模型即可通过简单的运算符和函数替换, 适配新系统. 以                         PostGIS  系统为例, 在结构化
                 语言模型中, 和    SECONDO  系统的对应关系如表        3  所示. 在  PostGIS  的  CREATE  和  DROP  语句中, <object> 代表
                 操作对象, 例如    FUNCTION、INDEX、TABLE    和  TYPE. 根据表  3 可得  PostGIS  的范围查询的结构化语言模型为:
                    SELECT * FROM <relation> WHERE ST_Intersects(<relation> .GeoData, <location>);
                    当转换最近邻居查询的自然语言时, PostGIS           使用的运算符为      ST_Distance, ORDER BY  和  LIMIT. ST_Distance
   163   164   165   166   167   168   169   170   171   172   173