apoc.agg.multiStats

函数 Apoc 扩展

apoc.agg.multiStats(nodeOrRel, keys) - 返回多维聚合

签名

apoc.agg.multiStats(value :: NODE | RELATIONSHIP, keys :: LIST OF STRING) :: (MAP?)

输入参数

名称 类型 默认

节点 | 关系

null

使用示例

给定此数据集

CREATE (:Person { louvain: 596, neo4jImportId: "18349390", wcc: 48, lpa: 598, name: "aaa", another: 548}),
    (:Person { louvain: 596, neo4jImportId: "18349390", wcc: 48, lpa: 598, name: "eee", another: 549}),
    (:Person { louvain: 596, neo4jImportId: "18349390", wcc: 48, lpa: 598, name: "eee", another: 549}),
    (:Person { louvain: 597, neo4jImportId: "18349391", wcc: 48, lpa: 598, name: "eee", another: 549}),
    (:Person { louvain: 597, neo4jImportId: "18349392", wcc: 47, lpa: 596, name: "iii", another: 549}),
    (:Person { louvain: 597, neo4jImportId: "18349393", wcc: 47, lpa: 596, name: "iii", another: 549}),
    (:Person { louvain: 597, neo4jImportId: "18349394", wcc: 47, lpa: 596, name: "iii", another: 549}),
    (:Person { louvain: 597, neo4jImportId: "18349393", wcc: 47, lpa: 596, name: "iii", another: 10}),
    (:Person { louvain: 597, neo4jImportId: "18349394", wcc: 47, lpa: 596, name: "iii", another: 10})

我们可以基于属性键创建一个优化的多重聚合,类似于下面这个

MATCH (p:Person)
WITH p
CALL {
    WITH p
    MATCH (n:Person {louvain: p.louvain})
    RETURN sum(p.louvain) AS sumLouvain, avg(p.louvain) AS avgLouvain, count(p.louvain) AS countLouvain
}
CALL {
    WITH p
    MATCH (n:Person {wcc: p.wcc})
    RETURN sum(p.wcc) AS sumWcc, avg(p.wcc) AS avgWcc, count(p.wcc) AS countWcc
}
CALL {
    WITH p
    MATCH (n:Person {another: p.another})
    RETURN sum(p.another) AS sumAnother, avg(p.another) AS avgAnother, count(p.another) AS countAnother
}
CALL {
    WITH p
    MATCH (lpa:Person {lpa: p.lpa})
    RETURN sum(p.lpa) AS sumLpa, avg(p.lpa) AS avgLpa, count(p.lpa) AS countLpa
}
RETURN p.name,
    sumLouvain, avgLouvain, countLouvain,
    sumWcc, avgWcc, countWcc,
    sumAnother, avgAnother, countAnother,
    sumLpa, avgLpa, countLpa

执行以下查询

MATCH (p:Person)
RETURN apoc.agg.multiStats(p, ["lpa","wcc","louvain", "another"]) as output
表 1. 结果
输出
{
  "louvain" :{"596" :{"avg" :596.0, "count" :3, "sum" :1788}, "597" :{"avg" :597.0, "count" :6, "sum" :3582}},
  "wcc" :{"47" :{"avg" :47.0, "count" :5, "sum" :235}, "48" :{"avg" :48.0, "count" :4, "sum" :192}},
  "another" :{"548" :{"avg" :548.0, "count" :1, "sum" :548}, "549" :{"avg" :549.0, "count" :6, "sum" :3294}, "10" :{"avg" :10.0, "count" :2, "sum" :20}},
  "lpa" :{"596" :{"avg" :596.0, "count" :5, "sum" :2980}, "598" :{"avg" :598.0, "count" :4, "sum" :2392}}
}

例如,可以使用它以这种方式返回类似于 Cypher 的结果

MATCH (p:Person)
WITH apoc.agg.multiStats(p, ["lpa","wcc","louvain", "another"]) as data
MATCH (p:Person)
RETURN p.name,
    data.wcc[toString(p.wcc)].avg AS avgWcc,
    data.louvain[toString(p.louvain)].avg AS avgLouvain,
    data.lpa[toString(p.lpa)].avg AS avgLpa
表 2. 结果
avgWcc avgLouvain avgLpa

48.0

596.0

598.0

48.0

596.0

598.0

48.0

596.0

598.0

47.0

597.0

596.0

47.0

597.0

596.0

47.0

597.0

596.0

47.0

597.0

596.0

47.0

597.0

596.0

© . This site is unofficial and not affiliated with Neo4j, Inc.