neo4j 以下(关于“WITH”)有什么区别?

m3eecexj  于 2022-11-05  发布在  其他
关注(0)|答案(2)|浏览(147)

我努力想弄明白下面的区别是什么:

match (n:Crew)-[:KNOWS]-()
with n,collect(DISTINCT n) AS mygroup 
match (m:Crew) 
where not m in mygroup 
return count(*)

以及:

match (n:Crew)-[:KNOWS]-()
with collect(DISTINCT n) AS mygroup 
match (m:Crew) 
where not m in mygroup 
return count(*)

在第一种情况下,WITH通过了什么,在第二种情况下,WITH通过了什么?以及它对答案有何影响。

polhcujo

polhcujo1#

第一个选项将同时返回nmygroup,而第二个选项将只返回mygroupn在查询的其余部分中不使用,因此不需要。使用第一个选项不仅是多余的,而且根据cardinality的概念,它可能还会多次运行查询的其余部分。因为行数将是x1M4N1X的计数,其可能大于x1M5N1X的计数。

rxztt3cl

rxztt3cl2#

这就是区别。
在“with n,collect(DISTINCT n)AS mygroup”中,您将获得每个船员和包含该船员的集合。它类似于SQL group by子句,其中您按n分组,然后聚合不同的n。例如;

n    collect(n)
 row1 crewA  [crewA]
 row2 crewB  [crewB]
 row3 crewZ  [crewZ]

同时,如果在查询中使用collect(DISTINCT n)而不使用n,则它将简单地聚合所有不同的n。因此,结果只是一组crews(crewA...到crewZ)。

row 1 [crewA, crewB, crewZ]

然后返回有多少节点不属于该组(返回count(*))。
我有一个建议,这个查询要好得多。把你的查询改成这个。它会给予你同样的结果,关于有多少个机组节点没有关系(:KNOWS)。它会计算没有关系(:KNOWS)的节点数(m),

match (m:Crew) 
where not exists ((m)-[:KNOWS]-())
return count(distinct m)

相关问题