- From: joylix <joylix@126.com>
- Date: Sun, 8 Aug 2021 23:42:12 +0800 (CST)
- To: "Aidan Hogan" <aidhog@gmail.com>
- Cc: public-sparql-dev@w3.org
- Message-ID: <60ac5179.164d.17b266dc07e.Coremail.joylix@126.com>
Dear Aidan, Thank you very much for the solution.
Also, in this case, I still don't know how to deal with the limit of boundary.
If I need to consider the inclusive and exclusive values of limit as:
:range1 a :range £»
:grade "A" ;
:minInclusive 90 ;
:maxInclusive 100.
:range2 a :range £»
:grade "B" ;
:minInclusive 75 ;
:maxExclusive 90 .
:range3 a :range £»
:grade "C" ;
:minInclusive 60 ;
:maxExclusive 75 .
:range4 a :range £»
:grade "D" ;
:minInclusive 0 ;
:maxExclusive 60 .
How can I write logical operators in A SPARQL statement based on different predicates (inclusive or exclusive)?
FILTER(?score >= ?lower && ?score <= ?upper)
So this part of the SPARQ statement ">=" is sometimes ">", "<=" can also be "<". Is there an easy way to deal with this situation?
I thought it might be easy to implement this example with shacl, but I didn't know how.
Thanks again for your reply and help.
Kind regards,
Joylix
At 2021-08-07 06:11:22, "Aidan Hogan" <aidhog@gmail.com> wrote:
>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 Sunday, 8 August 2021 15:42:41 UTC