- From: <leyla.garcia@ebusiness-unibw.org>
- Date: Tue, 1 Dec 2009 13:53:56 +0100 (CET)
- To: "public-sparql-dev@w3.org" <public-sparql-dev@w3.org>
To all of you, thanks so much,
Andy, Ivan, I tried what you told me and it works smooth, thanks!
Best,
LG
>
>
> On 30/11/2009 15:56, Steve Harris wrote:
>> On 30 Nov 2009, at 13:44, leyla.garcia@ebusiness-unibw.org wrote:
>>
>>> Hello there,
>>>
>>> I have an object property which can appear more than once. It defines
>>> min
>>> and max values for prices which should not overlap and I need to check
>>> it.
>> ...
>>> I think I can do it with SPARQL and loops. For each price I need to
>>> look
>>> at the others and see if values are overlapping so I coudl get the set
>>> of
>>> all overlapping elements. Something like:
>> ...
>>> Is something like that possible? How can I accomplish this check? do I
>>> have to do it programatically, perhaps in Java, with regular loops?
>>
>> The easiest way would be in Java with regular loops, but it may also be
>> possible to do it in SPARQL.
>>
>> In the proposed SPARQL 1.1 I think you could do it with a subSELECT, but
>> I don't have an implementation to hard to try it on.
>>
>> - Steve
>
> Do you really need a loop? Forming a set of pairs of relevant items,
> then filtering the cases of interest should work.
>
> Something like:
>
>
> PREFIX : <http://example>
>
> SELECT DISTINCT ?sub WHERE {
> # Get the prices
> ?sub :hasPrice ?obj .
> ?obj :hasMinPrice ?min . ?obj :hasMaxPrice ?max .
>
> # Get the prices for each ?sub again
> # forming the local cross product of prices per ?sub
>
> ?sub :hasPrice ?obj1 .
> ?obj1 :hasMinPrice ?min1 . ?obj1 :hasMaxPrice ?max1 .
>
> # Now have rows like (sub, price, price1) where
> # the "price" are obj/min/max.
> # Redundancy:
> # For every (sub, price, price1) also have:
> # (sub, price, price) and (sub, price1, price)
>
> # Eliminate things :
>
> # Remove same price in cross product
> FILTER ( ?obj != ?obj1 )
>
> # Removed duplicates because that has the cross product
> # objects so if (A,B) occurs, does (B,A)
> # Assumes min1 != min - too risky
> # Use the DISTINCT above instead
> # FILTER ( ?min1 < ?min )
>
> # Test for overlapping ranges.
> # Either min1 is between min and max or max1 is between min and max
> FILTER ( ( ( ?max1 >= ?min ) && ( ?max1 < ?max ) ) ||
> ( ( ?min1 >= ?min ) && ( ?min1 <= ?max ) ) )
> } ORDER BY ?sub
>
> -----------------------
>
> @prefix : <http://example> .
>
> :car1 :hasPrice [ :hasMinPrice 300.0 ; :hasMaxPrice 450.0 ] .
> :car1 :hasPrice [ :hasMinPrice 100.0 ; :hasMaxPrice 200.0 ] .
>
> # Has overlap
> :car2 :hasPrice [ :hasMinPrice 200.0 ; :hasMaxPrice 450.0 ] .
> :car2 :hasPrice [ :hasMinPrice 100.0 ; :hasMaxPrice 400.0 ] .
> -----------------------
>
> ---------
> | sub |
> =========
> | :car2 |
> ---------
>
>
Received on Tuesday, 1 December 2009 12:54:27 UTC