我有一个Neo4j图表,由总共100.000个用户和2.000.000个关系(用户之间的友谊)组成。 一个用户有大约20个友谊。
现在我正在尝试查看找到特定用户(深度1)的朋友,朋友的朋友(深度2)和朋友的朋友(深度3)的朋友需要多少时间。
这是我运行的密码查询(对于ID为86660的用户):
深度1
MATCH (u1:User{idUtente:"86660"})-[:FRIEND_OF]->(u2:User)
RETURN u2.name
深度2
MATCH (u1:User{idUtente:"86660"})-[:FRIEND_OF]->(u2:User)-[:FRIEND_OF]->(u3:User)
RETURN u3.name
深度3
MATCH (u1:User{idUtente:"86660"})-[:FRIEND_OF]->(u2:User)-[:FRIEND_OF]->(u3:User)-[:FRIEND_OF]->(u4:User)
RETURN u4.name
深度1(它返回17个结果)和深度2(它返回320个结果)查询花了几毫秒而深度3是无穷无尽的。
如何在合理的时间内获得depth3的结果?
更新
使用PROFILE我得到了这个:
PROFILE
MATCH (u1:User{idUtente:"86660"})-[:FRIEND_OF]->(u2:User)-[:FRIEND_OF]->(u3:User)-[:FRIEND_OF]->(u4:User)
RETURN u4.name
答案 0 :(得分:1)
显然这有帮助
MATCH (u1:User{idUtente:"86660"})-[:FRIEND_OF*3..3]->(u2:User) RETURN u2.name
我认为我的查询与您的查询之间的区别在于您在此过程中映射了所有实体,而[:FRIEND_OF*3..3]
限制了我的查询以仅检查3跳之后的权限。您可以找到更多信息in documentation