多跳的密码性能/

时间:2017-07-16 15:35:29

标签: neo4j cypher

我在一个非常大的社交网络(超过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的索引。

无论如何都要提高我的查询效果吗?

2 个答案:

答案 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)

而不是使用解释,而是尝试使用“配置文件”。