需要记住的一些事情:
密码运算符对每一行执行。
尽量不要将 UNWIND 视为循环结构。这一切所做的就是对行上的变量与列表的元素进行笛卡尔积。
因此,当您展开列表时,列表中的每个元素都会有一行,以及该行中已经存在的所有变量。然后,当发生针对每一行执行的后续操作(例如 MATCH 或 WITH)时,因此它看起来像一个循环结构,但实际上不是。
无论如何,这里不需要 UNWIND。对于两节点匹配模式,tail(nodes(p))
将只是一个仅包含最后一个节点的单元素列表。它没有改变行数(因为列表大小为 1),并且不会在这里为您提供帮助。
这个查询应该效果更好:
MATCH (h:HashTag)
WITH h LIMIT 3 // best to limit early to avoid doing unnecessary work
WITH h, h.tag as hashtagName, size((h)-[:TAG]->()) as hashtagCount, [(h)-[:TAG]->(r:RateableEntity) | r.id] as hashtagItems
WITH h {hashtagName, hashtagCount, hashtagItems} as entry
RETURN collect(entry) as hashtagList
EDIT
如果您想要按大小排列前 3 个主题标签,则可以使用下面修改后的查询:
MATCH (h:HashTag)
WITH h, size((h)-[:TAG]->()) as hashtagCount
ORDER BY hashtagCount DESC
LIMIT 3
WITH h, hashtagCount, h.tag as hashtagName, [(h)-[:TAG]->(r:RateableEntity) | r.id] as hashtagItems
WITH h {hashtagName, hashtagCount, hashtagItems} as entry
RETURN collect(entry) as hashtagList