- From: joylix <joylix@126.com>
- Date: Mon, 9 Aug 2021 09:14:16 +0800 (CST)
- To: "Aidan Hogan" <aidhog@gmail.com>
- Cc: "public-sparql-dev@w3.org" <public-sparql-dev@w3.org>
- Message-ID: <4453a5a5.6ad.17b287980e4.Coremail.joylix@126.com>
Hi, Aidan, The first Sparql statement about integer types works perfectly! It's amazing. The operation on the decimal query appears to have failed: --------------------------------------------------- @base <http://example.org/> . @prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . @prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> . @prefix : <http://example.org/#> . :range1 a :range; :grade "A"; :minInclusive 90.0; :maxInclusive 100.0 . :range2 a :range; :grade "B"; :minInclusive 75.0; :maxExclusive 90.0 . :range3 a :range; :grade "C"; :minInclusive 60.0; :maxExclusive 75.0 . :range4 a :range; :grade "D"; :minInclusive 0; :maxExclusive 60.0 . :Bob a :Student; :tookTest :Test0,:Test1,:Test2, :Test3 . :Test0 :score 91.2 . :Test1 :score 75.5 . :Test2 :score 73.2 . :Test3 :score 59.5 . --------------------------------------------------- But it gave me a clear direction and a great idea. I'm also trying to do this with shACL, which might be simpler. But I'm not familiar with SH :rule yet, I don't know if that's possible£º https://w3c.github.io/shacl/shacl-af/#rules Another approach I think might be useful: https://henrietteharmse.com/category/inferencing/ Thank you for your prompt reply and kind help. Kind regards, Joylix At 2021-08-09 08:39:38, "Aidan Hogan" <aidhog@gmail.com> wrote: >Hi Joylix, > >I think that the solution gets a bit more difficult, but if you are >working with integers, you could try to query the values like this: > >PREFIX : <http://example.org/#> >SELECT ?student ?test ?grade >WHERE { > ?student :tookTest ?test . > ?test :score ?score . > ?range a :range . > ?range :grade ?grade . > { ?range :maxInclusive ?max } > UNION > { ?range :maxExclusive ?maxExc . BIND(?maxExc - 1 AS ?max) } > { ?range :minInclusive ?min } > UNION > { ?range :minExclusive ?minExc . BIND(?minExc + 1 AS ?min) } > FILTER(?score >= ?min && ?score <= ?max) >} > >Another option (that would work also for non-integer values) would be to >expand the FILTER. > >PREFIX : <http://example.org/#> >SELECT ?student ?test ?grade >WHERE { > ?student :tookTest ?test . > ?test :score ?score . > ?range a :range . > ?range :grade ?grade . > { ?range :maxInclusive ?maxInc } > UNION > { ?range :maxExclusive ?maxExc } > { ?range :minInclusive ?minInc } > UNION > { ?range :minExclusive ?minExc } > FILTER( > (!isBound(?minInc) || (?score >= ?minInc)) && > (!isBound(?minExc) || (?score > ?minExc)) && > (!isBound(?maxInc) || (?score <= ?maxInc)) && > (!isBound(?maxExc) || (?score < ?maxExc)) > ) >} > >Best, >Aidan > >On 2021-08-08 11:42, joylix wrote: >> 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 Monday, 9 August 2021 01:14:41 UTC