【问题标题】:How to aggregate result of Union in Cypher?如何在 Cypher 中聚合 Union 的结果?
【发布时间】: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

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

【问题讨论】:

  • 你有什么解决办法吗?如果是,请发布您的查询作为答案。

标签: neo4j cypher


【解决方案1】:

截至今天,您无法对 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)

【讨论】:

  • 好的,我明白你的意思了。但是,您的答案并不完整,因为在我的示例中,这两个查询使用不同的属性(例如,年龄与 k,姓名与姓氏)。我认为使用 CASE 应该没问题,但我不知道该怎么做。
【解决方案2】:

如您所见here,您可以使用COLLECT 和UNWIND 子句:

MATCH (n:Crew)-[r:KNOWS]->(m)
WHERE n.name='Neo'
WITH COLLECT({name:n, id:ID(m)}) as rows

MATCH (n:Crew)-[r:KNOWS]->(m)
WHERE n.name='Morpheus'
WITH rows + COLLECT({name:n,id:ID(m)}) as allRows
UNWIND allRows as row
RETURN row.name, count(disntict(row.id))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-09
    • 1970-01-01
    • 2020-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多