我正在尝试将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}
很明显,这不是有效的语法,但显示了我要执行的操作。
在此方面的任何帮助当然都值得赞赏。
答案 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
单场比赛,多场比赛。
希望它可以帮助某人!