看了上面最初的语句计划,性能不好的原因是 filter 在中间的拓展的时候并没有下推,是优化器缺少类似的优化,目前可以考虑将路径拆开做些辅助的调优,类似下面语句:
match (v1)-[e1]-(v2), (v2)-[e2]-(v3), (v3)-[e3]-(v4), (v4)-[e4]-(v1) \
where id(v1)=="1" and id(v2)=="2" and id(v3)=="3" and id(v4) == "4" \
return [v1,e1,v2,e2,v3,e3,v4,e4,v1] as p
上面路径需要手动拼接一下,跟原来的 path 变量稍微有些出入,但是应该没有丢失信息。