我想弄清楚如何在Cypher中汇总Union的结果。 以下示例可以在Cypher snippets live中执行:
MATCH (n:Crew)-[r:KNOWS]->m
WHERE n.name='Neo'
RETURN n AS name,m
UNION
MATCH (n:Crew)-[r:KNOWS]->m
WHERE n.name='Morpheus'
RETURN n AS name,m
此查询显示三行,因为Neo知道一个人和Morpheus两个(注意查询中的方向链接)。假设我们想要聚合已知的人。我们可以这样做:
MATCH (n:Crew)-[r:KNOWS]->m
WHERE n.name='Neo'
RETURN n AS name,count(m) AS c
UNION
MATCH (n:Crew)-[r:KNOWS]->m
WHERE n.name='Morpheus'
RETURN n AS name,count(m) AS c
到目前为止,我们还不错。但是,如果我们想要聚合(隐藏的Group By)在第一个和第二个查询中,我不知道如何解决问题。由于在前一种情况下不会发生这种情况,为了解释我们假设我们有以下查询:
MATCH (n:Label1)-[:label3]->(:label4)
RETURN n.name as name, n.age as value
和
MATCH (m:Label2)-[:label5]->(:label6)
RETURN m.surname as name, m.k as value
返回
John, 12
Sam, 17
和
John, 78
Tim, 12
是否可以执行类似
的操作(
MATCH (n:Label1)-[:label3]->(:label4)
RETURN n.name as name, n.age as value
UNION ALL
MATCH (m:Label2)-[:label5]->(:label6)
RETURN m.surname as name, m.k as value
)
RETURN name, sum(value)
获取下面的结果?
John, 90
Sam, 17
Tim, 12
显然,我已经尝试过这样的查询而且它没有编译。因此,我想知道是否有类似的东西。
答案 0 :(得分:0)
截至今天,您无法对UNION
的合并结果集进行任何聚合。
唯一的方法是通过避免UNION
支持更复杂的WHERE
来欺骗它:
MATCH (n)-[r:label3|label5]->(m)
WHERE ((type(r)='label3') AND ("Label1" in labels(n)) AND ("label4" in labels(m))) OR
((type(r)='label5') AND ("Label2" in labels(n)) AND ("label6" in labels(m)))
RETURN n.name as name, sum(n.age)