优化Neo4j Cypher查询

时间:2013-02-28 22:26:19

标签: neo4j cypher

我正在做的是获取与用户个人资料 *具有特定定向关系的所有个人资料 *,如果他们有备用个人资料< / 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

知道如何优化查询吗?


  • 个人资料:ProfileB
  • 用户个人资料:ProfileA
  • 备用资料:ProfileB2
  • 用户备用个人资料:ProfileA2

2 个答案:

答案 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似乎产生了无限循环。

建议仍然受欢迎。