【问题标题】:Neo4j multiple relationship queryNeo4j 多关系查询
【发布时间】: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.考试不及格的条件是什么?查询包含&lt;5,但文本建议&lt;6
  • 1.我将研究如何添加密码标签。 2. 在我们的评分系统中,6-10 为及格,如果有人不及格,他的分数被设置为低于 6,如果他试图通过并失败,则为 5,更低的是没有显示或其他什么。 3.学生要么失败,要么没有,关系是预先设定的。例如,我想要获取并查看哪些科目对所述学生来说最难,他试图通过哪些科目等等,并拥有所有可以使用的数据。我还可以看到,例如,在反向查询中,学生最难的科目等等。因此需要查看所有关系

标签: neo4j cypher


【解决方案1】:

我还没有完全理解您的要求,但有几点建议:

  • 使用MATCH 子句选择学生一次,然后再使用该变量。
  • 您可以通过在 MATCH 子句中包含 {indexnumber: 12000} 来缩短代码,而不是在 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 examRegistrations

【讨论】:

  • 鉴于您在收集它们之前匹配了所有这些,除非您收集它们的不同值,否则您将看到大量重复项。最好在每次可选比赛后沿途收集。
  • 我想在这个项目中测试和使用的是如何实现将学生和科目与关系联系起来,而不是在它们之间放置一个节点,而是直接将它们连接到所述科目。我希望通过收集考试注册数量(学生尝试通过考试的次数)来获取信息,并且在这些关系中,如果他未能在考试中出现,则在这些关系中是尝试日期或没有日期,如果通过或失败也是如此在连接考试中,我也可以在哪里看到日期,最后是哪个科目,哪个是节点。所以我想在 1 个查询中获取所有这些信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-18
  • 2021-09-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多