Thanks, now it's making sense. - Erich
On 12/14/13 3:47 AM, Rob Vesse wrote:
Ah sorry I misread your previous email, this is the same problem as before.
Because you have ?p which will match the rdf:type predicate the query will
subtract any types found.
Basic rule of thumb is if you are using MINUS be as specific as possible
Rob
-----Original Message-----
From: "Erich Bremer" <[email protected]>
Sent: 14/12/2013 04:01
To: "[email protected]" <[email protected]>
Subject: Re: odd SPARQL MINUS behavior Jena 2.11.0
Ah ok, but this is what is not happening.
1) Start with TimBL's foaf file from
http://dig.csail.mit.edu/2008/webdav/timbl/foaf.rdf
2) Add foaf:SmartPerson to a random person, say Dean's entry:
<rdf:Description
rdf:about="http://dig.csail.mit.edu/2008/webdav/timbl/foaf.rdf#dj">
<rdf:type rdf:resource="http://xmlns.com/foaf/0.1/SmartPerson"/>
3) Then execute the following SPARQL:
construct {?s ?p ?o} where {?s ?p ?o minus {?s ?p
<http://xmlns.com/foaf/0.1/NonExistentPerson>}
which results in no changes for Dean's entry since the MINUS matches
nothing:
<http://dig.csail.mit.edu/2008/webdav/timbl/foaf.rdf#dj>
a foaf:Person , foaf:SmartPerson ;
s:seeAlso <http://www.grorg.org/dean/foaf.rdf> ;
foaf:homepage <http://www.grorg.org/dean/> ;
foaf:mbox <mailto:[email protected]> , <mailto:[email protected]> ;
foaf:mbox_sha1sum "6de4ff27ef927b9ba21ccc88257e41a2d7e7d293" ;
foaf:name "Dean Jackson" .
4) Then try to match "SmartPerson"
construct {?s ?p ?o} where {?s ?p ?o minus {?s ?p
<http://xmlns.com/foaf/0.1/SmartPerson>}
Results in both rdf:type statements being removed but leaving the rest
of Dean's entry.
<http://dig.csail.mit.edu/2008/webdav/timbl/foaf.rdf#dj>
s:seeAlso <http://www.grorg.org/dean/foaf.rdf> ;
foaf:homepage <http://www.grorg.org/dean/> ;
foaf:mbox <mailto:[email protected]> , <mailto:[email protected]> ;
foaf:mbox_sha1sum "6de4ff27ef927b9ba21ccc88257e41a2d7e7d293" ;
foaf:name "Dean Jackson" .
5) Then modifying the MINUS statement predicate to be "a" instead of "?p"
construct {?s ?p ?o} where {?s ?p ?o minus {?s a
<http://xmlns.com/foaf/0.1/SmartPerson>}
finally results in Dean's entry going away.
- Erich
=====================================
Erich Bremer
http://www.ebremer.com
http://haylyn.io
On 12/13/13 2:45 AM, Rob Vesse wrote:
Yes that should be the answer
Rob
-----Original Message-----
From: "Erich Bremer" <[email protected]>
Sent: 13/12/2013 06:42
To: "[email protected]" <[email protected]>
Subject: Re: odd SPARQL MINUS behavior Jena 2.11.0
So, if I understand this correctly, if my data is:
<http://sample.com/p1> a :Person; name "Person A"; :nick "Buddy";
:status "Living" .
<http://sample.com/p2> a :Person; name "Person B"; :nick "Bro"; :status
"Living" .
<http://sample.com/p3> a :DeadPerson; name "Person C"; :nick "Butch";
:status "Dead" .
and I give the command:
construct {?s ?p ?o} where {?s ?p ?o minus {?s ?p
<http://xmlns.com/foaf/0.1/DeadPerson>}}"
then I should get the resultant graph:
<http://sample.com/p1> a :Person; name "Person A"; :nick "Buddy";
:status "Living" .
<http://sample.com/p2> a :Person; name "Person B"; :nick "Bro"; :status
"Living" .
Would this be correct? - Erich
On 12/11/13 4:25 AM, Andy Seaborne wrote:
On 11/12/13 02:56, Erich Bremer wrote:
In the following segment of code:
String queryString = "construct {?s a ?o} whereccc minus {?s a
<http://xmlns.com/foaf/0.1/Person>}}";
Query query = QueryFactory.create(queryString);
QueryExecution qe = QueryExecutionFactory.create(query,m);
Model whoa = qe.execConstruct();
Rather than remove just the pattern {?s a
<http://xmlns.com/foaf/0.1/Person>}, it removes all types as if the
MINUS pattern was {?s a ?p}
Sound like you want:
FILTER (?o != <http://xmlns.com/foaf/0.1/Person>)
which just excludes any (?s, ?o) row where ?o is foaf:Person.
MINUS will take the left-hand side "?s a ?o" and the right-hand side
{ ?s a foaf:Person}, and remove all rows from the LHS that match
(=join) with the RHS.
So it removes all rows involving ?s where there is a match for
{?s a <http://xmlns.com/foaf/0.1/Person>}
See also
FILTER NOT EXISTS {?s a <http://xmlns.com/foaf/0.1/Person>}
which applies a test to ?s for every row to see if can be matched.
In both MINUS and FILTER NOT EXISTS, ?o is not playing a part - it's
not mentioned in the negation side and, in this case, MINUS and FILTER
NOT EXISTS have the same outcome.
Andy
- Erich
========================
http://www.ebremer.com
http://haylyn.io