在 Neo4j 的 RETURN 子句中,是否有可能按真或假聚合布尔值?



好的,我正在尝试弄清楚是否有一个查询可以给我类似于以下内容的内容:

MATCH (practiceTest:PracticeTest)
RETURN count(distinct practiceTest.passed===true), count(distinct practiceTest.passed===false)

我知道这个查询不起作用,但我很好奇是否有办法做类似的事情,而不必写以下内容:

MATCH (practiceTest:PracticeTest)
WHERE practiceTest.passed = true
RETURN count(distinct practiceTest);
MATCH (practiceTest:PracticeTest)
WHERE practiceTest.passed = false
RETURN count(distinct practiceTest);

谢谢!

另一种方法

MATCH (p:PracticeTest)
WITH COLLECT(p.passed) AS results
RETURN SIZE([result IN results WHERE result=true]) AS num_passed,
SIZE([result IN results WHERE result=false]) AS num_failed

您可以在true练习测试时计算CASE语句的结果,然后在 reulst 为假时再次计数。

MATCH (p:PracticeTest)
RETURN count(CASE WHEN p.passed = true THEN 1 END) AS num_true, count(CASE WHEN p.passed = false THEN 1 END) AS num_false

以下查询在时间和空间上都非常有效。它只进行一次聚合函数调用,只创建一个列表,并且只通过该列表进行一次传递:

MATCH (p:PracticeTest)
WITH COLLECT(p.passed) AS data
WITH data, REDUCE(ps = 0, x IN data | CASE WHEN x THEN ps+1 ELSE ps END) AS passes
RETURN passes, SIZE(data)-passes AS fails

注意:此查询不计算没有passed属性p节点。此外,passed值必须是布尔值。

返回布尔值的计数

如果只想返回通过或失败的计数,则可以使用以下方法:

MATCH (practiceTest:PracticeTest)
RETURN practiceTest.passed AS PassedTest,
count(practiceTest) AS Frequency

这将返回类似的东西

╒════════════╤═══════════╕
│"PassedTest"│"Frequency"│
╞════════════╪═══════════╡
│true        │17682      │
├────────────┼───────────┤
│false       │27152      │
└────────────┴───────────┘

将布尔值转换为 1/0

如果要按照某些回复的建议将 True/False 转换为 1/0,则可以将布尔值转换为整数。

在 Neo4j v4.3+ 中,toInteger(( 函数将布尔值转换为 1/0。如果您使用的是早期版本,则可以使用 apoc.convert.toInteger((,但请注意,该函数已弃用,将在 5.0 中删除。

最新更新