2013-11-22 5 views
0

Я сделал этот запрос на Neo4j (Cypher):группы по и добавить значения в шифровальщика

match (Person)-[KNOWS]->(Comp) 
WHERE Comp.name='EN' OR Comp.name='FR' OR Comp.name='CUI' 
RETURN Person.fname, 
CASE Comp.name 
    WHEN 'EN' 
    THEN 5 
    WHEN 'FR' 
    THEN 3 
    WHEN 'CUI' 
    THEN 1 
    ELSE 0 END AS Points_Candidat 

мой результат:

Yves 3 

Yves 1 

Alina 3 

Alina 1 

David 5 

David 3 

Но я хочу, чтобы сгруппировать мой результат и просуммировать Points_Candidate для каждый человек. Я хочу получить ответ следующим образом:

Yves 4 

Alina 4 

David 8 

Как мне изменить свой запрос?

ответ

0

Вы можете получить сумму коллекции числовых значений с SUM, например, вы можете запустить его на своем предложении CASE,

MATCH (Person)-[KNOWS]->(Comp) 
WHERE Comp.name='EN' OR Comp.name='FR' OR Comp.name='CUI' 
RETURN Person.fname, SUM( 
    CASE Comp.name 
     WHEN 'EN' THEN 5 
     WHEN 'FR' THEN 3 
     WHEN 'CUI' THEN 1 
     ELSE 0 
    END 
) AS Points_Candidat 

Я не знаю, контекст, но я думаю, что из двух миноре изменения, которые дадут вам эквивалентный, но слегка обрезанный запрос: 1) поскольку три теста в предложении WHERE идентичны, за исключением проверенного значения, вы можете использовать оператор IN с набором значений вместо трех терминальной дизъюнкции, и 2), поскольку три значения CASE ... WHEN исчерпывают возможности того, что связано в предложении WHERE, все связанные узлы будут test true для одного из случаев, поэтому вам не нужен ELSE.

MATCH (Person)-[KNOWS]->(Comp) 
WHERE Comp.name IN ['EN' ,'FR','CUI'] 
RETURN Person.fname, SUM( 
    CASE Comp.name 
     WHEN 'EN' THEN 5 
     WHEN 'FR' THEN 3 
     WHEN 'CUI' THEN 1 
    END 
) AS Points_Candidat 

Вы также можете воспользоваться помощью меток и индексов, а если отображение Comp.name к значению не отличается от запроса для запроса вы можете добавить его в качестве свойства на Comp и RETURN Person.fname, SUM(Comp.Points_Candidat).

Смежные вопросы