我正在做的是获取与用户个人资料 *具有特定定向关系的所有个人资料 *,如果他们有备用个人资料< / em> *获取那些以防用户备用配置文件 *与它有关系。我也需要关系的方向。
我的问题是,大约10000个节点需要大约5秒才能获得数据。 我有节点和关系的自动索引。
这是我的节点相关的方式:
用户 - [:简介] - GT;配置文件A - [:相关] - GT;概貌&LT; - [?:我] - GT; ProfileB2&LT; - [?:相关] -ProfileA2&LT; - [:资料] - 用户
我的查询如下:
START User=node({source})
MATCH User-[:profile]->ProfileA-[rel:related]->ProfileB
WHERE User-->ProfileA-->ProfileB
WITH ProfileA, rel, ProfileB
MATCH ProfileB<-[?:me]->ProfileB2<-[relB?:related]-ProfileA2<-[:profile]-User
WHERE relB IS NULL OR User-->ProfileA-->ProfileB<-->ProfileB2<--ProfileA2<--User
RETURN ProfileB, COLLECT(ProfileB2), rel, relB
LIMIT 25
知道如何优化查询吗?
答案 0 :(得分:6)
您正在使用不需要的WHERE
子句。我们来看看第一个例子:
WHERE User-->ProfileA-->ProfileB
此子句说“仅将结果限制为与ProfileA有关系的用户,而ProfileA本身与ProfileB有关系”。但是,您的匹配子句已经确保这一点。你正在浪费CPU周期来重新验证已经存在的事情。
WITH ProfileA, rel, ProfileB
您没有进行任何类型的聚合,计算或重新分配,因此不需要此WITH
子句。没有它你可以继续。
WHERE relB IS NULL OR User-->ProfileA-->ProfileB<-->ProfileB2<--ProfileA2<--User
同样,你没有从这个WHERE
条款中获得任何价值。这个说“将结果限制在找不到relB的路径或者使用以下路径找到的路径......”然后列出MATCH
中完全相同的路径。
所以,删除所有那些无关的条款,你就明白了:
START User=node({source})
MATCH User-[:profile]->ProfileA-[rel:related]->ProfileB<-[?:me]->ProfileB2<-[relB?:related]-ProfileA2<-[:profile]-User
RETURN ProfileB, COLLECT(ProfileB2), rel, relB
LIMIT 25
试一试,看看性能是否更好。如果还不够,那么您可能需要在问题中添加更多信息 - 就我个人而言,我并不完全理解您的关系实际上是什么意思(例如,什么是“我”关系?它象征着什么?)
答案 1 :(得分:1)
这就是我解决它的方法:
START User=node({source})
MATCH User-[:profile]->ProfileA-[rel:related]->ProfileB<-[?:me]->ProfileB2-[relB?:related]-ProfileA2
WHERE relB IS NULL OR User-[:profile]->ProfileA2
RETURN ProfileB, COLLECT(ProfileB2), rel, relB
LIMIT 25
ProfileA2<-[:profile]-User
似乎产生了无限循环。
建议仍然受欢迎。