I believe it was the QtContacts Tracker team who requested this feature. When they have to unset the value of a resource’s property and at the same time set a bunch of other properties, they need to use a DELETE statement upfront an INSERT OR REPLACE. The DELETE increases the amount of queries and introduces a SQL SELECT internally for solving the SPARQL DELETE’s WHERE.
Instead of that they wanted a way to express this in the INSERT OR REPLACE, and that way gain a bit of performance. Today I implemented this.
So let’s say we start with:
INSERT { <subject> a nie:InformationElement ; nie:title 'test' }
And then we replace the nie:title:
INSERT OR REPLACE { <subject> nie:title 'new test' }
Then of course we get ‘new test’ for the nie:title of the resource:
SELECT ?title { <subject> nie:title ?title }
Then let’s say we want to unset the nie:title, we can either use:
DELETE { <subject> nie:title ?title } WHERE { <subject> nie:title ?title }
or we can now also use this (and avoid an extra internal SQL SELECT to solve the SPARQL DELETE’s WHERE):
INSERT OR REPLACE { <subject> nie:title null }
For multi value properties will a null object in INSERT OR REPLACE results in a reset of the entire list of objects. There is still a SQL SELECT happening internally to get the so called old values, but that one is sort of unavoidable and is also used by a normal DELETE. I hope this feature helps the QtContacts Tracker team gain performance for their contact synchronization use cases.
You can find this in a branch, it might take some time before it reaches master as most of the Tracker team is at the Berlin Desktop Summit; it must be reviewed, of course. Since it doesn’t really change any of the existing APIs, as it only adds a feature, we might also bring it to 0.10. Although now that we started with 0.11, I think it probably belongs in 0.11 only. Distributions should probably just upgrade, wait for the new features until they decide to bump the version of their packages, or backport features themselves.