neo4j 按半径查找用户

neo4j look for users by radius

我是 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 次尝试 优于 第一次尝试?
  3. 进行第三次尝试第二次尝试进行任何优化?
  4. 设置一个 "Station" (Station {point(...)} 节点的网格(每平方公里)并将用户连接到最近的站点帮助(以防万一 第一次尝试 太多了。)?
  5. neo4j可以完全替代DB吗?,将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

谢谢你

谢伊

Creating/deleting "nearness" all Users 之间的关系不切实际,如您所见,尤其是当您需要这样做时不断地。一般来说,当您期望节点之间的连接相对稳定时,应该使用关系。 create/delete 很多关系来跟踪连续 运行 过程的结果是没有意义的 - 特别是如果您只关心少数 User 的结果。

相反,您应该在 :User(location) 上创建一个 spatial index:

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