【问题标题】:aggregate count changes when multiple returns多次返回时总计数发生变化
【发布时间】:2019-01-18 02:02:53
【问题描述】:

我正在通过 php 发送密码查询。

match (n:person)-[:watched]->(m:movie)
where m.Title in $mycollection
return count(distinct n.id);

这将返回观看过我收藏中电影的人数。 我实际上想返回名称列表,并且返回 n.name 工作正常。

当我尝试同时返回 n.name 和 count(distinct n.id) 时,我会丢失总计数并获得每行的计数。

match (n:person)-[:watched]->(m:movie)
where m.Title in $mycollection
return n.name, count(distinct n.id);

不起作用。每行的计数列显示为 1。

由于我使用的是php,我也尝试过:

$count = $result->getNodesCount();

无济于事。所以我使用php来计算数组。但是感觉 Cypher 应该可以做到吧?

【问题讨论】:

    标签: neo4j cypher


    【解决方案1】:

    return n.name, count(distinct n.name) 表示“返回每个不同的n.name 值及其不同值的数量”。该数字必须始终为 1,因为不同的值显然是不同的。

    如果您实际上是在寻找每个人与标题为 $mycollection 的电影发生关系的次数,请改为执行此操作(其中 count(*) 计算给定 n.name 匹配的次数):

    MATCH (n:person)-->(m:movie)
    WHERE m.Title in $mycollection
    RETURN n.name, count(*);
    

    请注意,上述查询省略了查询中的[watched] 模式,因为该语法(watched 之前没有冒号)根本没有过滤。它只是将关系分配给一个名为 watched 的变量,但该变量并未以其他方式使用,因此是多余的。

    如果您打算使用 watched 作为关系类型,请改为:

    MATCH (n:person)-[:watched]->(m:movie)
    WHERE m.Title in $mycollection
    RETURN n.name, count(*);
    

    这个修改后的查询返回每个人观看标题为$mycollection的电影的次数

    【讨论】:

    • 非常感谢您花时间回答。 count(*) 如果与 n.name 结合使用,也不会返回总计数。 count(*)、count(n) 和 count(distinct n.id) 在单独使用时都返回总计数,但当我还返回一个属性时返回 1。抱歉,我复制的时候忘记在冒号中写了——我确实在里面有。我只是觉得非常令人费解的是,当我进行查询并添加一个属性以返回计数时,我会得到不同的计数结果。计数是否取决于最接近的上下文?
    • 当属性包含在同一个RETURNWITH 子句中时,您误认为COUNT(*) 总是返回1。这一切都取决于您正在测试的确切数据。您需要研究documentation on aggregating functions,尤其是关于分组键。玩一些简单的例子应该会有所帮助。
    猜你喜欢
    • 2021-10-25
    • 1970-01-01
    • 1970-01-01
    • 2020-03-07
    • 1970-01-01
    • 2020-10-12
    • 2014-09-04
    • 2013-12-25
    • 1970-01-01
    相关资源
    最近更新 更多