neo4j按半径查找用户

neo4j按半径查找用户,neo4j,geolocation,cypher,Neo4j,Geolocation,Cypher,我是neo4j的新手。这是我的第二天。 对这项技术非常兴奋,并且有很多问题。请耐心点☺️ 在所需的应用程序中,用户可以查看周围的用途 (仅当两个用户使用位置\u半径属性彼此可见时) 在这个练习中,我生成了100000用户,他们在MySql中的任意位置。它们被导入到neo4j(关系由pythonneo4j手动创建) 第一次尝试: 在用户之间创建一个关系,该关系通过desire标准可见 a。将所有用户插入neo4j(fast) B通过查看以前用户的标准位置,逐个创建关系(过程缓慢,可能做错了) 这仍

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

在所需的应用程序中,用户可以查看周围的用途
(仅当两个用户使用
位置\u半径
属性彼此可见时)

在这个练习中,我生成了
100000
用户,他们在
MySql
中的任意位置。它们被导入到
neo4j
(关系由pythonneo4j手动创建)

第一次尝试:

在用户之间创建一个关系,该关系通过desire标准可见

a。将所有用户插入neo4j(fast)
B通过查看以前用户的标准位置,逐个创建关系(过程缓慢,可能做错了)
这仍在运行,目前有13987个节点。22460068关系。。。。。这是个错误的想法吗

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
多谢各位

正如您所看到的,shay在所有
用户
之间创建/删除“近邻”关系是不实际的,特别是如果您需要持续这样做的话。一般来说,当您希望节点之间的连接相对稳定时,应该使用关系。创建/删除大量关系以跟踪持续运行的流程的结果是没有意义的,尤其是如果您只关心少数
用户的结果

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

这可以加速某些
距离
查询。例如,显示以下查询将使用该空间索引(至少在NEO4J4.0.4中)。您应该始终分析查询以帮助优化它们,并确保它们在版本更改后保持优化状态

匹配(p:User),(q:User)
哪里
p、 用户_id=1和
p、 位置半径>距离(p位置,q位置)
您似乎在说您想“创建”关系。但您的查询没有一个试图创建任何关系,也没有一个试图返回关系。谢谢@cybersam的回复。问题是指通过地理位置找到彼此周围的节点。我应该在它们之间创建关系还是选择它们。如果是,查询是否不同
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
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
CREATE INDEX user_distance FOR (u:User) ON (u.location)
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