【发布时间】:2015-03-30 11:55:29
【问题描述】:
我想弄清楚如何在 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
显然,我已经尝试过这样的查询,但它无法编译。因此,我想知道是否有类似的东西。
【问题讨论】:
-
你有什么解决办法吗?如果是,请发布您的查询作为答案。