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
我的问题是:
- 是第一次尝试是错误的方法,建立数百万的关系是错误的想法吗?
- 剂量 2/3 次尝试 优于 第一次尝试?
- 进行第三次尝试 对第二次尝试进行任何优化?
- 设置一个 "Station"
(Station {point(...)}
节点的网格(每平方公里)并将用户连接到最近的站点帮助(以防万一 第一次尝试 太多了。)?
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 User
s 之间的关系不切实际,如您所见,尤其是当您需要这样做时不断地。一般来说,当您期望节点之间的连接相对稳定时,应该使用关系。 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
我是 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
我的问题是:
- 是第一次尝试是错误的方法,建立数百万的关系是错误的想法吗?
- 剂量 2/3 次尝试 优于 第一次尝试?
- 进行第三次尝试 对第二次尝试进行任何优化?
- 设置一个 "Station"
(Station {point(...)}
节点的网格(每平方公里)并将用户连接到最近的站点帮助(以防万一 第一次尝试 太多了。)? 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 User
s 之间的关系不切实际,如您所见,尤其是当您需要这样做时不断地。一般来说,当您期望节点之间的连接相对稳定时,应该使用关系。 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