NIHVIVO-3795 NIHVIVO-3793 fixed deletion bugs in RDFServiceSDB

This commit is contained in:
brianjlowe 2012-06-15 17:42:08 +00:00
parent 2cc59294be
commit e5509654d2

View file

@ -113,7 +113,9 @@ public class RDFServiceSDB extends RDFServiceImpl implements RDFService {
modelChange.getSerializedModel().mark(Integer.MAX_VALUE); modelChange.getSerializedModel().mark(Integer.MAX_VALUE);
dataset.getLock().enterCriticalSection(Lock.WRITE); dataset.getLock().enterCriticalSection(Lock.WRITE);
try { try {
Model model = dataset.getNamedModel(modelChange.getGraphURI()); Model model = (modelChange.getGraphURI() == null)
? dataset.getDefaultModel()
: dataset.getNamedModel(modelChange.getGraphURI());
operateOnModel(model, modelChange, dataset); operateOnModel(model, modelChange, dataset);
} finally { } finally {
dataset.getLock().leaveCriticalSection(); dataset.getLock().leaveCriticalSection();
@ -158,9 +160,10 @@ public class RDFServiceSDB extends RDFServiceImpl implements RDFService {
model.read(modelChange.getSerializedModel(), null, model.read(modelChange.getSerializedModel(), null,
getSerializationFormatString(modelChange.getSerializationFormat())); getSerializationFormatString(modelChange.getSerializationFormat()));
} else if (modelChange.getOperation() == ModelChange.Operation.REMOVE) { } else if (modelChange.getOperation() == ModelChange.Operation.REMOVE) {
model.remove(parseModel(modelChange)); Model removal = parseModel(modelChange);
model.remove(removal);
if (dataset != null) { if (dataset != null) {
removeBlankNodesWithSparqlUpdate(dataset, model, modelChange.getGraphURI()); removeBlankNodesWithSparqlUpdate(dataset, removal, modelChange.getGraphURI());
} }
} else { } else {
log.error("unrecognized operation type"); log.error("unrecognized operation type");
@ -171,15 +174,25 @@ public class RDFServiceSDB extends RDFServiceImpl implements RDFService {
} }
private void removeBlankNodesWithSparqlUpdate(Dataset dataset, Model model, String graphURI) { private void removeBlankNodesWithSparqlUpdate(Dataset dataset, Model model, String graphURI) {
Model blankNodeModel = ModelFactory.createDefaultModel(); List<Statement> blankNodeStatements = new ArrayList<Statement>();
StmtIterator stmtIt = model.listStatements(); StmtIterator stmtIt = model.listStatements();
while (stmtIt.hasNext()) { while (stmtIt.hasNext()) {
Statement stmt = stmtIt.nextStatement(); Statement stmt = stmtIt.nextStatement();
if (stmt.getSubject().isAnon() || stmt.getObject().isAnon()) { if (stmt.getSubject().isAnon() || stmt.getObject().isAnon()) {
blankNodeModel.add(stmt); blankNodeStatements.add(stmt);
} }
} }
if(blankNodeStatements.size() == 0) {
return;
}
Model blankNodeModel = ModelFactory.createDefaultModel();
blankNodeModel.add(blankNodeStatements);
log.debug("removal model size " + model.size());
log.debug("blank node model size " + blankNodeModel.size());
String rootFinder = "SELECT ?s WHERE { ?s ?p ?o OPTIONAL { ?ss ?pp ?s } FILTER (!bound(?ss)) }"; String rootFinder = "SELECT ?s WHERE { ?s ?p ?o OPTIONAL { ?ss ?pp ?s } FILTER (!bound(?ss)) }";
Query rootFinderQuery = QueryFactory.create(rootFinder); Query rootFinderQuery = QueryFactory.create(rootFinder);
@ -214,7 +227,11 @@ public class RDFServiceSDB extends RDFServiceImpl implements RDFService {
} }
m2.add(stmt); m2.add(stmt);
DataSource ds = DatasetFactory.create(); DataSource ds = DatasetFactory.create();
ds.addNamedModel(graphURI, dataset.getNamedModel(graphURI)); if (graphURI == null) {
ds.setDefaultModel(dataset.getDefaultModel());
} else {
ds.addNamedModel(graphURI, dataset.getNamedModel(graphURI));
}
removeUsingSparqlUpdate(ds, m2, graphURI); removeUsingSparqlUpdate(ds, m2, graphURI);
} }
} finally { } finally {
@ -276,8 +293,11 @@ public class RDFServiceSDB extends RDFServiceImpl implements RDFService {
// make a plain dataset to force the query to be run in a way that // make a plain dataset to force the query to be run in a way that
// won't overwhelm MySQL with too many joins // won't overwhelm MySQL with too many joins
DataSource ds = DatasetFactory.create(); DataSource ds = DatasetFactory.create();
ds.addNamedModel(graphURI, (graphURI != null) if (graphURI == null) {
? dataset.getNamedModel(graphURI) : dataset.getDefaultModel()); ds.setDefaultModel(dataset.getDefaultModel());
} else {
ds.addNamedModel(graphURI, dataset.getNamedModel(graphURI));
}
QueryExecution qe = QueryExecutionFactory.create(construct, ds); QueryExecution qe = QueryExecutionFactory.create(construct, ds);
try { try {
Model m = qe.execConstruct(); Model m = qe.execConstruct();