我在一个非常大的社交网络(超过1B条记录)上运行我的cypher
查询。我试图获得具有可变关系长度的两个person
之间的所有路径。我得到一个合理的响应时间运行查询单个关系长度(在0.5 -2秒之间)[person
ID是索引]。
MATCH paths=( (pr1:person)-[*0..1]-(pr2:person) )
WHERE pr1.id='123456'
RETURN paths
但是,当我使用多个长度(即2个或更多)运行查询时,我的响应时间会延长到几分钟。假设每个人平均拥有相同数量的连接,我应该运行我的查询2-3分钟Max(但我达到5分钟以上)。
MATCH paths=( (pr1:person)-[*0..2]-(pr2:person) )
pr1.id='123456'
RETURN paths
我尝试使用EXPLAIN
未显示VarLengthExpand(All)
的极值
也许遍历没有使用pr2
的索引。
无论如何都要提高我的查询效果吗?
答案 0 :(得分:1)
由于可变长度关系搜索具有指数复杂性,因此您的*0..2
查询可能会生成大量路径,这可能导致neo4j服务器(或您的客户端代码,如neo4j浏览器)运行很长时间甚至耗尽记忆。
此查询可能能够完成并显示有多少匹配路径:
MATCH (pr1:person)-[*0..2]-(:person)
WHERE pr1.id='123456'
RETURN COUNT(*);
如果返回的数字非常大,那么您应该修改查询以减小结果的大小。例如,您可以在原始RETURN
子句之后添加LIMIT子句,以限制返回路径的数量。
顺便说一句,EXPLAIN
子句只是估算查询成本,可以离开。 PROFILE
子句执行实际查询,并为您提供DB命中的准确计算(但是,如果您的查询永远不会运行,那么它的PROFILE
也将永远不会完成)。
答案 1 :(得分:0)
而不是使用解释,而是尝试使用“配置文件”。