Вычислить долю записей, которые соответствуют определенному критерию в шифровальной агрегации

#neo4j #cypher

#neo4j #cypher

Вопрос:

Представьте, что у меня есть график, который я запрашиваю следующим образом:

 MATCH (n:Class)-[:HAS]->(i:Item)
RETURN n.id as Id1, i.id as IdI, i.isWhatever as Criterion
  

получение

 IdC   IdI  Criterion                                   
  A     1      False
  A     2       True
  B     1       True
  

Мой желаемый результат был бы

 IdC   ratioCriterion                                   
  A              0.5
  B                1
  

Я предполагаю, что этот вопрос сводится к тому, как я могу суммировать список логических значений в cypher. Часть деления на размер агрегации проста. Я имею в виду, что полный запрос будет выглядеть как:

 MATCH (n:Class)-[:HAS]->(i:Item)
WITH n.id as Id1, count_number_of_True_values / count(*) as ratioCriterion
  

Но я просто не знаю, как записать count_number_of_True_values бит.

Ответ №1:

Вы ищете этот запрос :

 MATCH (n:Class)-[:HAS]->(i:Item)
WITH n.id as Id1, i.id as IdI, i.isWhatever as Criterion
WITH Id1, CASE WHEN Criterion  THEN 1 ELSE 0 END AS numCrit
WITH Id1, collect(numCrit) AS crits
RETURN Id1, reduce(s = 0, x IN crits | s   x)/toFloat(size(crits))
  

Я делаю много WITH , чтобы показать вам различные шаги.

Приветствия

Комментарии:

1. Большое спасибо. Я думаю, что для удобства чтения я бы просто удалил вторую строку и написал вторую так: WITH n.id as Id1, CASE WHEN i.isWhatever THEN 1 ELSE 0 END AS numCrit .