2013-11-24 46 views
0

我也是Neo4j 2.0的新手,並嘗試獲得兩個屬性總和(與重量)並將它們最終組合爲一個總重量。Neo4j 2.0 - 總結不同的屬性權重 - WHERE子句的問題

因此,首先在單獨的查詢,所以你可以看到正確的總和加權

1)語言=法語,能力超過6(規模1-10):

MATCH (User)-[Speaks]->(Language) 
WHERE Language.language = 'French' AND Speaks.proficiency >=6 
RETURN User.name, SUM(
CASE 
    WHEN Language.language='French' THEN Speaks.proficiency*3 
    END)*0.1 AS TOTAL_Language 
ORDER BY TOTAL_Language DESC 

    User.name TOTAL_Language 
    David  3 
    Marion  1.8 

2)技能=財經(1),銀行,IT,市場營銷權重= 1:

MATCH (User)-[IsSkilledIn]->(Skill) 
WHERE Skill.skill IN ['Finance','Banking','IT','Marketing'] 
RETURN User.name, SUM(
CASE 
    WHEN Skill.skill='Finance' THEN IsSkilledIn.weight*10 
    WHEN Skill.skill='Banking' THEN IsSkilledIn.weight*5   
    WHEN Skill.skill='IT' THEN IsSkilledIn.weight*8 
    WHEN Skill.skill='Marketing' THEN IsSkilledIn.weight*1 
END)*0.1 AS TOTAL_Skill 
ORDER BY TOTAL_Skill DESC 

    User.name TOTAL_Skill 
    Eric   1.5 
    Marion   0.9 
    David   0.8 
    Hans   0.8 

所以現在,我試圖將這些查詢合併成這樣:

3)法國> = 6個技能,財政,金融,IT,市場營銷:

MATCH (User)-[Speaks]->(Language) , (User)-[IsSkilledIn]->(Skill) 
WHERE Language.language = 'French' AND Speaks.proficiency >=6 AND Skill.skill IN ['Finance','Banking','IT','Marketing'] 
RETURN User.name, SUM(
CASE 
    WHEN Language.language='French' THEN Speaks.proficiency*3 
    END)*0.1 AS TOTAL_Language, 
SUM(
CASE 
    WHEN Skill.skill='Finance' THEN IsSkilledIn.weight*10 
    WHEN Skill.skill='Banking' THEN IsSkilledIn.weight*5   
    WHEN Skill.skill='IT' THEN IsSkilledIn.weight*8 
    WHEN Skill.skill='Marketing' THEN IsSkilledIn.weight*1 
END)*0.1 AS TOTAL_Skill 
ORDER BY TOTAL_Skill DESC 

現在,我得到這些結果:

 User.name TOTAL_Language TOTAL_Skill 
    Marion   3.6   0.9 
    David   3   0.8 

馬里昂TOTAL_Language是兩倍的第一個答案。 所以我查了什麼可能是錯的,它必須在WHERE子句中,但我不知道什麼是錯的......任何想法?

而且我怎麼總結這兩個結果呢?

非常感謝您的投入!

+0

將是巨大的有一個在控制檯或類似的示例圖 –

回答

1

啊,我看到了問題。你最終得到兩個結果而不是一個結果,因爲你的比賽匹配兩個技能記錄。你需要做的是將兩個查詢放在一起,所以和數是分開計算的。

MATCH (User)-[Speaks]->(Language) 
WHERE Language.language = 'French' AND Speaks.proficiency >=6 
WITH User, SUM(
CASE 
    WHEN Language.language='French' THEN Speaks.proficiency*3 
    END)*0.1 AS TOTAL_Language 
MATCH (User)-[IsSkilledIn]->(Skill) 
WHERE Skill.skill IN ['Finance','Banking','IT','Marketing'] 
RETURN User.name, TOTAL_Language, SUM(
CASE 
    WHEN Skill.skill='Finance' THEN IsSkilledIn.weight*10 
    WHEN Skill.skill='Banking' THEN IsSkilledIn.weight*5   
    WHEN Skill.skill='IT' THEN IsSkilledIn.weight*8 
    WHEN Skill.skill='Marketing' THEN IsSkilledIn.weight*1 
END)*0.1 AS TOTAL_Skill 
ORDER BY TOTAL_Skill DESC 
1

另一種選擇是使用一個查詢做到這一點的是,但收集技能的人,總結技能重量的收集,而不是概括行,

MATCH (User)-[Speaks]->(Language), (User)-[IsSkilledIn]->(Skill) 
WHERE Language.language = 'French' 
AND Speaks.proficiency >=6 
AND Skill.skill IN ['Finance','Banking','IT','Marketing'] 
WITH User.name as userName, 
    (CASE WHEN Language.language='French' 
      THEN Speaks.proficiency*3 END) as languageProficiency, 
     collect(CASE 
       WHEN Skill.skill='Finance' THEN IsSkilledIn.weight*10 
       WHEN Skill.skill='Banking' THEN IsSkilledIn.weight*5 
       WHEN Skill.skill='IT' THEN IsSkilledIn.weight*8 
       WHEN Skill.skill='Marketing' THEN IsSkilledIn.weight*1 
       END) as skillWeightCollection 
RETURN userName, 
     sum(languageProficiency)*0.1 as TOTAL_Language, 
     reduce(totalSkill = 0, skillWeight in skillWeightCollection | 
       totalSkill + skillWeight) * 0.1 as TOTAL_SKILL 
+0

嘿麗莎,你可以聯繫我在納米技術點com的邁克爾?謝謝! –