我正在使用Neo4j做一个学校项目并遇到了问题。我想通过他们的身份证或索引号码让所有申请参加考试并参加考试或注册的学生。我将学生和科目与考试联系起来,考试是与学生的关系(学生) - [考试] - (主题)和/或(学生) - [注册] - (考试)。 我需要1个id的学生,所述学生在1个查询中与受试者的所有联系。 数据库如下所示:
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)
我使用的查询就是这个,但是给了我两倍的数据并且经常是错误的。我需要一名特定的学生参加每门考试的所有考试和注册,这样我就可以获得一份完整的名单,列出参加和/或通过考试,注册或者从未注册并参加考试的人员和时间。
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)
我还没有完全理解你的要求,但有几点建议:
MATCH
子句选择学生一次并稍后重复使用该变量。{indexnumber: 12000}
子句中添加MATCH
而不是向WHERE
添加条件来缩短代码。collect(distinct c + c1)
包含每个c1
元素的c
集合,这可能不是您想要的。因此,为了收集失败和成功的考试以及注册,我会运行这样的查询(按照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