我们发现编写和维护Cypher查询在收集项目时有点痛苦.我们经常想要收集一些内容并丢弃原始节点.请参阅以下示例:
MATCH (p)-[]-(c)
WITH p, collect(c) as c
RETURN p, c
以上看起来并不太糟糕.问题是p我们想要保留的字段的明确命名.随着我们添加更多MATCH和OPTIONAL MATCH聚合,这成为可维护性的噩梦.我们不能在不改变我们引用的所有字段的情况下重新排序MATCH/ WITH配对.当我们这样做时collect,我们总是想要丢弃原始节点.
WITH有一个*可以使用,但这将包括我们正在收集的领域,我们不能取代价值.
MATCH (p)-[]-(c)
WITH *, collect(c) as c
RETURN p, c
有没有办法在WITH声明中排除某些内容而不明确命名应包含的内容?像下面这样的东西?
MATCH (p)-[]-(c)
WITH *, without(c), collect(c) as cs
RETURN p, cs
我认为没有办法做到这一点,并且考虑到 Cypher 中聚合的工作方式,我认为这会导致比解决问题更多的麻烦。
请记住,聚合仅对形成分组键的非聚合列有意义。我发现在WITH子句中显式包含变量是非常有价值的,因为它可以让您一目了然地了解范围内的字段,从而为您提供聚合列的上下文。
如果没有这个,您将面临错误行为的风险,因为您忘记排除的范围内可能存在变量,这将改变聚合的含义和计算。