查找所有匹配 X 但不匹配 Y 的主题

Find all subjects that match X but don't match Y

我有一个简单的“注册”table,其中包含已注册课程的学生。一个学生可以注册多门课程。

我想找到所有注册了课程 1234 而没有注册课程 5678 的学生

所以我尝试了这个尝试:

SELECT ?student_id
WHERE {
    ?registration :R-Student_id ?student_id ;
                  :R-Course_code ?course_code .
    FILTER(?course_code = "1234") .
    FILTER NOT EXISTS {
        ?registration :R-Course_code "5678" .
    }
}
ORDER BY ?student_id

但是最后的FILTER NOT EXISTS好像对查询没有影响?我仍然可以从查询结果中找到同样注册第二门课程的 student_ids :/

我做错了什么?

所以我设法使用某种“自连接”解决了这个问题:

SELECT ?student_id
WHERE {
    ?r1 :R-Student_id ?student_id ;
        :R-Course_code "1234" .

    FILTER NOT EXISTS {
        ?r2 :R-Student_id ?student_id ;
            :R-Course_code "5678" .
    }
}
ORDER BY ?student_id