好的,我正在尝试弄清楚是否有一个查询可以给我类似于以下内容的内容:
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 中删除。