【发布时间】:2017-01-28 23:00:02
【问题描述】:
我正在使用 Neo4j 做一个学校项目,但遇到了问题。我想通过他们的 ID 或索引号获取所有已申请参加考试并参加任何考试或注册的学生。我将学生和科目与考试联系起来,这是与属性 (STUDENT)-[EXAM]-(SUBJECT) 和/或 (STUDENT)-[REGISTRATION]-(EXAM) 的关系。 我需要 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
总而言之,学生是通过注册或考试或两者联系起来的,我需要为该学生获取索引号的所有这些关系。然后计算所有这些与科目的关系,因为学生参加考试的次数数据保存在与所述科目的关系考试中。此外,所有分数
【问题讨论】:
-
欢迎来到 Stack Overflow,感谢您提供示例数据集。一些建议:1.请在问题中添加
cypher标签,以便其他人更容易找到它,2.您在示例中的日期使用混合语法3.考试不及格的条件是什么?查询包含<5,但文本建议<6。 -
1.我将研究如何添加密码标签。 2. 在我们的评分系统中,6-10 为及格,如果有人不及格,他的分数被设置为低于 6,如果他试图通过并失败,则为 5,更低的是没有显示或其他什么。 3.学生要么失败,要么没有,关系是预先设定的。例如,我想要获取并查看哪些科目对所述学生来说最难,他试图通过哪些科目等等,并拥有所有可以使用的数据。我还可以看到,例如,在反向查询中,学生最难的科目等等。因此需要查看所有关系