1

我正在做的是获取所有个人资料*与用户个人资料有特定直接关系的人*,如果这些个人资料有备用个人资料*获取那些以防用户备用个人资料*与它有关系。我还需要关系的方向。

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

这就是我的节点的关联方式:

用户-[:profile]->ProfileA-[:related]->ProfileB<-[?:me]->ProfileB2<-[?:related]-ProfileA2<-[:profile]-User

我的查询如下所示:

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

知道如何优化查询吗?


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

2 回答 2

6

您正在使用WHERE不需要的子句。我们以第一个为例:

WHERE User-->ProfileA-->ProfileB 

该子句说“仅将结果限制给与 ProfileA 有关系的用户,而 ProfileA 本身与 ProfileB 有关系”。但是,您的 match 子句已经保证了这一点。您正在浪费 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

尝试一下,看看性能是否更好。如果这还不够,那么您可能需要在您的问题中添加更多信息——就我自己而言,我并不完全理解您的关系的实际含义(例如,“我”关系是什么?它象征什么? )

于 2013-03-01T01:38:13.150 回答
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似乎产生了一个无限循环。

仍然欢迎提出建议。

于 2013-03-03T22:12:21.077 回答