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

iit*_*081 4 neo4j cypher google-places-api

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

    (i:Idea)-[:DEVELOPED_AT]->(l:Location)
    (i: Idea)-[:DEPLOYED_AT]->(l:Location)
Run Code Online (Sandbox Code Playgroud)

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

Wil*_*yon 6

你有几个选择.

Neo4j的空间

如您所述,Neo4j Spatial扩展可用于高效的地理空间索引.空间扩展提供的一种类型的查询withinDistance将查询给定半径内的索引节点.有一些 在线教程 解释了如何开始使用neo4j空间,但是一旦安装了它并将节点添加到空间索引中,您就可以使用这样的Cypher查询来过滤指定纬度,经度50km内的节点:

// 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
Run Code Online (Sandbox Code Playgroud)

空间查询由RTree索引支持,因此是高效的.

计算距离

另一种选择是使用Haversine公式计算距离并将其用作过滤器.请注意,此方法不如索引后备neo4j空间方法有效,因为将为每个位置节点计算距离.

由于Cypher包含一个haversin功能,因此可以使用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
Run Code Online (Sandbox Code Playgroud)