2017-01-28 10 views
0

Neo4jを使用して学校プロジェクトを行っていて、問題が発生しました。私は、申請したすべての生徒に試験を受けさせ、試験や登録をIDまたはインデックス番号で受け取りたいと思います。私は、学生(被験者) - [試験] - (被験者) - (登録) - (試験)との関係である受験生と被験者を接続しました。 私はIDで1人の生徒、1人の質問で上記の生徒と被験者とのすべてのつながりが必要です。 データベースは次のようになります。Neo4j複数関係クエリ

MERGE (std5:STUDENT { name:'Nola', surname:'Joan', indexnumber:12000, semester:'I' }) 
MERGE (std4:STUDENT { name:'Pola', surname:'Moan', indexnumber:12001, semester:'II' }) 

MERGE (sub1:SUBJECT { name:'Databases', semester:'VII' }) 
MERGE (sub2:SUBJECT { name:'Advanced Databases', semester:'VIII' }) 

MERGE (std5) - [ :EXAM { signed:' ' , mark:6 , date:'12.01.2017.' }] -> (sub1)//mark 6 is passing 
MERGE (std4) - [ :EXAM { signed:' ' , mark:5 , date:'12.01.2017.' }] -> (sub1) 

MERGE (std5) - [ :REGISTRATION {date:"2/11/2015", charge:0, term:'June'}] -> (sub1) 

MERGE (std5) - [ :REGISTRATION {date:"2/11/2016", charge:0, term:'June'}] -> (sub1) 

MERGE (std4) - [ :REGISTRATION {date:"2/11/2015", charge:0, term:'June'}] -> (sub2) 

私が使用したクエリは、この1ですが、私は二重のデータを与え、多くの場合、それは間違っています。私は特定の学生がこれらの試験のすべての試験と登録を受ける必要があるので、試験に合格した者、登録した者、試験に合格しなかったかどうかの完全なリストを得ることができます。

OPTIONAL MATCH (p:STUDENT) - [d:EXAM] - (c:SUBJECT) 

WHERE p.indexnumber = 12000 and d.mark<5 //failing grade 

WITH collect (distinct c) as c1,d 

OPTIONAL MATCH (p:STUDENT) - [b11:EXAM] - (c:SUBJECT) 

WHERE p.indexnumber = 12000 

WITH p , count(c) as rels, collect(b11) as exams,d,collect(distinct c +c1) as c2 

RETURN p, c2, d, rels , exams 

だから登録や試験のいずれかによって、学生が接続されている、要約、またはその両方ために、私は、インデックス番号の言った学生のためのすべてのそれらの関係を取得する必要があります。次に、被験者との関係をすべて集計すると、被験者が何回試験を受けたかのデータが、被験者の関係試験に保存されるためです。また、マーク< 6の生徒はすべて試験に合格しませんでした。だから私はたくさんの情報を保持しており、私は関係でそれを完全に使うつもりです。件名と試験の数でこれを掛け合わせると、複雑さが増しました。

+0

ようこそスタックオーバーフローとに感謝します例示的なデータセットを提供する。いくつかの提案:1.質問に「cypher」タグを追加して、他の人が簡単に見つけられるようにしてください。2.例の日付はミックス構文を使用しています。3.試験に失敗する条件は何ですか?クエリは '<5'を含みますが、テキストは' <6'を示唆しています。 –

+0

1.私はcypherタグを追加する方法を調べます。 2.グレーディング・システムでは、6-10が合格マークであり、誰かが失敗した場合は6よりも低く設定されています.5が合格しなかった場合は失敗しました。 3.生徒は失敗したかしなかったか、事前に関係が設定されています。私が欲しかったのは、例えば、どの生徒がこの生徒にとって最も難しいか、彼が渡そうとした科目など、どのような科目を扱うか、そしてそのデータをすべて扱うかどうかなどを見て、見ることです。また、例えば逆の質問では、どの科目が最も難しいと感じるかなどを見ることができます。したがって、すべての関係を見る必要があります。 – xacegod

答えて

1

私はまだ完全にあなたの要件を理解していないが、提案のカップル:

  • は、かつての学生を選択するためのMATCH句を使用し、後でその変数を再利用します。
  • WHEREに条件を追加する代わりに、{indexnumber: 12000}MATCH句に含めてコードを短縮することができます。
  • collect(distinct c + c1)を使用すると、c要素ごとにc1コレクションが含まれますが、これはおそらくあなたが望むものではありません。 (InverseFalconにより示唆されるように更新)

ので、登録と一緒に、私はこのようなクエリを実行したい、失敗と成功の試験を収集します

MATCH (p:STUDENT {indexnumber: 12000}) 
OPTIONAL MATCH (p) - [e1:EXAM] -> (c1:SUBJECT) 
WHERE e1.mark < 5 
WITH p, collect(e1) AS failedExams 
OPTIONAL MATCH (p) - [e2:EXAM] -> (c2:SUBJECT) 
WHERE e2.mark >= 5 
WITH p, failedExams, collect(e2) AS successfulExams 
OPTIONAL MATCH (p) - [e3:REGISTRATION] -> (c3:SUBJECT) 
RETURN failedExams, successfulExams, collect(e3) AS examRegistrations 
+1

あなたがそれらを収集する前にこれらのすべてを照合しているとすれば、重複した値を収集しない限り、複製されます。オプションのマッチのあとに、それに沿って収集する方がよい。 – InverseFalcon

+0

このプロジェクトでテストして使用したかったことは、学生と被験者の間をノードにするのではなく、被験者に直接接続するのではなく、学生と被験者を人間関係で結ぶ方法でした。私は試験に合格する人数(学生が何回試験に合格しようとしたか)を収集して情報を得ることを望んでいました。私は日付を見ることができます接続の試験では、最後にどのノード、ノードです。だから私は1つのクエリですべての情報を取得したい。 – xacegod