首页 > 解决方案 > 在 Neo4j 中使用 Cypher 对返回的列中的所有值求和的方法

问题描述

我编写了以下 Cypher 查询来从一组订单中获取某个项目的频率。

MATCH (t:Trans)-[r:CONTAINS]->(i:Item) 
WITH i,COUNT(*) AS CNT,size(collect(t)) as NumTransactions 
RETURN i.ITEM_ID as item, NumTransactions, NumTransactions/CNT as support

我得到一个这样的表作为我的输出

Item NumTransactions Support
A          2            1
B        1132           1
C        2049           1

等等。我的意思是将每个 NumTransaction 除以事务总数。即整个 num transactions 列的总和,以获得支持,但它自己划分 NumTransactions。有人可以指出正确的功能(如果存在)或这样做的方法吗?

标签: neo4jcypher

解决方案


这应该有效:

MATCH (:Trans)-[:CONTAINS]->(i:Item) 
WITH i, COUNT(*) as c
WITH COLLECT({i: i, c: c}) AS data
WITH data, REDUCE(s = 0.0, n IN data | s + n.c) AS total
UNWIND data AS d
RETURN d.i.ITEM_ID as item, d.c AS NumTransactions, d.c/total as support

顺便说一句,SIZE(COUNT(t))效率低下,因为它首先创建一个新的t节点集合,获取其大小,然后删除该集合。COUNT(t)会更有效率。

此外,给定您的MATCH子句,只要 each与给定的, (计算结果行数)t至多有一个关系,就会给您与 . 相同的结果。CONTAINSiCOUNT(*)COUNT(t)


推荐阅读