neo4j通过半径查找用户。

问题描述 投票:0回答:1

我是一个新手 neo4j.这是我的第二天。对技术相当兴奋,有很多问题,请耐心等待☺️。

在所需的应用程序中,用户可以查看他们周围的使用情况(只有在两个用户都可以看到对方的情况下,使用的是 location_radius )属性

在这个练习中,我生成了 100,000 在我国境内有随机位置的用户 MySql......它们被进口到 neo4j (关系由python neo4j手动创建)

第一次尝试。

在用户之间建立一种关系,这些用户是根据所希望的标准可见的:a. 将所有用户插入到neo4j中(速度快)b. 通过查看以前用户的标准位置来逐一建立关系(速度慢,可能做错了)。

a. 将所有用户插入到neo4j(快) b. 通过查看之前用户的标准位置来逐一创建关系(过程慢,可能做错了)这个还在运行,目前有13987个节点。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

第三次尝试

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

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. 剂量 23次尝试 胜过 第一次尝试?
  3. 剂量的 第三次尝试 的任何优化。第二次尝试?
  4. 剂量一个网格的 "站" (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

谢谢你

棚户区

neo4j geolocation cypher
1个回答
1
投票

创建删除 "近似 "关系之间的 Users是不实用的,正如你所看到的,特别是当你需要连续地做这件事的时候。一般来说,当你期望节点之间有相对稳定的连接时,应该使用关系。为了跟踪一个连续运行的过程的结果而创建elete很多关系是没有意义的--尤其是当你只关心少数几个节点的结果时 Users.

相反,你应该创建一个 空间指数 关于 :User(location):

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

这可以加快某些 distance 查询。例如: 简介 显示以下查询将使用该空间索引(至少在 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
© www.soinside.com 2019 - 2024. All rights reserved.