You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@jena.apache.org by Paul Tyson <ph...@sbcglobal.net> on 2015/11/01 00:37:11 UTC

delete/insert problem with tdbupdate

DELETE/INSERT operation does not work as expected using tdbupdate in
jena-3.0.0.

Starting with an empty TDB, I run the following two updates. The first
works as expected, adding 6 triples. The second should remove those
triples and add 9 new ones. Instead, the graph now has 20 triples. I did
not analyze them closely to see where they might be coming from.

If I run the DELETE clause of the 2nd update separately, it removes the
expected triples, and then the INSERT by itself will add the expected
triples.

===== 1st DELETE/INSERT =====
prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>
prefix ex: <http://example.org/ns/foo#>
DELETE {
?thing_old rdfs:isDefinedBy ?thing_doc ;
  rdf:type ?old_type;
  ex:term ?old_term;
  ex:gAlt ?old_alt .
?old_alt ?old_alt_p ?old_alt_o .
}
INSERT {
_:b1 a ex:Thing1 ;
 rdfs:isDefinedBy ?thing_doc;
 ex:term "ABCD";
 ex:gAlt [a ex:Thing2;ex:gSyn "Automatic Widget"];
.
}
WHERE {
VALUES (?thing_doc) {(<http://example.org/doc/20849DBD>)}
OPTIONAL {?thing_old rdfs:isDefinedBy ?thing_doc ;
  rdf:type ?old_type ;
  ex:term ?old_term .
OPTIONAL {?thing_old ex:gAlt ?old_alt.
  ?old_alt ?old_alt_p ?old_alt_o.}}
}

===== 2nd DELETE/INSERT =====
prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>
prefix ex: <http://example.org/ns/foo#>
DELETE {
?thing_old rdfs:isDefinedBy ?thing_doc ;
  rdf:type ?old_type;
  ex:term ?old_term;
  ex:gAlt ?old_alt .
?old_alt ?old_alt_p ?old_alt_o .
}
INSERT {
_:b1 a ex:Thing1 ;
 rdfs:isDefinedBy ?thing_doc;
 ex:term "ABCD";
 ex:gAlt [a ex:Thing2;ex:gSyn "Automatic Widget"];
 ex:gAlt [a ex:Thing2;ex:gSyn "Automated Widget"];
.

}
WHERE {
VALUES (?thing_doc) {(<http://example.org/doc/20849DBD>)}
OPTIONAL {?thing_old rdfs:isDefinedBy ?thing_doc ;
  rdf:type ?old_type ;
  ex:term ?old_term .
OPTIONAL {?thing_old ex:gAlt ?old_alt.
  ?old_alt ?old_alt_p ?old_alt_o.}}
}



Re: delete/insert problem with tdbupdate

Posted by Paul Tyson <ph...@sbcglobal.net>.
I guess I had some wrong assumptions about DELETE/INSERT. Will review spec more closely. Takeaway for me is that in general DELETE/INSERT is not equivalent to DELETE followed by INSERT.

Thanks,
--Paul

> On Nov 2, 2015, at 03:34, Andy Seaborne <an...@apache.org> wrote:
> 
>> On 01/11/15 23:00, Paul Tyson wrote:
>>> On Sun, 2015-11-01 at 10:32 +0000, Andy Seaborne wrote:
>>> Paul,
>>> 
>>> Could you simplify the example please?
>> 
>>  I will work on that, but ran into some puzzling differences between
>> windows and Linux implementations of jena-3.0.0. Specifically, the linux
>> tdbupdate doesn't recognize --loc argument while Windows does. Anyway
>> that's a side issue.
>> 
>>> 
>>> What is the output of a query that does the WHERE clause when executed
>>> after the first update?
>> 
>> This should be six records: the blank node that " is defined
>> by" ?thing_doc, its type, its term, a blank node that is its gAlt, and
>> the gAlt's type and gSyn.
> 
> Did you run the query?
> 
> I get two rows.
> 
> So 18 triples inserted, not 9.
> 
> Every triple in the template has a blank node. New and different blank nodes are created on each template instantiation.
> 
> c.f. CONSTRUCT.
> 
>>> 
>>> If it has multiple matches (and it looks to me as if it will, so
>>> multiple rows with ?thing_doc, same value each time), then the INSERT in
>>> update 2 is going to put in different blank nodes, for each time the
>>> template is instantiated. If there are >= 2 rods from the WHERE, that's
>>> multiple, different blank nodes.
>> 
>> I assumed the DELETE and INSERT were separate operations, and that the
>> INSERT operated on the dataset after the DELETE had been performed. But
>> if INSERT is calculated concurrently with DELETE, then the observed
>> results might make more sense. I will study this further. It is
>> obviously behaving differently with a combined DELETE/INSERT than with a
>> discrete DELETE followed by an INSERT (in separate updates).
>> 
>> I guess that's the crux of my question: should a DELETE/INSERT update
>> operation yield the same results as a DELETE update followed by an
>> INSERT update, if the DELETE, INSERT, and WHERE clauses are the same?
>> 
>>> 
>>>    Andy
>>> 
>>> PS Did you mean a doubly hested OPTIONAL?  The layout suggests not.
>> 
>> Yes, the intent is to make the same pattern work for datasets that do
>> not have any matching records yet in the dataset, as  well as those that
>> have been populated with the INSERT triples. The ex:gAlt property on
>> ex:Thing1 instances is optional. If the outer OPTIONAL were removed we
>> would need different patterns based on whether the dataset already held
>> the target triples.
>> 
>>> 
>>>> On 31/10/15 23:37, Paul Tyson wrote:
>>>> DELETE/INSERT operation does not work as expected using tdbupdate in
>>>> jena-3.0.0.
>>>> 
>>>> Starting with an empty TDB, I run the following two updates. The first
>>>> works as expected, adding 6 triples. The second should remove those
>>>> triples and add 9 new ones. Instead, the graph now has 20 triples. I did
>>>> not analyze them closely to see where they might be coming from.
>>>> 
>>>> If I run the DELETE clause of the 2nd update separately, it removes the
>>>> expected triples, and then the INSERT by itself will add the expected
>>>> triples.
>>>> 
>>>> ===== 1st DELETE/INSERT =====
>>>> prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
>>>> prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>
>>>> prefix ex: <http://example.org/ns/foo#>
>>>> DELETE {
>>>> ?thing_old rdfs:isDefinedBy ?thing_doc ;
>>>>    rdf:type ?old_type;
>>>>    ex:term ?old_term;
>>>>    ex:gAlt ?old_alt .
>>>> ?old_alt ?old_alt_p ?old_alt_o .
>>>> }
>>>> INSERT {
>>>> _:b1 a ex:Thing1 ;
>>>>   rdfs:isDefinedBy ?thing_doc;
>>>>   ex:term "ABCD";
>>>>   ex:gAlt [a ex:Thing2;ex:gSyn "Automatic Widget"];
>>>> .
>>>> }
>>>> WHERE {
>>>> VALUES (?thing_doc) {(<http://example.org/doc/20849DBD>)}
>>>> OPTIONAL {?thing_old rdfs:isDefinedBy ?thing_doc ;
>>>>    rdf:type ?old_type ;
>>>>    ex:term ?old_term .
>>>> OPTIONAL {?thing_old ex:gAlt ?old_alt.
>>>>    ?old_alt ?old_alt_p ?old_alt_o.}}
>>>> }
>>>> 
>>>> ===== 2nd DELETE/INSERT =====
>>>> prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
>>>> prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>
>>>> prefix ex: <http://example.org/ns/foo#>
>>>> DELETE {
>>>> ?thing_old rdfs:isDefinedBy ?thing_doc ;
>>>>    rdf:type ?old_type;
>>>>    ex:term ?old_term;
>>>>    ex:gAlt ?old_alt .
>>>> ?old_alt ?old_alt_p ?old_alt_o .
>>>> }
>>>> INSERT {
>>>> _:b1 a ex:Thing1 ;
>>>>   rdfs:isDefinedBy ?thing_doc;
>>>>   ex:term "ABCD";
>>>>   ex:gAlt [a ex:Thing2;ex:gSyn "Automatic Widget"];
>>>>   ex:gAlt [a ex:Thing2;ex:gSyn "Automated Widget"];
>>>> .
>>>> 
>>>> }
>>>> WHERE {
>>>> VALUES (?thing_doc) {(<http://example.org/doc/20849DBD>)}
>>>> OPTIONAL {?thing_old rdfs:isDefinedBy ?thing_doc ;
>>>>    rdf:type ?old_type ;
>>>>    ex:term ?old_term .
>>>> OPTIONAL {?thing_old ex:gAlt ?old_alt.
>>>>    ?old_alt ?old_alt_p ?old_alt_o.}}
>>>> }
> 

Re: delete/insert problem with tdbupdate

Posted by Andy Seaborne <an...@apache.org>.
On 01/11/15 23:00, Paul Tyson wrote:
> On Sun, 2015-11-01 at 10:32 +0000, Andy Seaborne wrote:
>> Paul,
>>
>> Could you simplify the example please?
>
>   I will work on that, but ran into some puzzling differences between
> windows and Linux implementations of jena-3.0.0. Specifically, the linux
> tdbupdate doesn't recognize --loc argument while Windows does. Anyway
> that's a side issue.
>
>>
>> What is the output of a query that does the WHERE clause when executed
>> after the first update?
>
> This should be six records: the blank node that " is defined
> by" ?thing_doc, its type, its term, a blank node that is its gAlt, and
> the gAlt's type and gSyn.

Did you run the query?

I get two rows.

So 18 triples inserted, not 9.

Every triple in the template has a blank node. New and different blank 
nodes are created on each template instantiation.

c.f. CONSTRUCT.

>>
>> If it has multiple matches (and it looks to me as if it will, so
>> multiple rows with ?thing_doc, same value each time), then the INSERT in
>> update 2 is going to put in different blank nodes, for each time the
>> template is instantiated. If there are >= 2 rods from the WHERE, that's
>> multiple, different blank nodes.
>
> I assumed the DELETE and INSERT were separate operations, and that the
> INSERT operated on the dataset after the DELETE had been performed. But
> if INSERT is calculated concurrently with DELETE, then the observed
> results might make more sense. I will study this further. It is
> obviously behaving differently with a combined DELETE/INSERT than with a
> discrete DELETE followed by an INSERT (in separate updates).
>
> I guess that's the crux of my question: should a DELETE/INSERT update
> operation yield the same results as a DELETE update followed by an
> INSERT update, if the DELETE, INSERT, and WHERE clauses are the same?
>
>>
>> 	Andy
>>
>> PS Did you mean a doubly hested OPTIONAL?  The layout suggests not.
>
> Yes, the intent is to make the same pattern work for datasets that do
> not have any matching records yet in the dataset, as  well as those that
> have been populated with the INSERT triples. The ex:gAlt property on
> ex:Thing1 instances is optional. If the outer OPTIONAL were removed we
> would need different patterns based on whether the dataset already held
> the target triples.
>
>>
>> On 31/10/15 23:37, Paul Tyson wrote:
>>> DELETE/INSERT operation does not work as expected using tdbupdate in
>>> jena-3.0.0.
>>>
>>> Starting with an empty TDB, I run the following two updates. The first
>>> works as expected, adding 6 triples. The second should remove those
>>> triples and add 9 new ones. Instead, the graph now has 20 triples. I did
>>> not analyze them closely to see where they might be coming from.
>>>
>>> If I run the DELETE clause of the 2nd update separately, it removes the
>>> expected triples, and then the INSERT by itself will add the expected
>>> triples.
>>>
>>> ===== 1st DELETE/INSERT =====
>>> prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
>>> prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>
>>> prefix ex: <http://example.org/ns/foo#>
>>> DELETE {
>>> ?thing_old rdfs:isDefinedBy ?thing_doc ;
>>>     rdf:type ?old_type;
>>>     ex:term ?old_term;
>>>     ex:gAlt ?old_alt .
>>> ?old_alt ?old_alt_p ?old_alt_o .
>>> }
>>> INSERT {
>>> _:b1 a ex:Thing1 ;
>>>    rdfs:isDefinedBy ?thing_doc;
>>>    ex:term "ABCD";
>>>    ex:gAlt [a ex:Thing2;ex:gSyn "Automatic Widget"];
>>> .
>>> }
>>> WHERE {
>>> VALUES (?thing_doc) {(<http://example.org/doc/20849DBD>)}
>>> OPTIONAL {?thing_old rdfs:isDefinedBy ?thing_doc ;
>>>     rdf:type ?old_type ;
>>>     ex:term ?old_term .
>>> OPTIONAL {?thing_old ex:gAlt ?old_alt.
>>>     ?old_alt ?old_alt_p ?old_alt_o.}}
>>> }
>>>
>>> ===== 2nd DELETE/INSERT =====
>>> prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
>>> prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>
>>> prefix ex: <http://example.org/ns/foo#>
>>> DELETE {
>>> ?thing_old rdfs:isDefinedBy ?thing_doc ;
>>>     rdf:type ?old_type;
>>>     ex:term ?old_term;
>>>     ex:gAlt ?old_alt .
>>> ?old_alt ?old_alt_p ?old_alt_o .
>>> }
>>> INSERT {
>>> _:b1 a ex:Thing1 ;
>>>    rdfs:isDefinedBy ?thing_doc;
>>>    ex:term "ABCD";
>>>    ex:gAlt [a ex:Thing2;ex:gSyn "Automatic Widget"];
>>>    ex:gAlt [a ex:Thing2;ex:gSyn "Automated Widget"];
>>> .
>>>
>>> }
>>> WHERE {
>>> VALUES (?thing_doc) {(<http://example.org/doc/20849DBD>)}
>>> OPTIONAL {?thing_old rdfs:isDefinedBy ?thing_doc ;
>>>     rdf:type ?old_type ;
>>>     ex:term ?old_term .
>>> OPTIONAL {?thing_old ex:gAlt ?old_alt.
>>>     ?old_alt ?old_alt_p ?old_alt_o.}}
>>> }
>>>
>>>
>>
>
>


Re: delete/insert problem with tdbupdate

Posted by Paul Tyson <ph...@sbcglobal.net>.
On Sun, 2015-11-01 at 10:32 +0000, Andy Seaborne wrote:
> Paul,
> 
> Could you simplify the example please?

 I will work on that, but ran into some puzzling differences between
windows and Linux implementations of jena-3.0.0. Specifically, the linux
tdbupdate doesn't recognize --loc argument while Windows does. Anyway
that's a side issue.

> 
> What is the output of a query that does the WHERE clause when executed 
> after the first update?

This should be six records: the blank node that " is defined
by" ?thing_doc, its type, its term, a blank node that is its gAlt, and
the gAlt's type and gSyn.
> 
> If it has multiple matches (and it looks to me as if it will, so 
> multiple rows with ?thing_doc, same value each time), then the INSERT in 
> update 2 is going to put in different blank nodes, for each time the 
> template is instantiated. If there are >= 2 rods from the WHERE, that's 
> multiple, different blank nodes.

I assumed the DELETE and INSERT were separate operations, and that the
INSERT operated on the dataset after the DELETE had been performed. But
if INSERT is calculated concurrently with DELETE, then the observed
results might make more sense. I will study this further. It is
obviously behaving differently with a combined DELETE/INSERT than with a
discrete DELETE followed by an INSERT (in separate updates).

I guess that's the crux of my question: should a DELETE/INSERT update
operation yield the same results as a DELETE update followed by an
INSERT update, if the DELETE, INSERT, and WHERE clauses are the same?

> 
> 	Andy
> 
> PS Did you mean a doubly hested OPTIONAL?  The layout suggests not.

Yes, the intent is to make the same pattern work for datasets that do
not have any matching records yet in the dataset, as  well as those that
have been populated with the INSERT triples. The ex:gAlt property on
ex:Thing1 instances is optional. If the outer OPTIONAL were removed we
would need different patterns based on whether the dataset already held
the target triples. 

> 
> On 31/10/15 23:37, Paul Tyson wrote:
> > DELETE/INSERT operation does not work as expected using tdbupdate in
> > jena-3.0.0.
> >
> > Starting with an empty TDB, I run the following two updates. The first
> > works as expected, adding 6 triples. The second should remove those
> > triples and add 9 new ones. Instead, the graph now has 20 triples. I did
> > not analyze them closely to see where they might be coming from.
> >
> > If I run the DELETE clause of the 2nd update separately, it removes the
> > expected triples, and then the INSERT by itself will add the expected
> > triples.
> >
> > ===== 1st DELETE/INSERT =====
> > prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
> > prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>
> > prefix ex: <http://example.org/ns/foo#>
> > DELETE {
> > ?thing_old rdfs:isDefinedBy ?thing_doc ;
> >    rdf:type ?old_type;
> >    ex:term ?old_term;
> >    ex:gAlt ?old_alt .
> > ?old_alt ?old_alt_p ?old_alt_o .
> > }
> > INSERT {
> > _:b1 a ex:Thing1 ;
> >   rdfs:isDefinedBy ?thing_doc;
> >   ex:term "ABCD";
> >   ex:gAlt [a ex:Thing2;ex:gSyn "Automatic Widget"];
> > .
> > }
> > WHERE {
> > VALUES (?thing_doc) {(<http://example.org/doc/20849DBD>)}
> > OPTIONAL {?thing_old rdfs:isDefinedBy ?thing_doc ;
> >    rdf:type ?old_type ;
> >    ex:term ?old_term .
> > OPTIONAL {?thing_old ex:gAlt ?old_alt.
> >    ?old_alt ?old_alt_p ?old_alt_o.}}
> > }
> >
> > ===== 2nd DELETE/INSERT =====
> > prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
> > prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>
> > prefix ex: <http://example.org/ns/foo#>
> > DELETE {
> > ?thing_old rdfs:isDefinedBy ?thing_doc ;
> >    rdf:type ?old_type;
> >    ex:term ?old_term;
> >    ex:gAlt ?old_alt .
> > ?old_alt ?old_alt_p ?old_alt_o .
> > }
> > INSERT {
> > _:b1 a ex:Thing1 ;
> >   rdfs:isDefinedBy ?thing_doc;
> >   ex:term "ABCD";
> >   ex:gAlt [a ex:Thing2;ex:gSyn "Automatic Widget"];
> >   ex:gAlt [a ex:Thing2;ex:gSyn "Automated Widget"];
> > .
> >
> > }
> > WHERE {
> > VALUES (?thing_doc) {(<http://example.org/doc/20849DBD>)}
> > OPTIONAL {?thing_old rdfs:isDefinedBy ?thing_doc ;
> >    rdf:type ?old_type ;
> >    ex:term ?old_term .
> > OPTIONAL {?thing_old ex:gAlt ?old_alt.
> >    ?old_alt ?old_alt_p ?old_alt_o.}}
> > }
> >
> >
> 



Re: delete/insert problem with tdbupdate

Posted by Andy Seaborne <an...@apache.org>.
Paul,

Could you simplify the example please?

What is the output of a query that does the WHERE clause when executed 
after the first update?

If it has multiple matches (and it looks to me as if it will, so 
multiple rows with ?thing_doc, same value each time), then the INSERT in 
update 2 is going to put in different blank nodes, for each time the 
template is instantiated. If there are >= 2 rows from the WHERE, that's 
multiple, different blank nodes.

	Andy

PS Did you mean a doubly nested OPTIONAL?  The layout suggests not.

On 31/10/15 23:37, Paul Tyson wrote:
> DELETE/INSERT operation does not work as expected using tdbupdate in
> jena-3.0.0.
>
> Starting with an empty TDB, I run the following two updates. The first
> works as expected, adding 6 triples. The second should remove those
> triples and add 9 new ones. Instead, the graph now has 20 triples. I did
> not analyze them closely to see where they might be coming from.
>
> If I run the DELETE clause of the 2nd update separately, it removes the
> expected triples, and then the INSERT by itself will add the expected
> triples.
>
> ===== 1st DELETE/INSERT =====
> prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
> prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>
> prefix ex: <http://example.org/ns/foo#>
> DELETE {
> ?thing_old rdfs:isDefinedBy ?thing_doc ;
>    rdf:type ?old_type;
>    ex:term ?old_term;
>    ex:gAlt ?old_alt .
> ?old_alt ?old_alt_p ?old_alt_o .
> }
> INSERT {
> _:b1 a ex:Thing1 ;
>   rdfs:isDefinedBy ?thing_doc;
>   ex:term "ABCD";
>   ex:gAlt [a ex:Thing2;ex:gSyn "Automatic Widget"];
> .
> }
> WHERE {
> VALUES (?thing_doc) {(<http://example.org/doc/20849DBD>)}
> OPTIONAL {?thing_old rdfs:isDefinedBy ?thing_doc ;
>    rdf:type ?old_type ;
>    ex:term ?old_term .
> OPTIONAL {?thing_old ex:gAlt ?old_alt.
>    ?old_alt ?old_alt_p ?old_alt_o.}}
> }
>
> ===== 2nd DELETE/INSERT =====
> prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
> prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>
> prefix ex: <http://example.org/ns/foo#>
> DELETE {
> ?thing_old rdfs:isDefinedBy ?thing_doc ;
>    rdf:type ?old_type;
>    ex:term ?old_term;
>    ex:gAlt ?old_alt .
> ?old_alt ?old_alt_p ?old_alt_o .
> }
> INSERT {
> _:b1 a ex:Thing1 ;
>   rdfs:isDefinedBy ?thing_doc;
>   ex:term "ABCD";
>   ex:gAlt [a ex:Thing2;ex:gSyn "Automatic Widget"];
>   ex:gAlt [a ex:Thing2;ex:gSyn "Automated Widget"];
> .
>
> }
> WHERE {
> VALUES (?thing_doc) {(<http://example.org/doc/20849DBD>)}
> OPTIONAL {?thing_old rdfs:isDefinedBy ?thing_doc ;
>    rdf:type ?old_type ;
>    ex:term ?old_term .
> OPTIONAL {?thing_old ex:gAlt ?old_alt.
>    ?old_alt ?old_alt_p ?old_alt_o.}}
> }
>
>