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