gpt4 book ai didi

neo4j - 如何在neo4j中使用纬度和经度搜索特定半径内的所有节点

转载 作者:行者123 更新时间:2023-12-04 17:10:03 25 4
gpt4 key购买 nike

我有两种类型的节点 Idea 和 Location,Idea 包含一些一般信息,Location 节点有 3 个属性,即 id、纬度和经度。这些节点之间的关系有以下几种类型:

    (i:Idea)-[:DEVELOPED_AT]->(l:Location)
(i: Idea)-[:DEPLOYED_AT]->(l:Location)

现在,当用户使用 google place autocomple 按地理位置搜索任何想法时,我会收到经纬度搜索位置。现在,我必须返回在该搜索位置的特定半径内开发或部署的所有相关想法。在搜索时,我遇到了空间 Neo4j,但我不知道如何使用它。

最佳答案

你有几个选择。

neo4j-空间

正如你提到的,Neo4j Spatial extension可用于高效的地理空间索引。空间扩展提供的一种查询类型是 withinDistance它将查询给定半径内的 inode 。有few tutorials online这解释了如何开始使用 neo4j spatial,但是一旦你安装了它并将节点添加到空间索引中,你就可以使用像这样的 Cypher 查询来过滤指定纬度、经度 50 公里内的节点:

// Find all Location nodes within 50km of specified lat/lon
START l=node:geom('withinDistance:[46.9163, -114.0905, 50.0]')
// Find all Idea nodes developed or deployed at these locations
MATCH (l)<-[:DEVELOPED_AT|:DEPLOYED_AT]-(i:Idea)
RETURN i

空间查询由 RTree 索引支持,因此非常高效。

计算距离

另一种选择是使用 Haversine formula计算距离并将其用作过滤器。请注意,此方法不如索引支持的 neo4j-spatial 方法有效,因为将为每个位置节点计算距离。

由于 Cypher 包含一个 haversin function这可以使用 Cypher 来完成:
// Find all
WITH 46.9163 AS lat, -114.0905 AS lon
MATCH (l:Location)
WHERE 2 * 6371 * asin(sqrt(haversin(radians(lat - l.lat))+ cos(radians(lat))* cos(radians(l.lat))* haversin(radians(lon - l.lon)))) < 50.0
MATCH (l)<-[:DEVELOPED_AT|:DEPLOYED_AT]-(i:Idea)
RETURN i

关于neo4j - 如何在neo4j中使用纬度和经度搜索特定半径内的所有节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35125336/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com