如何在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
相关产品推荐
相关产品推荐

