我正在用Neo4j做一个学校项目,遇到了一个问题。我想让所有已申请考试和参加任何考试或注册的学生,通过他们的ID或索引号码。我把学生和科目与考试联系起来,这是与属性(学生)-考试-(科目)和/或(学生)-注册-(考试)的关系。我需要一个学生的id,所有的连接,该学生与主题在一个查询。数据库如下所示:
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分的学生都没有通过考试。所以我掌握了大量的信息,我打算在人际关系中充分利用它。再乘以科目和考试的数量,复杂性就会上升。
发布于 2017-01-29 07:41:53
我还没有完全理解你的要求,但有几点建议:
MATCH子句来选择学生一次,并在以后重用该变量。{indexnumber: 12000}子句中添加MATCH来缩短代码,而不是向WHERE添加条件。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 examRegistrationshttps://stackoverflow.com/questions/41915814
复制相似问题