W3C home > Mailing lists > Public > public-rdf-dawg@w3.org > July to September 2010

Re: 4 MINUS and NOT EXISTS test cases

From: Andy Seaborne <andy.seaborne@talis.com>
Date: Mon, 05 Jul 2010 22:49:06 +0100
Message-ID: <4C325352.8000402@talis.com>
To: Chimezie Ogbuji <ogbujic@ccf.org>
CC: SPARQL Working Group WG <public-rdf-dawg@w3.org>


On 29/06/2010 3:25 PM, Chimezie Ogbuji wrote:
> This discharges my action ( Action-194 ) to collect testcases for negation:
>
> Test case 1.1: Subsets by exclusion (NOT EXISTS)
>
> ==== Data
> @prefix ex<negation/subset-exclusion#>  .

Bad syntax. This is repeated in all the data.

> ex:lifeForm1 a ex:Mammal, ex:Animal .
> ex:lifeForm2 a ex:Reptile, ex:Animal .
> ex:lifeForm3 a ex:Insect, ex:Animal .
> ====
>
> ==== Query
> PREFIX ex:<negation/subset-exclusion#>
> SELECT ?animal {
>    ?animal a ex:Animal
>    FILTER NOT EXISTS { ?animal a ex:Insect }
> }
> ====
>
> ==== Solutions
> ----------------
> | animal       |
> ================
> | ex:lifeForm1 |
> ================
> | ex:lifeForm2 |
> ----------------

Agree

> ====
>
> Test case 1.2: Subsets by exclusion (MINUS)
>
> ==== Data
> @prefix ex<negation/subset-exclusion#>  .
> ex:lifeForm1 a ex:Mammal, ex:Animal .
> ex:lifeForm2 a ex:Reptile, ex:Animal .
> ex:lifeForm3 a ex:Insect, ex:Animal .
> ====
>
> ==== Query
> PREFIX ex:<negation/subset-exclusion#>
> SELECT ?animal {
>    ?animal a ex:Animal MINUS {
>      ?animal a ?type
>      FILTER(?type = ex:Reptile&&  ?type = ex:Insect)
>    }
> }
> ====
>
> ==== Solutions
> ----------------
> | animal       |
> ================
> | ex:lifeForm1 |
> ----------------

I don't agree with this.

FILTER(?type = ex:Reptile&&  ?type = ex:Insect)
can't be true.

----------------
| animal       |
================
| ex:lifeForm3 |
| ex:lifeForm2 |
| ex:lifeForm1 |
----------------

Did you mean ||:
  FILTER(?type = ex:Reptile || ?type = ex:Insect)

----------------
| animal       |
================
| ex:lifeForm1 |
----------------

> ====
>
> Test case 2.1: Medical, temporal proximity by exclusion (NOT EXISTS)
>
> ==== Data
> @prefix ex<negation/temporal-exclusion#>  .
> @prefix dc<http://purl.org/dc/elements/1.1/>  .
> @prefix xsd<http://www.w3.org/2001/XMLSchema#>  .
> ex:examination1 a ex:PhysicalExamination;
>                  dc:date "2010-01-10"^^xsd:date .
> ex:operation1 a ex:SurgicalProcedure;
>                dc:date "2010-01-15"^^xsd:date .
> ex:examination2 a ex:PhysicalExamination;
>                  dc:date "2010-01-02"^^xsd:date .
> ex:examination1 ex:precedes ex:operation1  .
> ex:examination2 ex:precedes ex:operation1  .
> ex:examination2 ex:precedes ex:examintion1 .
> ====
>
> ==== Query
> PREFIX ex:<negation/temporal-exclusion#>
> PREFIX dc:<http://purl.org/dc/elements/1.1/>
> # The closest pre-operative physical examination
> SELECT ?exam ?date {
>    ?exam a ex:PhysicalExamination;
>          dc:date ?date;
>          ex:precedes ex:operation1 .
>    ?op   a ex:SurgicalProcedure; dc:date ?opDT .
>    FILTER NOT EXISTS {
>      ?otherExam a ex:PhysicalExamination;
>                 ex:follows ?exam;
>                 ex:precedes ex:operation1
>    }
> }
> ====
>
> ==== Solutions
> --------------------------------------------
> | exam            | date                   |
> ============================================
> | ex:examination1 | "2010-01-10"^^xsd:date |
> --------------------------------------------
> ====

I don't agree with this.

No predicate ex:follows is in the data so FILTER NOT EXISTS { } can't match.

--------------------------------------------
| exam            | date                   |
============================================
| ex:examination2 | "2010-01-02"^^xsd:date |
| ex:examination1 | "2010-01-10"^^xsd:date |
--------------------------------------------

>
> Test case 2.2: Medical, temporal proximity by exclusion (MINUS)
>
> ==== Data
> @prefix ex<negation/temporal-exclusion#>  .
> @prefix dc<http://purl.org/dc/elements/1.1/>  .
> @prefix xsd<http://www.w3.org/2001/XMLSchema#>  .
> ex:examination1 a ex:PhysicalExamination;
>                  dc:date "2010-02-10"^^xsd:date .
> ex:operation1 a ex:SurgicalProcedure;
>                dc:date "2010-03-20"^^xsd:date .
> ex:examination2 a ex:PhysicalExamination;
>                  dc:date "2010-03-11"^^xsd:date .
> ====
>
> ==== Query
> PREFIX ex:<negation/temporal-exclusion#>
> PREFIX dc:<http://purl.org/dc/elements/1.1/>
> # The closest pre-operative physical examination
> SELECT ?exam ?date {
>    ?exam a ex:PhysicalExamination;
>          dc:date ?date .
>    ?op   a ex:SurgicalProcedure; dc:date ?opDT .
>    MINUS {
>      ?otherExam a ex:PhysicalExamination; dc:date ?otherExDT
>      FILTER(?date<  ?otherExDT&&  ?otherExDT<  ?opDT)
>    }
>    FILTER(?date<  ?opDT)
> }
> ====
>
> ==== Solutions
> --------------------------------------------
> | exam            | date                   |
> ============================================
> | ex:examination2 | "2010-03-11"^^xsd:date |
> --------------------------------------------
> ====

I don't agree with this.

The matching part of the MINUS is:

{ ?otherExam a ex:PhysicalExamination; dc:date ?otherExDT } gives:

and then the FILTER:
FILTER(?date<  ?otherExDT&&  ?otherExDT<  ?opDT)

uses ?date which is out of scope for the clause MINUS so the FILTER is 
error always so nothing matches for MINUS {}

For s/MINUS/FILTER NOT EXISTS/, I get:

--------------------------------------------
| exam            | date                   |
============================================
| ex:examination2 | "2010-03-11"^^xsd:date |
--------------------------------------------

	Andy
Received on Monday, 5 July 2010 21:49:37 GMT

This archive was generated by hypermail 2.3.1 : Tuesday, 26 March 2013 16:15:43 GMT