我有一个 Neo4j 图,它由总共 100.000 个用户和 2.000.000 个关系(用户之间的友谊)组成。 一个用户有大约 20 个好友。
现在我想看看找到特定用户的 friend (深度 1)、 friend 的 friend (深度 2)和 friend 的 friend 的 friend (深度 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
最佳答案
显然这有帮助
MATCH (u1:User{idUtente:"86660"})-[:FRIEND_OF*3..3]->(u2:User) RETURN u2.name
我认为我的查询与您的查询之间的区别在于您沿途映射所有实体,而 [:FRIEND_OF*3..3]
将我的查询限制为仅检查 3 个实体跳开。您可以找到更多信息 in documentation
关于Neo4j 查询耗时太长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42536070/