- From: Aidan Hogan <aidhog@gmail.com>
- Date: Fri, 6 Aug 2021 18:11:22 -0400
- To: public-sparql-dev@w3.org, joylix <joylix@126.com>
Hi Joylix, You could try something like: PREFIX : <http://example.org/#> SELECT ?student ?test ?grade WHERE { ?student :tookTest ?test . ?test :score ?score . ?range a :range . ?range :grade ?grade . ?range :lowerLimit ?lower . ?range :upperLimit ?upper . FILTER(?score >= ?lower && ?score <= ?upper) } Not tested, but I think this should work. Best, Aidan P.S., if you want to express rules over RDF (in RDF) and like to use SPARQL for that, you might be interested in SPIN: https://www.w3.org/Submission/spin-sparql/ On 2021-08-06 4:23, joylix wrote: > Dear all, I have some data on students' test scores as follows: > > > /@prefix : <http://example.org/#> ./ > > /:Bob a :Student;/ > > / :tookTest :Test0,:Test1,:Test2 ,:Test3 ./ > > /:Test0 :score 90 ./ > > /:Test1 :score 81 ./ > > /:Test2 :score 62 ./ > > /:Test3 :score 32 ./ > > The rules for grading based on scores are as follows: > > [90-100] --> A > > [75-90) --> B > > [60-75) --> C > > [0-60) --> D > > So I used the following SPARQL query to get the grade of the student's Test: > > > /prefix : <http://example.org/#>/ > > /select ?student ?test ?grade/ > > / WHERE { / > > / ?student :tookTest ?test ./ > > / ?test :score ?score ./ > > / BIND ( IF ( ?score >= 90 , "A", IF ( ?score>=75, "B", IF ( > ?score>=60, "C", "D" ) ) ) AS ?grade )/ > > / }/ > > And I got the right result as such: > > > student, test, grade > > http://example.org/#Bob, http://example.org/#Test3, D > > http://example.org/#Bob, http://example.org/#Test2, C > > http://example.org/#Bob, http://example.org/#Test1, B > > http://example.org/#Bob, http://example.org/#Test0, A > > Now my question is how to store this rule data in RDF (along with > the score) rather than in SPARQL, so that the rule data can be defined > and modified by the user, The server side reads the rule data to > generate the appropriate SPARQL query. > > My initial thoughts are as follows: > > > / :range1 a :range ;/ > > / :grade "A" ;/ > > / :lowerLimit 90 ;/ > > / :upperLimit 100./ > > /:range2 a :range ;/ > > / :grade "B" ;/ > > / :lowerLimit 75 ;/ > > / :upperLimit 89 ./ > > /:range3 a :range ;/ > > / :grade "C" ;/ > > / :lowerLimit 60 ;/ > > / :upperLimit 74 ./ > > /:range4 a :range ;/ > > / :grade "D" ;/ > > / :lowerLimit 0 ;/ > > / :upperLimit 59 ./ > > /:rule1 :hasRange :range1,:range2, :range3, :range4 ./ > > > But how do I now write the right SPARQL to read the rule and complete > the grade transformation? > > And how to handle with inclusive and exclusive of the boundary of limit? > Thank you for any suggestion. > > Kind regards, > Joylix > > > >
Received on Friday, 6 August 2021 22:11:36 UTC