diff --git a/src/SparqlHandler.js b/src/SparqlHandler.js index c91d9f2..5408b24 100644 --- a/src/SparqlHandler.js +++ b/src/SparqlHandler.js @@ -82,13 +82,19 @@ export default class SparqlHandler { mutations.push(...this.triplePatterns(subject, predicate, objectStrings, reverse)); } const mutationClauses = `{\n ${mutations.join('\n ')}\n}`; + function arePredicateObjectsSpecified(predicateObjects2) { + return predicateObjects2.filter(({ predicate, objects }) => objects === null || predicate === null).length === 0; + } - // Join clauses into a SPARQL query - return where.length === 0 ? - // If there are no WHERE clauses, just mutate raw data - `${mutationType} DATA ${mutationClauses}` : - // Otherwise, return a DELETE/INSERT ... WHERE ... query - `${mutationType} ${mutationClauses} WHERE {\n ${where.join('\n ')}\n}`; + return [ + mutationType, + // Add DATA clause if there are no variables in mutation expression, + // that is so when subject is specified (not coming from a WHERE clause) and all predicateObjects have predicates and objects + where.length === 0 && arePredicateObjectsSpecified(predicateObjects) ? ' DATA ' : ' ', + mutationClauses, + // Add WHERE clauses, if any + where.length === 0 ? '' : ` WHERE {\n ${where.join('\n ')}\n}`, + ].join(''); } expressionToTriplePatterns([root, ...pathExpression], lastVar, scope = {}) { diff --git a/test/integration/sparql-test.js b/test/integration/sparql-test.js index a8d0b94..db5a772 100644 --- a/test/integration/sparql-test.js +++ b/test/integration/sparql-test.js @@ -236,7 +236,7 @@ describe('a query path with a path expression handler', () => { it('resolves a path where an object map has different conditions', async () => { const query = await person.delete({ friends: null, firstName: 'Ruben' }).sparql; expect(query).toEqual(deindent(` - DELETE DATA { + DELETE { <${FOAF}knows> ?knows. <${FOAF}givenName> "Ruben". }`)); diff --git a/test/unit/SparqlHandler-test.js b/test/unit/SparqlHandler-test.js index e69eb1e..aaad894 100644 --- a/test/unit/SparqlHandler-test.js +++ b/test/unit/SparqlHandler-test.js @@ -442,7 +442,7 @@ describe('a SparqlHandler instance', () => { ]; expect(await handler.handle({}, { mutationExpressions })).toEqual(deindent(` - DELETE DATA { + DELETE { ?Dp1. }`)); });