Cypher - 添加多个连接

Cypher - Add multiple connections

我有 2 个节点:

学生和科目。

我希望能够使用密码查询同时将多个学生姓名添加到多个科目。 到目前为止,我已经通过遍历学生和科目的名称列表并为每个人执行查询来完成此操作。但是有没有办法在查询本身中做同样的事情?

这是我用于将 1 名学生添加到 1 个科目的查询:

 MATCH 
 (s:Student)-[:STUDENT_BELONGS_TO]->(c:Classroom),
 (u:Subjects)-[:SUBJECTS_TAUGHT_IN]->(c:Classroom)
  WHERE
   s.id = ${"$"}studentId
   AND c.id = ${"$"}classroomId
   AND u.name = ${"$"}subjectNames
   AND NOT (s)-[:IN_SUBJECT]->(u)
   CREATE (s)-[:IN_SUBJECT]->(u)

所以我希望能够一次接收多个 subjectNames 和 studentIds 来创建这些连接。密码中的多重关系有任何指导吗?

您可能需要使用 UNWIND.

我还没有测试过代码,但像这样的东西可能会起作用:

MATCH 
    (s:Student)-[:STUDENT_BELONGS_TO]->(c:Classroom),
    (u:Subjects)-[:SUBJECTS_TAUGHT_IN]->(c:Classroom)
WITH
    s AS student, COLLECT(u) AS subjects
UNWIND subjects AS subject
CREATE (student)-[:IN_SUBJECT]->(subject)

我认为您正在寻找的是 UNWIND。如果您有一个数组作为查询的参数:

studentList :
[
  studentId: "sid1", classroomId: "cid1",  subjectNames: ['s1','s2'] },
  studentId: "sid2", classroomId: "cid2",  subjectNames: ['s1','s3'] },
  ...
]

您可以在查询的开头展开该参数:

UNWIND $studentList as student
MATCH
  (s:Student)-[:STUDENT_BELONGS_TO]->(c:Classroom),
  (u:Subjects)-[:SUBJECTS_TAUGHT_IN]->(c:Classroom)
WHERE
  s.id = student.studentId
AND c.id = student.classroomId
AND u.name = in student.subjectNames
AND NOT (s)-[:IN_SUBJECT]->(u)
CREATE (s)-[:IN_SUBJECT]->(u)