2017-12-20 18 views
1

私は、学生と評価を関連付けるグラフがあるとします。neo4j cypher - 2つのグループ化されたクエリ(カラム1 /カラム2)の結果を分割する

(:student)-[:assessed_on]->(:assessment) 

評価ノードには、その評価で学生がどのように実行したかを示すプロパティが含まれています。たとえば、

学生ノードには、学生が出席する学校を示すプロパティが含まれています。例えば、

school_name: 'school_of_rock' 

は、私はこのクエリを使用することができる分子を取得するには50

上で獲得し、各学校からの学生の割合を返すように望んでいたとします

MATCH (s:student)-[:assessed_on]->(a:assessment) 
WHERE a.math_score>50 
RETURN s.school_name as school, count(a) as numerator 
ORDER BY school 

school    numerator: 
------    --------- 
school_of_rock  24 
school_of_jazz  40 
school_of_country 12 

を取得するには分母私は同じことをすることができますが、合計を得るためにWHERE句を取り出して返します:

school    denominator: 
------    --------- 
school_of_rock  48 
school_of_jazz  50 
school_of_country 48 

しかし私は1つのクエリで探していることは(単に分子/分母である)以下の結果である:私はこれを試してみました

school    result: 
------    --------- 
school_of_rock  .5 
school_of_jazz  .8 
school_of_country .25 

MATCH (s:student)-[:assessed_with]->(a:assessment) 
WHERE a.math_score>50 
WITH s.school_name as school, count(a) as numerator 
MATCH (s:student)-[:assessed_with]->(a:assessment) 
RETURN school, numerator/count(a) as proportion_above_50 

しかし、分子はときに正しいされていません私は明らかに何か間違っているので、クエリを組み合わせます。どんな助けもありがとう。

答えて

1

Cypherは、自然言語に非常に似ています。だからあなたは言う:私はノードの総数を数えます;それから私のために必要なものを選んでください。必要な数を合計で割ったものです。例:

MATCH (s:student)-[:assessed_on]->(a:assessment) 
WITH s.school_name as school, 
    collect(a) as allNodes 
WITH school, 
    size(FILTER(a in allNodes WHERE a.math_score > 0.5)) as top, 
    size(allNodes)*1.0 as bottom 
RETURN school, 
     top/bottom as proportion_above_50 
ORDER BY school 
+0

これは私が探していたものです。素晴らしい。どうもありがとうございました。 – campo

関連する問題