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


Reply via email to