我运行类似的查询,首先返回节点
PROFILE
MATCH (me:USER{userId:"1"})-[:in_group]->(group), (group)<-[:in_group]-(other)
return group, collect(other) as participants
第一个查询执行计划有105个db命中
第二个查询的不同之处仅在于它返回节点的属性:
PROFILE
MATCH (me:USER{userId:"1"})-[:in_group]->(group), (group)<-[:in_group]-(other)
return group.groupId, collect(other.userId) as participants
使用更长的执行计划结束,使用255 db命中:
如果已经提取了节点,为什么我们需要这种投影和急切聚合来访问db?它们是否没有属性?如果是这样,为什么我们在第一种情况下没有额外的数据库命中,因为返回的节点及其属性。
UPD:
我对groupId和userId有唯一的约束。 :schema
的结果:
Indexes
ON :USER(userId) ONLINE (for uniqueness constraint)
ON :GROUP(groupId) ONLINE (for uniqueness constraint)
Constraints
ON (user:USER) ASSERT user.userId IS UNIQUE
ON (group:GROUP) ASSERT group.groupId IS UNIQUE