Возможно ли в Neo4j в предложении RETURN агрегировать логические значения по true или false? - PullRequest
1 голос
/ 24 января 2020

Хорошо, я пытаюсь выяснить, есть ли запрос, который может дать мне что-то похожее на следующее:

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);

Спасибо!

Ответы [ 3 ]

2 голосов
/ 24 января 2020

другой подход

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
1 голос
/ 24 января 2020

Следующий запрос довольно эффективен во времени и пространстве. Он выполняет только один вызов агрегирующей функции, создает только один список и только один проход через этот список:

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

ПРИМЕЧАНИЕ. В этом запросе не учитывается p узлов, не имеющих * 1006. * имущество. Кроме того, значение passed должно быть логическим.

1 голос
/ 24 января 2020

Вы можете посчитать результат оператора CASE, когда для PracticeTest установлено значение true, а затем снова посчитать, когда результат равен false.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...