You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Neo4j中存储边界框并借助RTREE实现指定范围的边界框查询

Neo4j 基于RTREE索引的边界框存储与查询语法

Neo4j 原生POINT索引底层采用RTREE结构实现,无需额外插件即可完成边界框的范围查询需求,操作语法如下:

存储边界框

边界框存储为两个POINT类型属性,分别对应边界框的最小坐标点(bbox_min)和最大坐标点(bbox_max),示例如下:

// 3D笛卡尔坐标边界框示例
CREATE (b:BBoxObject {
  name: "样例边界框1",
  bbox_min: point({x: 0, y: 0, z: 0, crs: 'cartesian-3d'}),
  bbox_max: point({x: 1, y: 1, z: 1, crs: 'cartesian-3d'})
});

// 2D地理坐标边界框示例(可选)
CREATE (b:BBoxObject {
  name: "样例边界框2",
  bbox_min: point({longitude: 116.3, latitude: 39.9, crs: 'wgs-84'}),
  bbox_max: point({longitude: 116.5, latitude: 40.1, crs: 'wgs-84'})
});

创建RTREE索引

针对边界框的两个端点创建POINT索引,底层自动使用RTREE结构优化查询性能:

// 针对3D笛卡尔坐标边界框创建索引
CREATE POINT INDEX bbox_min_cartesian3d_idx IF NOT EXISTS 
FOR (n:BBoxObject) ON (n.bbox_min);
CREATE POINT INDEX bbox_max_cartesian3d_idx IF NOT EXISTS 
FOR (n:BBoxObject) ON (n.bbox_max);

// 针对2D地理坐标边界框创建索引(可选)
CREATE POINT INDEX bbox_min_wgs84_idx IF NOT EXISTS 
FOR (n:BBoxObject) ON (n.bbox_min);
CREATE POINT INDEX bbox_max_wgs84_idx IF NOT EXISTS 
FOR (n:BBoxObject) ON (n.bbox_max);

范围查询语法

查询完全落在指定范围内的边界框

// 3D笛卡尔坐标范围查询示例
WITH 
  point({x: -1, y: -1, z: -1, crs: 'cartesian-3d'}) AS query_min,
  point({x: 2, y: 2, z: 2, crs: 'cartesian-3d'}) AS query_max
MATCH (n:BBoxObject)
WHERE n.bbox_min >= query_min
  AND n.bbox_max <= query_max
RETURN n.name, n.bbox_min, n.bbox_max;

查询与指定范围有交集的边界框

// 3D笛卡尔坐标范围查询示例
WITH 
  point({x: -1, y: -1, z: -1, crs: 'cartesian-3d'}) AS query_min,
  point({x: 2, y: 2, z: 2, crs: 'cartesian-3d'}) AS query_max
MATCH (n:BBoxObject)
WHERE n.bbox_min <= query_max
  AND n.bbox_max >= query_min
RETURN n.name, n.bbox_min, n.bbox_max;

注意:查询使用的坐标crs必须和存储时的crs完全一致,否则会导致索引失效、查询结果错误。如果使用2D坐标,去掉对应参数、修改crs即可。

内容的提问来源于stack exchange,提问作者MR WANG

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 23:45:10