优化Neo4j Cypher查询

web*_*jay 1 neo4j cypher

我正在做的是获取所有与用户配置文件*具有特定定向关系的配置文件*,如果这些配置文件具有备用配置文件*,则在用户备用配置文件*与其关联时获取这些配置文件.我也需要关系的方向.

我的问题是,大约10000个节点需要大约5秒钟来获取数据.我有节点和关系的自动索引.

这是我的节点相关的方式:

用户 - [:简介] - >配置文件A - [:相关] - >概貌< - [?:我] - > ProfileB2 < - [?:相关] -ProfileA2 < - [:资料] - 用户

我的查询如下所示:

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
Run Code Online (Sandbox Code Playgroud)

知道如何优化查询吗?


  • 个人资料:ProfileB
  • 用户个人资料:ProfileA
  • 备用配置文件:ProfileB2
  • 用户备用配置文件:ProfileA2

ean*_*533 6

您正在使用WHERE不需要的子句.我们来看看第一个例子:

WHERE User-->ProfileA-->ProfileB 
Run Code Online (Sandbox Code Playgroud)

该子句说"仅将结果限制为与ProfileA有关系的用户,而ProfileA本身与ProfileB有关系".但是,您的匹配子句已经确保这一点.你正在浪费CPU周期来重新验证已经存在的东西.

WITH ProfileA, rel, ProfileB 
Run Code Online (Sandbox Code Playgroud)

您没有进行任何类型的聚合,计算或重新分配,因此不需要此WITH子句.没有它你可以继续.

WHERE relB IS NULL OR User-->ProfileA-->ProfileB<-->ProfileB2<--ProfileA2<--User
Run Code Online (Sandbox Code Playgroud)

同样,你没有从这个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
Run Code Online (Sandbox Code Playgroud)

试试看,看看性能是否更好.如果这还不够,那么你可能需要在你的问题中添加更多信息 - 就我自己而言,我并不完全理解你的关系究竟意味着什么(例如,什么是"我"关系?它象征着什么? )