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.}} > > } > > > > >
