本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
空间数据
Amazon Neptune 现在支持空间查询,允许您在图表中存储和分析几何数据。虽然空间要素通常用于地理位置(例如地图上的坐标),但它适用于任何位置和邻近度很重要的二维数据。使用此功能回答诸如 “哪些商店距离该客户 5 英里以内?” 之类的问题 、“查找与该服务区相交的所有配送路线” 或 “此平面图中的哪些组件与 HVAC 区域重叠?” Neptune 使用适用于点、多边形和其他几何形状的行业标准空间类型函数来实现空间支持。您可以将空间数据存储为节点和边的属性,然后使用空间函数计算距离、检查点是否落在边界内或查找重叠区域,所有这些都在 OpenCypher 查询中完成。
常见用例:
-
地理应用:基于位置的建议、地理围栏、路线规划和区域分析
-
设施和空间管理:平面图布局、设备布局和区域覆盖范围
-
网络拓扑:物理基础设施映射、覆盖区域和服务边界
-
设计和 CAD:二维设计中的组件定位、碰撞检测和空间关系
-
游戏开发:角色定位、碰撞检测和 area-of-effect计算
与其他数据库一样,Amazon Neptune 中的空间类型实现遵循了 ISO/IEC 13249-3:2016 指令。空间函数它们以 OpenCypher 查询语言提供。
坐标系
Neptune 有一个用于整个数据库的空间参考标识符 (SRID)。坐标系的同质性减少了用户在查询中的错误并提高了数据库性能。第一个版本 (1.4.7.0) 支持笛卡尔坐标系,也称为 SRID 0。
SRID 0 的 Neptune 实现与经度和纬度值兼容。用于ST_DistanceSpheroid根据 WGS84 /SRID 4326 计算距离。
当前的实现支持存储三维坐标。空间函数目前仅支持使用 x 轴和 y 轴(二维)坐标。可用空间函数目前不支持 z 轴坐标。
存储位置数据
使用 Geometry 属性类型存储节点和边上的位置数据。使用知名文本 (WKT) 格式创建几何值,这是将地理形状表示为文本的标准方法。例如,要存储点位置,请执行以下操作:
CREATE (n:airport {code: 'ATL', location: ST_GeomFromText('POINT (-84.4281 33.6367)')})
使用地理坐标时,第一个参数 (x) 代表经度,第二个参数 (y) 代表纬度。这遵循空间数据库中使用的标准坐标顺序和 ISO 19125 标准。
注意
Neptune 现在支持一种名为 “几何” 的新数据类型。可以使用ST_GeomFromText函数从 WKT 字符串创建节点或边的几何属性。
Neptune 会自动将点数据存储在专门的空间索引中,以提高空间类型函数的性能。例如,专门的空间索引可以加速ST_Contains用于查找多边形内的点。
批量加载空间数据
批量加载数据时,请在 CSV 标题中指定几何类型。Neptune 将解析 WKT 字符串并创建相应的几何属性:
:ID,:LABEL,code:String,city:String,location:Geometry 21,airport,ATL,Atlanta,POINT (-84.42810059 33.63669968) 32,airport,ANC,Anchorage,POINT (-149.9960022 61.17440033) 43,airport,AUS,Austin,POINT (-97.66989899 30.19449997)
有关完整的 CSV 格式详细信息,请参阅 OpenCypher 批量加载格式。
查询空间数据
以下查询示例使用航空路线数据集
如果您的数据具有单独的纬度和经度属性而不是几何属性,则可以在查询时将其转换为点。查找距离给定位置最近的 10 个机场:
MATCH (a:airport) WITH a, ST_GeomFromText('POINT (' + a.lon + ' ' + a.lat + ')') AS airportLocation WITH a, airportLocation, ST_Distance(ST_GeomFromText('POINT (-84.4281 33.6367)'), airportLocation) AS distance WHERE distance IS NOT NULL RETURN a.code, a.city, distance ORDER BY distance ASC LIMIT 10
如果您已经将位置存储为,ST_Point则可以直接使用这些位置值:
-
设置 属性
MATCH (a:airport) SET a.location = ST_GeomFromText('POINT (' + a.lon + ' ' + a.lat + ')') -
使用 ST_Distance 进行查询:
MATCH (a:airport) WHERE a.location IS NOT NULL WITH a, ST_Distance(ST_GeomFromText('POINT (-84.4281 33.6367)'), a.location) AS distance RETURN a.code, a.city, distance ORDER BY distance ASC LIMIT 10
使用 Bolt 驱动器
大多数查询方法以 WKT 字符串的形式返回 Geometry 值,这些值是人类可读的。如果您使用的是 Bolt 驱动程序,为了提高效率,几何值将以 WKB(众所周知的二进制)格式返回。在应用程序中将 WKB 转换为几何对象:
try (Session session = driver.session()) { Result result = session.run("MATCH (n:airport {code: 'ATL'}) RETURN n.location as geom"); Record record = result.single(); byte[] wkbBytes = record.get("geom").asByteArray(); // Convert WKB to Geometry object using JTS library WKBReader wkbReader = new WKBReader(); Geometry geom = wkbReader.read(wkbBytes); }