获取neo4j中多个属性的计数

时间:2018-11-01 22:31:14

标签: neo4j cypher

我正在尝试将2个密码合并为一个,但没有成功。

我需要获取在同一密码中彼此唯一的多个属性的计数。

EX 1:

Match (n)
RETURN n.foo, count(*) AS count

EX 2:

Match (n)
RETURN n.bar, count(*) AS count

我希望我能同时运行两个:

Match (n)
RETURN n.foo, count(*) AS fooCount, n.bar, count(*) AS barCount

但是,这两者返回的计数与找到两者匹配的位置的计数相同。不是我想要的。

所以一直在寻找一种将它们分组为唯一的方法,例如:

Match (n)
RETURN {n.foo, count(*) AS fooCount}, {n.bar, count(*) AS barCount}

很明显,这不是有效的语法,但显示了我要执行的操作。

在此方面的任何帮助当然都值得赞赏。

3 个答案:

答案 0 :(得分:4)

最好背靠背执行此操作,对于这种查询,一次执行不是一个好主意,因为聚合对您不利。

您可以尝试以下方法:

const char*

答案 1 :(得分:1)

由于您要汇总单独的查询结果,因此也可以使用UNION作为同时返回两者的快速简便的方法。

Match (n)
RETURN "foo" as type, n.foo as value, count(*) AS count
UNION ALL
Match (n)
RETURN "bar" as type, n.bar as value, count(*) AS count

仅需注意一点,UNION的两个返回都必须具有相同的列名。另外,示例中的“类型”列不是必需的,但是它显示了如果麻烦的查询没有相同数量的返回列,则如何添加填充符。 (或者,如果您想知道结果来自哪个查询。)如果存在一个“ foo”和“ bar”具有相同的值和计数,则UNION ALL将同时保留这两个值,并且UNION将删除重复项(如果删除)类型列)。

答案 2 :(得分:0)

也许它已经过时了,但以防万一有人需要它,我找到了另一种使用 APOC 函数的方法,该方法可以避免多次运行相同的 MATCH (n)。在你的情况下,它可能是这样的:

MATCH (n)
WITH collect(n.bar) as bars, collect(n.foo) as foos
WITH apoc.coll.frequenciesAsMap(bars) as barCounts, apoc.coll.frequenciesAsMap(foos) as fooCounts
RETURN barCounts, fooCounts

单场比赛,多场比赛。

希望它可以帮助某人!