首页 > 解决方案 > neo4j 按半径查找用户

问题描述

我是新手neo4j。这是我的第二天。
对这项技术非常兴奋并且有很多问题。请耐心等待☺️

在所需的应用程序中,用户可以查看他们周围的使用情况(仅在两个用户使用属性
相互可见的情况下)location_radius

对于这个练习,我100,000在我的国家内部生成了一个随机位置的用户MySql。并将它们导入neo4j(关系由 python neo4j 手动创建)

第一次尝试:

创建用户之间的关系,通过愿望标准可见。

一种。将所有用户插入 neo4j(快速)
b. 通过查看以前用户的标准位置(过程缓慢,可能做错了)来逐一创建关系,
这仍在运行,目前有 13,987 个节点。22,460,068 条关系......这是错误的想法吗?

MATCH (src_u:User {user_id:1})-[:IN_SEARCH]-(u:User)
RETURN src_u, u

第二次尝试 (一个相同的模式)

在不使用关系的情况下运行查询

MATCH (me:User {user_id:1}),(u:User)
WHERE u.user_id <> 1
AND me.gender <> u.gender
AND distance(me.location, u.location) < me.location_radius 
AND distance(me.location, u.location) < u.location_radius
RETURN u

第三次尝试

同样的事情,但尝试优化第二次尝试,这个查询会优化第二次尝试吗?

MATCH (me:User {user_id:1})
WITH me
MATCH (u:User)
WHERE u.user_id <> 1
AND me.gender <> u.gender
WITH me, u, distance(me.location, u.location) as d 
WHERE d < me.location_radius AND d < u.location_radius
RETURN u

我的问题是:

  1. 是第一次尝试是错误的方式,剂量数百万的关系是一个错误的想法?
  2. 剂量2/3 尝试优于第 1 次尝试
  3. 3 次尝试对第2 次尝试进行任何优化?
  4. 给一个“站”节点网格(Station {point(...)}(每平方公里)并将用户连接到最近的站帮助(以防第一次尝试太多。)?
  5. neo4j可以完全替换数据库吗?将RAW数据存储在关系数据库中是一种好习惯吗?

用户创建查询:

MERGE (u:User {user_id:$user_id})
ON CREATE SET u.name=$name, u.gender=$gender, u.location=point({latitude:$latitude,longitude:$longitude}), u.location_radius=$location_radius
RETURN u

谢谢你

谢伊

标签: neo4jgeolocationcypher

解决方案


如您所见,创建/删除所有 s之间的“接近”关系User是不切实际的,特别是如果您需要连续执行此操作。一般来说,当您期望节点之间的连接相对稳定时,应该使用关系。创建/删除大量关系以跟踪持续运行过程的结果是没有意义的——特别是如果您只关心少数Users 的结果。

相反,您应该在以下位置创建空间索引:User(location)

CREATE INDEX user_distance FOR (u:User) ON (u.location)

这可以加快某些distance查询。例如,PROFILE显示以下查询将使用该空间索引(至少在 neo4j 4.0.4 中)。您应该始终分析您的查询以帮助优化它们,并确保它们在版本更改后保持优化。

MATCH (p:User), (q:User)
WHERE
  p.user_id = 1 AND
  p.location_radius > distance(p.location, q.location) < q.location_radius
RETURN p, COLLECT(q) AS others_nearby

推荐阅读