I learned this when trying to clear our records in AWS Neptune. I was hitting the query timeout when trying to drop an entire graph. If you don't want to/can't raise the timeout, you can drop smaller parts of the graph in each transaction.
curl -sX POST http://<cluster-prefix>.rds.amazonaws.com:8182/sparql --data-urlencode 'update=
DELETE {
GRAPH <http://aws.amazon.com/neptune/vocab/v01/DefaultNamedGraph> { ?s ?p ?o }
}
WHERE {
GRAPH <http://aws.amazon.com/neptune/vocab/v01/DefaultNamedGraph> {
{
SELECT ?s ?p ?o
WHERE {
?s ?p ?o .
}
LIMIT 10
}
}
}
'
This will delete 10 records, specifically the first 10 that are returned for a SELECT * WHERE { ?s ?p ?o }
query. You can adjust the limit value to find a batch size that keeps you under the timeout.
Yeah, this is a dirty hack but there was a bit of pain to learn this so I want to store the knowledge.
Also, be sure to use --data-urlencode
not --data-binary
otherwise you might find the server ignores your input but doesn't give any indication of error.
To delete all of the contents of a named graph, instead of iterating over the triples, it is much easier and quicker to use:
Or perhaps:
Add the
SILENT
keyword beforeGRAPH
if the graph might not exist, but you don't want that to return an error.— Links to the docs, for more info:
https://www.w3.org/TR/sparql11-update/#drop
https://www.w3.org/TR/sparql11-update/#clear