如何在Cypher中汇总Union的结果?

时间:2015-03-30 11:55:29

标签: neo4j cypher

我想弄清楚如何在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

显然,我已经尝试过这样的查询而且它没有编译。因此,我想知道是否有类似的东西。

1 个答案:

答案 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)
相关问题