汇总后计算

时间:2020-06-05 17:46:37

标签: neo4j cypher

我是Neo4j的新手,我觉得自己陷入了一些简单的操作中,这些操作我会使用子查询在常规SQL中解决。

如何减去两个结果行?我将结果分组,我想返回它们之间的差异:

MATCH (seguidores:RelevantTwitterUser {location:"Madrid"})-[:FOLLOWS]->(seguidos:RelevantTwitterUser {location:"Barcelona"}) 
WITH COLLECT({origen:seguidores.location, user:seguidores.userId}) AS ROWS
MATCH (seguidores:RelevantTwitterUser {location:"Barcelona"})-[:FOLLOWS]->(seguidos:RelevantTwitterUser {location:"Madrid"}) 
WITH ROWS + COLLECT({origen:seguidores.location, user:seguidores.userId}) AS allRows
UNWIND allRows AS ROW
RETURN ROW.origen, COUNT(ROW.user)

输出:

output example

1 个答案:

答案 0 :(得分:1)

使用aggregating functions

WITH "Madrid" AS loc1, "Barcelona" AS loc2
MATCH (:RelevantTwitterUser{location:loc1})-[:FOLLOWS]->(:RelevantTwitterUser{location:loc2})
WITH loc1, loc2, COUNT(*) AS count1
MATCH (:RelevantTwitterUser{location:loc2})-[:FOLLOWS]->(:RelevantTwitterUser{location:loc1})
WITH loc1, loc2, count1, COUNT(*) AS count2
RETURN loc1, count1, loc2, count2, count1 - count2 AS diff

如果您想了解此查询的工作原理,并应该阅读aggregating functions(如COUNT)上的文档,并在需要修改此查询时避免计数错误。了解grouping keys(例如最后一个locs子句中的countWITH)如何影响聚合函数的行为尤其重要。

使用SIZE() on pattern expressions

WITH "Madrid" AS loc1, "Barcelona" AS loc2
WITH loc1, loc2,
  SIZE((:RelevantTwitterUser{location:loc1})-[:FOLLOWS]->(:RelevantTwitterUser{location:loc2})) AS count1,
  SIZE((:RelevantTwitterUser{location:loc2})-[:FOLLOWS]->(:RelevantTwitterUser{location:loc1})) AS count2
RETURN loc1, count1, loc2, count2, count1 - count2 AS diff
相关问题