@comake/skl-js-engine 1.3.13 → 1.3.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -8,6 +8,7 @@ export interface EntityUpdateQueries {
8
8
  export interface EntityUpdateTriples {
9
9
  entityTriples: Triple[];
10
10
  timestampTriples: Triple[];
11
+ insertions: GraphQuads[];
11
12
  }
12
13
  export interface SparqlUpdateBuilderArgs {
13
14
  setTimestamps?: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"SparqlUpdateBuilder.d.ts","sourceRoot":"","sources":["../../../../src/storage/query-adapter/sparql/SparqlUpdateBuilder.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,MAAM,EACN,UAAU,EACV,MAAM,EAGN,kBAAkB,EAEnB,MAAM,UAAU,CAAC;AAoBlB,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAIlD,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,kBAAkB,EAAE,CAAC;IAC5B,UAAU,EAAE,UAAU,EAAE,CAAC;IACzB,mBAAmB,EAAE,UAAU,EAAE,CAAC;CACnC;AAED,MAAM,WAAW,mBAAmB;IAClC,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,gBAAgB,EAAE,MAAM,EAAE,CAAC;CAC5B;AAED,MAAM,WAAW,uBAAuB;IACtC,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAoB;IACtD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAU;gBAErB,IAAI,CAAC,EAAE,uBAAuB;IAK1C,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,UAAU,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM;IAMnF,WAAW,CAAC,gBAAgB,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,MAAM;IAmBxD,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,MAAM;IAMnD,WAAW,CAAC,gBAAgB,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,MAAM;IAMxD,cAAc,IAAI,MAAM;IAI/B,OAAO,CAAC,6CAA6C;IAqErD,OAAO,CAAC,mBAAmB;IAoB3B,OAAO,CAAC,qCAAqC;IAgB7C,OAAO,CAAC,qBAAqB;IAO7B,OAAO,CAAC,0BAA0B;IAOlC,OAAO,CAAC,8BAA8B;IAgBtC,OAAO,CAAC,sBAAsB;IAqB9B,OAAO,CAAC,eAAe;IAiCvB,OAAO,CAAC,wCAAwC;IAUhD,OAAO,CAAC,2CAA2C;IAenD,OAAO,CAAC,gDAAgD;IAYxD,OAAO,CAAC,wCAAwC;IA0BhD,OAAO,CAAC,0BAA0B;IAalC,OAAO,CAAC,mBAAmB;IAa3B,OAAO,CAAC,wBAAwB;CAKjC"}
1
+ {"version":3,"file":"SparqlUpdateBuilder.d.ts","sourceRoot":"","sources":["../../../../src/storage/query-adapter/sparql/SparqlUpdateBuilder.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,MAAM,EACN,UAAU,EACV,MAAM,EAGN,kBAAkB,EAEnB,MAAM,UAAU,CAAC;AAoBlB,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAIlD,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,kBAAkB,EAAE,CAAC;IAC5B,UAAU,EAAE,UAAU,EAAE,CAAC;IACzB,mBAAmB,EAAE,UAAU,EAAE,CAAC;CACnC;AAED,MAAM,WAAW,mBAAmB;IAClC,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,UAAU,EAAE,UAAU,EAAE,CAAC;CAC1B;AAED,MAAM,WAAW,uBAAuB;IACtC,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAoB;IACtD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAU;gBAErB,IAAI,CAAC,EAAE,uBAAuB;IAK1C,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,UAAU,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM;IAMnF,WAAW,CAAC,gBAAgB,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,MAAM;IAmBxD,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,MAAM;IAMnD,WAAW,CAAC,gBAAgB,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,MAAM;IAMxD,cAAc,IAAI,MAAM;IAI/B,OAAO,CAAC,6CAA6C;IAqFrD,OAAO,CAAC,mBAAmB;IAoB3B,OAAO,CAAC,qCAAqC;IAgB7C,OAAO,CAAC,qBAAqB;IAO7B,OAAO,CAAC,0BAA0B;IAOlC,OAAO,CAAC,8BAA8B;IAwBtC,OAAO,CAAC,sBAAsB;IAoB9B,OAAO,CAAC,eAAe;IAkCvB,OAAO,CAAC,wCAAwC;IAchD,OAAO,CAAC,2CAA2C;IAenD,OAAO,CAAC,gDAAgD;IAYxD,OAAO,CAAC,wCAAwC;IAiChD,OAAO,CAAC,0BAA0B;IAalC,OAAO,CAAC,mBAAmB;IAa3B,OAAO,CAAC,wBAAwB;CAKjC"}
@@ -56,9 +56,9 @@ class SparqlUpdateBuilder {
56
56
  return ids.flatMap((id) => {
57
57
  const subject = data_model_1.default.namedNode(id);
58
58
  const { attributesToUpdate, attributesToDelete } = this.partitionAttributes(attributes);
59
- const deletionTriples = this.partialEntityToDeletionTriples(attributesToUpdate, subject);
60
- const insertionTriples = this.partialEntityToTriples(subject, attributesToUpdate);
61
- const deleteOnlyTriples = this.partialEntityToDeletionTriples(attributesToDelete, subject);
59
+ const { triples: deletionTriples, deletions: deletionDeletions } = this.partialEntityToDeletionTriples(attributesToUpdate, subject);
60
+ const { triples: insertionTriples, insertions: insertionInsertions } = this.partialEntityToTriples(subject, attributesToUpdate);
61
+ const { triples: deleteOnlyTriples } = this.partialEntityToDeletionTriples(attributesToDelete, subject);
62
62
  const updates = [];
63
63
  if (deletionTriples.length > 0) {
64
64
  updates.push({
@@ -71,10 +71,23 @@ class SparqlUpdateBuilder {
71
71
  }
72
72
  });
73
73
  }
74
+ for (const deletion of deletionDeletions) {
75
+ updates.push({
76
+ updateType: 'insertdelete',
77
+ delete: [deletion],
78
+ insert: [],
79
+ where: [
80
+ ...deletion.triples.map((triple) => (0, SparqlUtil_1.createSparqlOptional)([(0, SparqlUtil_1.createSparqlBasicGraphPattern)([triple])]))
81
+ ],
82
+ using: {
83
+ default: [deletion.name]
84
+ }
85
+ });
86
+ }
74
87
  if (insertionTriples.length > 0) {
75
88
  updates.push({
76
89
  updateType: 'insert',
77
- insert: [(0, SparqlUtil_1.createSparqlGraphQuads)(subject, insertionTriples)]
90
+ insert: [(0, SparqlUtil_1.createSparqlGraphQuads)(subject, insertionTriples), ...insertionInsertions]
78
91
  });
79
92
  }
80
93
  if (deleteOnlyTriples.length > 0) {
@@ -125,9 +138,9 @@ class SparqlUpdateBuilder {
125
138
  entitiesToGraphDeletionsAndInsertions(entities) {
126
139
  return entities.reduce((obj, entity) => {
127
140
  const entityGraphName = data_model_1.default.namedNode(entity['@id']);
128
- const { entityTriples, timestampTriples } = this.entityToTriples(entity, entityGraphName);
141
+ const { entityTriples, timestampTriples, insertions } = this.entityToTriples(entity, entityGraphName);
129
142
  obj.clear.push((0, SparqlUtil_1.createSparqlClearUpdate)(entityGraphName));
130
- obj.insertions.push((0, SparqlUtil_1.createSparqlGraphQuads)(entityGraphName, entityTriples));
143
+ obj.insertions.push((0, SparqlUtil_1.createSparqlGraphQuads)(entityGraphName, entityTriples), ...insertions);
131
144
  if (timestampTriples.length > 0) {
132
145
  obj.timestampInsertions.push((0, SparqlUtil_1.createSparqlGraphQuads)(entityGraphName, timestampTriples));
133
146
  }
@@ -147,48 +160,55 @@ class SparqlUpdateBuilder {
147
160
  });
148
161
  }
149
162
  partialEntityToDeletionTriples(entity, subject) {
150
- return Object.keys(entity).reduce((triples, key) => {
163
+ return Object.entries(entity).reduce((acc, [key, value]) => {
151
164
  if (key !== '@id') {
152
- return [
153
- ...triples,
154
- this.buildTriplesWithSubjectPredicateAndVariableValue(subject, data_model_1.default.namedNode(key), this.variableGenerator.getNext())
155
- ];
165
+ let deletions = [];
166
+ if (value && typeof value === 'object' && '@id' in value && typeof value['@id'] === 'string' && '@type' in value) {
167
+ const { triples: nestedTriples, deletions: nestedDeletions } = this.partialEntityToDeletionTriples(value, data_model_1.default.namedNode(value['@id']));
168
+ deletions = [...deletions, (0, SparqlUtil_1.createSparqlGraphQuads)(data_model_1.default.namedNode(value['@id']), nestedTriples), ...nestedDeletions];
169
+ }
170
+ return {
171
+ triples: [
172
+ ...acc.triples,
173
+ this.buildTriplesWithSubjectPredicateAndVariableValue(subject, key === '@type' ? SparqlUtil_1.rdfTypeNamedNode : data_model_1.default.namedNode(key), this.variableGenerator.getNext())
174
+ ],
175
+ deletions: [...acc.deletions, ...deletions]
176
+ };
156
177
  }
157
- return triples;
158
- }, []);
178
+ return acc;
179
+ }, { triples: [], deletions: [] });
159
180
  }
160
181
  partialEntityToTriples(subject, entity) {
161
- const entityTriples = Object.entries(entity).reduce((triples, [key, value]) => {
182
+ return Object.entries(entity).reduce((acc, [key, value]) => {
162
183
  const values = (0, Util_1.ensureArray)(value);
163
184
  if (key !== '@id') {
164
185
  let predicateTriples;
165
186
  if (key === '@type') {
166
- predicateTriples = this.buildTriplesWithSubjectPredicateAndIriValue(subject, SparqlUtil_1.rdfTypeNamedNode, values);
187
+ predicateTriples = { triples: this.buildTriplesWithSubjectPredicateAndIriValue(subject, SparqlUtil_1.rdfTypeNamedNode, values), insertions: [] };
167
188
  }
168
189
  else {
169
190
  predicateTriples = this.buildTriplesForSubjectPredicateAndValues(subject, key, values);
170
191
  }
171
- return [...triples, ...predicateTriples];
192
+ return { triples: [...acc.triples, ...predicateTriples.triples], insertions: [...acc.insertions, ...predicateTriples.insertions] };
172
193
  }
173
- return triples;
174
- }, []);
175
- return entityTriples;
194
+ return acc;
195
+ }, { triples: [], insertions: [] });
176
196
  }
177
197
  entityToTriples(entity, subject) {
178
- const entityTriples = Object.entries(entity).reduce((triples, [key, value]) => {
198
+ const entityTriples = Object.entries(entity).reduce((acc, [key, value]) => {
179
199
  const values = (0, Util_1.ensureArray)(value);
180
200
  if (key !== '@id') {
181
201
  if (key === '@type') {
182
202
  const predicateTriples = this.buildTriplesWithSubjectPredicateAndIriValue(subject, SparqlUtil_1.rdfTypeNamedNode, values);
183
- return [...triples, ...predicateTriples];
203
+ return { triples: [...acc.triples, ...predicateTriples], insertions: acc.insertions };
184
204
  }
185
205
  if (!(this.setTimestamps && key === constants_1.EngineConstants.prop.dateModified)) {
186
206
  const predicateTriples = this.buildTriplesForSubjectPredicateAndValues(subject, key, values);
187
- return [...triples, ...predicateTriples];
207
+ return { triples: [...acc.triples, ...predicateTriples.triples], insertions: [...acc.insertions, ...predicateTriples.insertions] };
188
208
  }
189
209
  }
190
- return triples;
191
- }, []);
210
+ return acc;
211
+ }, { triples: [], insertions: [] });
192
212
  const timestampTriples = [];
193
213
  if (this.setTimestamps && subject.termType === 'NamedNode') {
194
214
  if (!(constants_1.EngineConstants.prop.dateCreated in entity)) {
@@ -197,13 +217,19 @@ class SparqlUpdateBuilder {
197
217
  timestampTriples.push({ subject, predicate: SparqlUtil_1.modified, object: SparqlUtil_1.now });
198
218
  }
199
219
  return {
200
- entityTriples,
220
+ entityTriples: entityTriples.triples,
221
+ insertions: entityTriples.insertions,
201
222
  timestampTriples
202
223
  };
203
224
  }
204
225
  buildTriplesForSubjectPredicateAndValues(subject, predicate, values) {
205
226
  const predicateTerm = data_model_1.default.namedNode(predicate);
206
- return values.flatMap((value) => this.buildTriplesWithSubjectPredicateAndValue(subject, predicateTerm, value));
227
+ // Return values.flatMap((value: any): { triples: Triple[]; insertions: GraphQuads[] } =>
228
+ // this.buildTriplesWithSubjectPredicateAndValue(subject, predicateTerm, value));
229
+ return values.reduce((acc, value) => {
230
+ const { triples, insertions } = this.buildTriplesWithSubjectPredicateAndValue(subject, predicateTerm, value);
231
+ return { triples: [...acc.triples, ...triples], insertions: [...acc.insertions, ...insertions] };
232
+ }, { triples: [], insertions: [] });
207
233
  }
208
234
  buildTriplesWithSubjectPredicateAndIriValue(subject, predicate, values) {
209
235
  return values.map((valueItem) => ({
@@ -223,21 +249,28 @@ class SparqlUpdateBuilder {
223
249
  const isObject = typeof value === 'object';
224
250
  if (isObject) {
225
251
  if ('@list' in value) {
226
- return this.buildTriplesForList(subject, predicate, value['@list']);
252
+ return { triples: this.buildTriplesForList(subject, predicate, value['@list']), insertions: [] };
227
253
  }
228
254
  if ('@value' in value) {
229
- return [{ subject, predicate, object: this.jsonLdValueObjectToLiteral(value) }];
255
+ return { triples: [{ subject, predicate, object: this.jsonLdValueObjectToLiteral(value) }], insertions: [] };
230
256
  }
231
257
  const isReferenceObject = '@id' in value;
232
258
  const isBlankNodeReferenceObject = !isReferenceObject || value['@id'].startsWith('_:');
233
259
  if (isBlankNodeReferenceObject) {
234
- return this.buildTriplesForBlankNode(subject, predicate, value);
260
+ return { triples: this.buildTriplesForBlankNode(subject, predicate, value), insertions: [] };
235
261
  }
236
262
  if (isReferenceObject) {
237
- return [{ subject, predicate, object: data_model_1.default.namedNode(value['@id']) }];
263
+ const triples = [
264
+ { subject, predicate, object: data_model_1.default.namedNode(value['@id']) }
265
+ ];
266
+ if (value['@type']) {
267
+ const { entityTriples, insertions } = this.entityToTriples(value, data_model_1.default.namedNode(value['@id']));
268
+ return { triples, insertions: [...insertions, (0, SparqlUtil_1.createSparqlGraphQuads)(data_model_1.default.namedNode(value['@id']), entityTriples)] };
269
+ }
270
+ return { triples, insertions: [] };
238
271
  }
239
272
  }
240
- return [{ subject, predicate, object: (0, TripleUtil_1.valueToLiteral)(value) }];
273
+ return { triples: [{ subject, predicate, object: (0, TripleUtil_1.valueToLiteral)(value) }], insertions: [] };
241
274
  }
242
275
  jsonLdValueObjectToLiteral(value) {
243
276
  if (typeof value['@value'] === 'object') {
@@ -258,7 +291,7 @@ class SparqlUpdateBuilder {
258
291
  : [{ subject: blankNode, predicate: SparqlUtil_1.restPredicate, object: SparqlUtil_1.nilPredicate }];
259
292
  return [
260
293
  { subject, predicate, object: blankNode },
261
- ...this.buildTriplesWithSubjectPredicateAndValue(blankNode, SparqlUtil_1.firstPredicate, value[0]),
294
+ ...this.buildTriplesWithSubjectPredicateAndValue(blankNode, SparqlUtil_1.firstPredicate, value[0]).triples,
262
295
  ...rest
263
296
  ];
264
297
  }
@@ -1 +1 @@
1
- {"version":3,"file":"SparqlUpdateBuilder.js","sourceRoot":"","sources":["../../../../src/storage/query-adapter/sparql/SparqlUpdateBuilder.ts"],"names":[],"mappings":"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","sourcesContent":["import { RDF } from '@comake/rmlmapper-js';\nimport DataFactory from '@rdfjs/data-model';\nimport type { BlankNode, NamedNode, Term } from '@rdfjs/types';\nimport type { NodeObject, ValueObject } from 'jsonld/jsonld';\nimport type {\n Update,\n GraphQuads,\n Triple,\n InsertDeleteOperation,\n UpdateOperation,\n ClearDropOperation,\n Pattern\n} from 'sparqljs';\nimport { EngineConstants } from '../../../constants';\nimport {\n bindNow,\n created,\n createSparqlBasicGraphPattern,\n createSparqlClearUpdate,\n createSparqlDropUpdate,\n createSparqlGraphQuads,\n createSparqlOptional,\n createSparqlUpdate,\n dropAll,\n firstPredicate,\n modified,\n nilPredicate,\n now,\n rdfTypeNamedNode,\n restPredicate\n} from '../../../util/SparqlUtil';\nimport { valueToLiteral } from '../../../util/TripleUtil';\nimport type { Entity } from '../../../util/Types';\nimport { ensureArray } from '../../../util/Util';\nimport { VariableGenerator } from './VariableGenerator';\n\nexport interface EntityUpdateQueries {\n clear: ClearDropOperation[];\n insertions: GraphQuads[];\n timestampInsertions: GraphQuads[];\n}\n\nexport interface EntityUpdateTriples {\n entityTriples: Triple[];\n timestampTriples: Triple[];\n}\n\nexport interface SparqlUpdateBuilderArgs {\n setTimestamps?: boolean;\n}\n\nexport class SparqlUpdateBuilder {\n private readonly variableGenerator: VariableGenerator;\n private readonly setTimestamps: boolean;\n\n public constructor(args?: SparqlUpdateBuilderArgs) {\n this.variableGenerator = new VariableGenerator();\n this.setTimestamps = args?.setTimestamps ?? false;\n }\n\n public buildPartialUpdate(idOrIds: string | string[], attributes: Partial<Entity>): Update {\n const ids = ensureArray(idOrIds);\n const updates = this.idsAndAttributesToGraphDeletionsAndInsertions(ids, attributes);\n return createSparqlUpdate(updates);\n }\n\n public buildUpdate(entityOrEntities: Entity | Entity[]): Update {\n const entities = ensureArray(entityOrEntities);\n const { clear, insertions, timestampInsertions } = this.entitiesToGraphDeletionsAndInsertions(entities);\n const insertUpdate: InsertDeleteOperation = {\n updateType: 'insert',\n insert: insertions\n };\n const updates = [ ...clear, insertUpdate ];\n if (timestampInsertions.length > 0) {\n updates.push({\n updateType: 'insertdelete',\n delete: [],\n insert: timestampInsertions,\n where: [ bindNow ]\n });\n }\n return createSparqlUpdate(updates);\n }\n\n public buildDeleteById(idOrIds: string | string[]): Update {\n const ids = ensureArray(idOrIds);\n const drops = this.idsToGraphDropUpdates(ids);\n return createSparqlUpdate(drops);\n }\n\n public buildDelete(entityOrEntities: Entity | Entity[]): Update {\n const entities = ensureArray(entityOrEntities);\n const drops = this.entitiesToGraphDropUpdates(entities);\n return createSparqlUpdate(drops);\n }\n\n public buildDeleteAll(): Update {\n return createSparqlUpdate([ dropAll ]);\n }\n\n private idsAndAttributesToGraphDeletionsAndInsertions(\n ids: string[],\n attributes: Partial<Entity>\n ): InsertDeleteOperation[] {\n return ids.flatMap((id): InsertDeleteOperation[] => {\n const subject = DataFactory.namedNode(id);\n const { attributesToUpdate, attributesToDelete } = this.partitionAttributes(attributes);\n const deletionTriples = this.partialEntityToDeletionTriples(attributesToUpdate, subject);\n const insertionTriples = this.partialEntityToTriples(subject, attributesToUpdate);\n const deleteOnlyTriples = this.partialEntityToDeletionTriples(attributesToDelete, subject);\n\n const updates: InsertDeleteOperation[] = [];\n\n if (deletionTriples.length > 0) {\n updates.push({\n updateType: 'insertdelete',\n delete: [ createSparqlGraphQuads(subject, deletionTriples) ],\n insert: [],\n where: deletionTriples.map(\n (triple): Pattern => createSparqlOptional([ createSparqlBasicGraphPattern([ triple ]) ])\n ),\n using: {\n default: [ subject ]\n }\n } as InsertDeleteOperation);\n }\n\n if (insertionTriples.length > 0) {\n updates.push({\n updateType: 'insert',\n insert: [ createSparqlGraphQuads(subject, insertionTriples) ]\n } as InsertDeleteOperation);\n }\n\n if (deleteOnlyTriples.length > 0) {\n updates.push({\n updateType: 'insertdelete',\n delete: [ createSparqlGraphQuads(subject, deleteOnlyTriples) ],\n insert: [],\n where: deleteOnlyTriples.map(\n (triple): Pattern => createSparqlOptional([ createSparqlBasicGraphPattern([ triple ]) ])\n ),\n using: {\n default: [ subject ]\n }\n } as InsertDeleteOperation);\n }\n\n const hasAnyChanges = deletionTriples.length > 0 || insertionTriples.length > 0 || deleteOnlyTriples.length > 0;\n\n if (this.setTimestamps && hasAnyChanges) {\n const modifiedVariable = DataFactory.variable(this.variableGenerator.getNext());\n const modifiedDeletionTriple = { subject, predicate: modified, object: modifiedVariable };\n const modifiedInsertionTriple = { subject, predicate: modified, object: now };\n updates.push({\n updateType: 'insertdelete',\n delete: [ createSparqlGraphQuads(subject, [ modifiedDeletionTriple ]) ],\n insert: [ createSparqlGraphQuads(subject, [ modifiedInsertionTriple ]) ],\n where: [ createSparqlOptional([ createSparqlBasicGraphPattern([ modifiedDeletionTriple ]) ]), bindNow ],\n using: {\n default: [ subject ]\n }\n } as InsertDeleteOperation);\n }\n\n return updates;\n });\n }\n\n private partitionAttributes(\n attributes: Partial<Entity>\n ): { attributesToUpdate: Partial<Entity>; attributesToDelete: Partial<Entity> } {\n const attributesToUpdate: Partial<Entity> = {};\n const attributesToDelete: Partial<Entity> = {};\n\n Object.entries(attributes).forEach(([ key, value ]) => {\n if (key === '@id') {\n return;\n }\n if (value === null) {\n attributesToDelete[key] = value;\n } else if (value !== undefined) {\n attributesToUpdate[key] = value;\n }\n });\n\n return { attributesToUpdate, attributesToDelete };\n }\n\n private entitiesToGraphDeletionsAndInsertions(entities: Entity[]): EntityUpdateQueries {\n return entities.reduce(\n (obj: EntityUpdateQueries, entity): EntityUpdateQueries => {\n const entityGraphName = DataFactory.namedNode(entity['@id']);\n const { entityTriples, timestampTriples } = this.entityToTriples(entity, entityGraphName);\n obj.clear.push(createSparqlClearUpdate(entityGraphName));\n obj.insertions.push(createSparqlGraphQuads(entityGraphName, entityTriples));\n if (timestampTriples.length > 0) {\n obj.timestampInsertions.push(createSparqlGraphQuads(entityGraphName, timestampTriples));\n }\n return obj;\n },\n { clear: [], insertions: [], timestampInsertions: []}\n );\n }\n\n private idsToGraphDropUpdates(ids: string[]): UpdateOperation[] {\n return ids.map((id): UpdateOperation => {\n const entityGraphName = DataFactory.namedNode(id);\n return createSparqlDropUpdate(entityGraphName);\n });\n }\n\n private entitiesToGraphDropUpdates(entities: Entity[]): UpdateOperation[] {\n return entities.map((entity): UpdateOperation => {\n const entityGraphName = DataFactory.namedNode(entity['@id']);\n return createSparqlDropUpdate(entityGraphName);\n });\n }\n\n private partialEntityToDeletionTriples(entity: NodeObject, subject: NamedNode): Triple[] {\n return Object.keys(entity).reduce((triples: Triple[], key): Triple[] => {\n if (key !== '@id') {\n return [\n ...triples,\n this.buildTriplesWithSubjectPredicateAndVariableValue(\n subject,\n DataFactory.namedNode(key),\n this.variableGenerator.getNext()\n )\n ];\n }\n return triples;\n }, []);\n }\n\n private partialEntityToTriples(subject: NamedNode, entity: NodeObject): Triple[] {\n const entityTriples = Object.entries(entity).reduce((triples: Triple[], [ key, value ]): Triple[] => {\n const values = ensureArray(value);\n if (key !== '@id') {\n let predicateTriples: Triple[];\n if (key === '@type') {\n predicateTriples = this.buildTriplesWithSubjectPredicateAndIriValue(\n subject,\n rdfTypeNamedNode,\n values as string[]\n );\n } else {\n predicateTriples = this.buildTriplesForSubjectPredicateAndValues(subject, key, values);\n }\n return [ ...triples, ...predicateTriples ];\n }\n return triples;\n }, []);\n return entityTriples;\n }\n\n private entityToTriples(entity: NodeObject, subject: BlankNode | NamedNode): EntityUpdateTriples {\n const entityTriples = Object.entries(entity).reduce((triples: Triple[], [ key, value ]): Triple[] => {\n const values = ensureArray(value);\n if (key !== '@id') {\n if (key === '@type') {\n const predicateTriples = this.buildTriplesWithSubjectPredicateAndIriValue(\n subject,\n rdfTypeNamedNode,\n values as string[]\n );\n return [ ...triples, ...predicateTriples ];\n }\n if (!(this.setTimestamps && key === EngineConstants.prop.dateModified)) {\n const predicateTriples = this.buildTriplesForSubjectPredicateAndValues(subject, key, values);\n return [ ...triples, ...predicateTriples ];\n }\n }\n return triples;\n }, []);\n\n const timestampTriples = [];\n if (this.setTimestamps && subject.termType === 'NamedNode') {\n if (!(EngineConstants.prop.dateCreated in entity)) {\n timestampTriples.push({ subject, predicate: created, object: now });\n }\n timestampTriples.push({ subject, predicate: modified, object: now });\n }\n return {\n entityTriples,\n timestampTriples\n };\n }\n\n private buildTriplesForSubjectPredicateAndValues(\n subject: BlankNode | NamedNode,\n predicate: string,\n values: any[]\n ): Triple[] {\n const predicateTerm = DataFactory.namedNode(predicate);\n return values.flatMap((value: any): Triple[] =>\n this.buildTriplesWithSubjectPredicateAndValue(subject, predicateTerm, value));\n }\n\n private buildTriplesWithSubjectPredicateAndIriValue(\n subject: BlankNode | NamedNode,\n predicate: NamedNode,\n values: string[]\n ): Triple[] {\n return values.map(\n (valueItem): Triple =>\n ({\n subject,\n predicate,\n object: DataFactory.namedNode(valueItem)\n } as Triple)\n );\n }\n\n private buildTriplesWithSubjectPredicateAndVariableValue(\n subject: NamedNode,\n predicate: NamedNode,\n value: string\n ): Triple {\n return {\n subject,\n predicate,\n object: DataFactory.variable(value)\n };\n }\n\n private buildTriplesWithSubjectPredicateAndValue(\n subject: BlankNode | NamedNode,\n predicate: NamedNode,\n value: any\n ): Triple[] {\n const isObject = typeof value === 'object';\n if (isObject) {\n if ('@list' in value) {\n return this.buildTriplesForList(subject, predicate, value['@list']);\n }\n if ('@value' in value) {\n return [ { subject, predicate, object: this.jsonLdValueObjectToLiteral(value) } as Triple ];\n }\n\n const isReferenceObject = '@id' in value;\n const isBlankNodeReferenceObject = !isReferenceObject || (value['@id'] as string).startsWith('_:');\n if (isBlankNodeReferenceObject) {\n return this.buildTriplesForBlankNode(subject, predicate, value as NodeObject);\n }\n if (isReferenceObject) {\n return [ { subject, predicate, object: DataFactory.namedNode(value['@id']) } as Triple ];\n }\n }\n return [ { subject, predicate, object: valueToLiteral(value) } as Triple ];\n }\n\n private jsonLdValueObjectToLiteral(value: ValueObject): Term {\n if (typeof value['@value'] === 'object') {\n return DataFactory.literal(JSON.stringify(value['@value']), RDF.JSON);\n }\n if ((value as any)['@language']) {\n return DataFactory.literal(value['@value'] as string, (value as any)['@language']);\n }\n if ((value as any)['@type']) {\n return DataFactory.literal(value['@value'].toString(), (value as any)['@type']);\n }\n return valueToLiteral(value['@value']);\n }\n\n private buildTriplesForList(subject: BlankNode | NamedNode, predicate: NamedNode, value: NodeObject[]): Triple[] {\n const blankNode = DataFactory.blankNode(this.variableGenerator.getNext());\n const rest =\n value.length > 1\n ? this.buildTriplesForList(blankNode, restPredicate, value.slice(1))\n : [{ subject: blankNode, predicate: restPredicate, object: nilPredicate }];\n return [\n { subject, predicate, object: blankNode },\n ...this.buildTriplesWithSubjectPredicateAndValue(blankNode, firstPredicate, value[0]),\n ...rest\n ];\n }\n\n private buildTriplesForBlankNode(subject: BlankNode | NamedNode, predicate: NamedNode, value: NodeObject): Triple[] {\n const blankNode = DataFactory.blankNode(this.variableGenerator.getNext());\n const { entityTriples } = this.entityToTriples(value, blankNode);\n return [{ subject, predicate, object: blankNode }, ...entityTriples ];\n }\n}\n"]}
1
+ {"version":3,"file":"SparqlUpdateBuilder.js","sourceRoot":"","sources":["../../../../src/storage/query-adapter/sparql/SparqlUpdateBuilder.ts"],"names":[],"mappings":"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","sourcesContent":["import { RDF } from '@comake/rmlmapper-js';\nimport DataFactory from '@rdfjs/data-model';\nimport type { BlankNode, NamedNode, Term } from '@rdfjs/types';\nimport type { NodeObject, ValueObject } from 'jsonld/jsonld';\nimport type {\n Update,\n GraphQuads,\n Triple,\n InsertDeleteOperation,\n UpdateOperation,\n ClearDropOperation,\n Pattern\n} from 'sparqljs';\nimport { EngineConstants } from '../../../constants';\nimport {\n bindNow,\n created,\n createSparqlBasicGraphPattern,\n createSparqlClearUpdate,\n createSparqlDropUpdate,\n createSparqlGraphQuads,\n createSparqlOptional,\n createSparqlUpdate,\n dropAll,\n firstPredicate,\n modified,\n nilPredicate,\n now,\n rdfTypeNamedNode,\n restPredicate\n} from '../../../util/SparqlUtil';\nimport { valueToLiteral } from '../../../util/TripleUtil';\nimport type { Entity } from '../../../util/Types';\nimport { ensureArray } from '../../../util/Util';\nimport { VariableGenerator } from './VariableGenerator';\n\nexport interface EntityUpdateQueries {\n clear: ClearDropOperation[];\n insertions: GraphQuads[];\n timestampInsertions: GraphQuads[];\n}\n\nexport interface EntityUpdateTriples {\n entityTriples: Triple[];\n timestampTriples: Triple[];\n insertions: GraphQuads[];\n}\n\nexport interface SparqlUpdateBuilderArgs {\n setTimestamps?: boolean;\n}\n\nexport class SparqlUpdateBuilder {\n private readonly variableGenerator: VariableGenerator;\n private readonly setTimestamps: boolean;\n\n public constructor(args?: SparqlUpdateBuilderArgs) {\n this.variableGenerator = new VariableGenerator();\n this.setTimestamps = args?.setTimestamps ?? false;\n }\n\n public buildPartialUpdate(idOrIds: string | string[], attributes: Partial<Entity>): Update {\n const ids = ensureArray(idOrIds);\n const updates = this.idsAndAttributesToGraphDeletionsAndInsertions(ids, attributes);\n return createSparqlUpdate(updates);\n }\n\n public buildUpdate(entityOrEntities: Entity | Entity[]): Update {\n const entities = ensureArray(entityOrEntities);\n const { clear, insertions, timestampInsertions } = this.entitiesToGraphDeletionsAndInsertions(entities);\n const insertUpdate: InsertDeleteOperation = {\n updateType: 'insert',\n insert: insertions\n };\n const updates = [ ...clear, insertUpdate ];\n if (timestampInsertions.length > 0) {\n updates.push({\n updateType: 'insertdelete',\n delete: [],\n insert: timestampInsertions,\n where: [ bindNow ]\n });\n }\n return createSparqlUpdate(updates);\n }\n\n public buildDeleteById(idOrIds: string | string[]): Update {\n const ids = ensureArray(idOrIds);\n const drops = this.idsToGraphDropUpdates(ids);\n return createSparqlUpdate(drops);\n }\n\n public buildDelete(entityOrEntities: Entity | Entity[]): Update {\n const entities = ensureArray(entityOrEntities);\n const drops = this.entitiesToGraphDropUpdates(entities);\n return createSparqlUpdate(drops);\n }\n\n public buildDeleteAll(): Update {\n return createSparqlUpdate([ dropAll ]);\n }\n\n private idsAndAttributesToGraphDeletionsAndInsertions(\n ids: string[],\n attributes: Partial<Entity>\n ): InsertDeleteOperation[] {\n return ids.flatMap((id): InsertDeleteOperation[] => {\n const subject = DataFactory.namedNode(id);\n const { attributesToUpdate, attributesToDelete } = this.partitionAttributes(attributes);\n const { triples: deletionTriples, deletions: deletionDeletions } = this.partialEntityToDeletionTriples(attributesToUpdate, subject);\n const { triples: insertionTriples, insertions: insertionInsertions } = this.partialEntityToTriples(subject, attributesToUpdate);\n const { triples: deleteOnlyTriples } = this.partialEntityToDeletionTriples(attributesToDelete, subject);\n\n const updates: InsertDeleteOperation[] = [];\n\n if (deletionTriples.length > 0) {\n updates.push({\n updateType: 'insertdelete',\n delete: [ createSparqlGraphQuads(subject, deletionTriples) ],\n insert: [],\n where: deletionTriples.map(\n (triple): Pattern => createSparqlOptional([ createSparqlBasicGraphPattern([ triple ]) ])\n ),\n using: {\n default: [ subject ]\n }\n } as InsertDeleteOperation);\n }\n\n for (const deletion of deletionDeletions) {\n updates.push({\n updateType: 'insertdelete',\n delete: [ deletion ],\n insert: [],\n where: [\n ...deletion.triples.map(\n (triple): Pattern => createSparqlOptional([ createSparqlBasicGraphPattern([ triple ]) ])\n )\n ],\n using: {\n default: [ deletion.name ]\n }\n } as InsertDeleteOperation);\n }\n\n if (insertionTriples.length > 0) {\n updates.push({\n updateType: 'insert',\n insert: [ createSparqlGraphQuads(subject, insertionTriples), ...insertionInsertions ]\n } as InsertDeleteOperation);\n }\n\n if (deleteOnlyTriples.length > 0) {\n updates.push({\n updateType: 'insertdelete',\n delete: [ createSparqlGraphQuads(subject, deleteOnlyTriples) ],\n insert: [],\n where: deleteOnlyTriples.map(\n (triple): Pattern => createSparqlOptional([ createSparqlBasicGraphPattern([ triple ]) ])\n ),\n using: {\n default: [ subject ]\n }\n } as InsertDeleteOperation);\n }\n\n const hasAnyChanges = deletionTriples.length > 0 || insertionTriples.length > 0 || deleteOnlyTriples.length > 0;\n\n if (this.setTimestamps && hasAnyChanges) {\n const modifiedVariable = DataFactory.variable(this.variableGenerator.getNext());\n const modifiedDeletionTriple = { subject, predicate: modified, object: modifiedVariable };\n const modifiedInsertionTriple = { subject, predicate: modified, object: now };\n updates.push({\n updateType: 'insertdelete',\n delete: [ createSparqlGraphQuads(subject, [ modifiedDeletionTriple ]) ],\n insert: [ createSparqlGraphQuads(subject, [ modifiedInsertionTriple ]) ],\n where: [ createSparqlOptional([ createSparqlBasicGraphPattern([ modifiedDeletionTriple ]) ]), bindNow ],\n using: {\n default: [ subject ]\n }\n } as InsertDeleteOperation);\n }\n\n return updates;\n });\n }\n\n private partitionAttributes(\n attributes: Partial<Entity>\n ): { attributesToUpdate: Partial<Entity>; attributesToDelete: Partial<Entity> } {\n const attributesToUpdate: Partial<Entity> = {};\n const attributesToDelete: Partial<Entity> = {};\n\n Object.entries(attributes).forEach(([ key, value ]) => {\n if (key === '@id') {\n return;\n }\n if (value === null) {\n attributesToDelete[key] = value;\n } else if (value !== undefined) {\n attributesToUpdate[key] = value;\n }\n });\n\n return { attributesToUpdate, attributesToDelete };\n }\n\n private entitiesToGraphDeletionsAndInsertions(entities: Entity[]): EntityUpdateQueries {\n return entities.reduce(\n (obj: EntityUpdateQueries, entity): EntityUpdateQueries => {\n const entityGraphName = DataFactory.namedNode(entity['@id']);\n const { entityTriples, timestampTriples, insertions } = this.entityToTriples(entity, entityGraphName);\n obj.clear.push(createSparqlClearUpdate(entityGraphName));\n obj.insertions.push(createSparqlGraphQuads(entityGraphName, entityTriples), ...insertions);\n if (timestampTriples.length > 0) {\n obj.timestampInsertions.push(createSparqlGraphQuads(entityGraphName, timestampTriples));\n }\n return obj;\n },\n { clear: [], insertions: [], timestampInsertions: []}\n );\n }\n\n private idsToGraphDropUpdates(ids: string[]): UpdateOperation[] {\n return ids.map((id): UpdateOperation => {\n const entityGraphName = DataFactory.namedNode(id);\n return createSparqlDropUpdate(entityGraphName);\n });\n }\n\n private entitiesToGraphDropUpdates(entities: Entity[]): UpdateOperation[] {\n return entities.map((entity): UpdateOperation => {\n const entityGraphName = DataFactory.namedNode(entity['@id']);\n return createSparqlDropUpdate(entityGraphName);\n });\n }\n\n private partialEntityToDeletionTriples(entity: NodeObject, subject: NamedNode): { triples: Triple[]; deletions: GraphQuads[] } {\n return Object.entries(entity).reduce((acc: { triples: Triple[]; deletions: GraphQuads[] }, [ key, value ]): { triples: Triple[]; deletions: GraphQuads[] } => {\n if (key !== '@id') {\n let deletions: GraphQuads[] = [];\n if (value && typeof value === 'object' && '@id' in value && typeof value['@id'] === 'string' && '@type' in value) {\n const { triples: nestedTriples, deletions: nestedDeletions } = this.partialEntityToDeletionTriples(value as NodeObject, DataFactory.namedNode(value['@id']));\n deletions = [ ...deletions, createSparqlGraphQuads(DataFactory.namedNode(value['@id']), nestedTriples), ...nestedDeletions ];\n }\n return {\n triples: [\n ...acc.triples,\n this.buildTriplesWithSubjectPredicateAndVariableValue(\n subject,\n key === '@type' ? rdfTypeNamedNode : DataFactory.namedNode(key),\n this.variableGenerator.getNext()\n )\n ],\n deletions: [ ...acc.deletions, ...deletions ]\n };\n }\n return acc;\n }, { triples: [], deletions: [] });\n }\n\n private partialEntityToTriples(subject: NamedNode, entity: NodeObject): { triples: Triple[]; insertions: GraphQuads[] } {\n return Object.entries(entity).reduce((acc: { triples: Triple[]; insertions: GraphQuads[] }, [ key, value ]): { triples: Triple[]; insertions: GraphQuads[] } => {\n const values = ensureArray(value);\n if (key !== '@id') {\n let predicateTriples: { triples: Triple[]; insertions: GraphQuads[] };\n if (key === '@type') {\n predicateTriples = { triples: this.buildTriplesWithSubjectPredicateAndIriValue(\n subject,\n rdfTypeNamedNode,\n values as string[]\n ), insertions: [] };\n } else {\n predicateTriples = this.buildTriplesForSubjectPredicateAndValues(subject, key, values);\n }\n return { triples: [ ...acc.triples, ...predicateTriples.triples ], insertions: [ ...acc.insertions, ...predicateTriples.insertions ] };\n }\n return acc;\n }, { triples: [], insertions: [] });\n }\n\n private entityToTriples(entity: NodeObject, subject: BlankNode | NamedNode): EntityUpdateTriples {\n const entityTriples = Object.entries(entity).reduce((acc: { triples: Triple[]; insertions: GraphQuads[] }, [ key, value ]): { triples: Triple[]; insertions: GraphQuads[] } => {\n const values = ensureArray(value);\n if (key !== '@id') {\n if (key === '@type') {\n const predicateTriples = this.buildTriplesWithSubjectPredicateAndIriValue(\n subject,\n rdfTypeNamedNode,\n values as string[]\n );\n return { triples: [ ...acc.triples, ...predicateTriples ], insertions: acc.insertions };\n }\n if (!(this.setTimestamps && key === EngineConstants.prop.dateModified)) {\n const predicateTriples = this.buildTriplesForSubjectPredicateAndValues(subject, key, values);\n return { triples: [ ...acc.triples, ...predicateTriples.triples ], insertions: [ ...acc.insertions, ...predicateTriples.insertions ] };\n }\n }\n return acc;\n }, { triples: [], insertions: [] });\n\n const timestampTriples = [];\n if (this.setTimestamps && subject.termType === 'NamedNode') {\n if (!(EngineConstants.prop.dateCreated in entity)) {\n timestampTriples.push({ subject, predicate: created, object: now });\n }\n timestampTriples.push({ subject, predicate: modified, object: now });\n }\n return {\n entityTriples: entityTriples.triples,\n insertions: entityTriples.insertions,\n timestampTriples\n };\n }\n\n private buildTriplesForSubjectPredicateAndValues(\n subject: BlankNode | NamedNode,\n predicate: string,\n values: any[]\n ): { triples: Triple[]; insertions: GraphQuads[] } {\n const predicateTerm = DataFactory.namedNode(predicate);\n // Return values.flatMap((value: any): { triples: Triple[]; insertions: GraphQuads[] } =>\n // this.buildTriplesWithSubjectPredicateAndValue(subject, predicateTerm, value));\n return values.reduce((acc: { triples: Triple[]; insertions: GraphQuads[] }, value: any) => {\n const { triples, insertions } = this.buildTriplesWithSubjectPredicateAndValue(subject, predicateTerm, value);\n return { triples: [ ...acc.triples, ...triples ], insertions: [ ...acc.insertions, ...insertions ] };\n }, { triples: [], insertions: [] });\n }\n\n private buildTriplesWithSubjectPredicateAndIriValue(\n subject: BlankNode | NamedNode,\n predicate: NamedNode,\n values: string[]\n ): Triple[] {\n return values.map(\n (valueItem): Triple =>\n ({\n subject,\n predicate,\n object: DataFactory.namedNode(valueItem)\n } as Triple)\n );\n }\n\n private buildTriplesWithSubjectPredicateAndVariableValue(\n subject: NamedNode,\n predicate: NamedNode,\n value: string\n ): Triple {\n return {\n subject,\n predicate,\n object: DataFactory.variable(value)\n };\n }\n\n private buildTriplesWithSubjectPredicateAndValue(\n subject: BlankNode | NamedNode,\n predicate: NamedNode,\n value: any\n ): { triples: Triple[]; insertions: GraphQuads[] } {\n const isObject = typeof value === 'object';\n if (isObject) {\n if ('@list' in value) {\n return { triples: this.buildTriplesForList(subject, predicate, value['@list']), insertions: [] };\n }\n if ('@value' in value) {\n return { triples: [ { subject, predicate, object: this.jsonLdValueObjectToLiteral(value) } as Triple ], insertions: [] };\n }\n\n const isReferenceObject = '@id' in value;\n const isBlankNodeReferenceObject = !isReferenceObject || (value['@id'] as string).startsWith('_:');\n if (isBlankNodeReferenceObject) {\n return { triples: this.buildTriplesForBlankNode(subject, predicate, value as NodeObject), insertions: [] };\n }\n if (isReferenceObject) {\n const triples = [ \n { subject, predicate, object: DataFactory.namedNode(value['@id']) } as Triple\n ];\n if (value['@type']) {\n const { entityTriples, insertions } = this.entityToTriples(value as NodeObject, DataFactory.namedNode(value['@id']));\n return { triples, insertions: [ ...insertions, createSparqlGraphQuads(DataFactory.namedNode(value['@id']), entityTriples) ] };\n }\n return { triples, insertions: [] };\n }\n }\n return { triples: [ { subject, predicate, object: valueToLiteral(value) } as Triple ], insertions: [] };\n }\n\n private jsonLdValueObjectToLiteral(value: ValueObject): Term {\n if (typeof value['@value'] === 'object') {\n return DataFactory.literal(JSON.stringify(value['@value']), RDF.JSON);\n }\n if ((value as any)['@language']) {\n return DataFactory.literal(value['@value'] as string, (value as any)['@language']);\n }\n if ((value as any)['@type']) {\n return DataFactory.literal(value['@value'].toString(), (value as any)['@type']);\n }\n return valueToLiteral(value['@value']);\n }\n\n private buildTriplesForList(subject: BlankNode | NamedNode, predicate: NamedNode, value: NodeObject[]): Triple[] {\n const blankNode = DataFactory.blankNode(this.variableGenerator.getNext());\n const rest =\n value.length > 1\n ? this.buildTriplesForList(blankNode, restPredicate, value.slice(1))\n : [{ subject: blankNode, predicate: restPredicate, object: nilPredicate }];\n return [\n { subject, predicate, object: blankNode },\n ...this.buildTriplesWithSubjectPredicateAndValue(blankNode, firstPredicate, value[0]).triples,\n ...rest\n ];\n }\n\n private buildTriplesForBlankNode(subject: BlankNode | NamedNode, predicate: NamedNode, value: NodeObject): Triple[] {\n const blankNode = DataFactory.blankNode(this.variableGenerator.getNext());\n const { entityTriples } = this.entityToTriples(value, blankNode);\n return [{ subject, predicate, object: blankNode }, ...entityTriples ];\n }\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@comake/skl-js-engine",
3
- "version": "1.3.13",
3
+ "version": "1.3.14",
4
4
  "description": "Standard Knowledge Language Javascript Engine",
5
5
  "keywords": [
6
6
  "skl",
@@ -43,6 +43,7 @@ export interface EntityUpdateQueries {
43
43
  export interface EntityUpdateTriples {
44
44
  entityTriples: Triple[];
45
45
  timestampTriples: Triple[];
46
+ insertions: GraphQuads[];
46
47
  }
47
48
 
48
49
  export interface SparqlUpdateBuilderArgs {
@@ -106,9 +107,9 @@ export class SparqlUpdateBuilder {
106
107
  return ids.flatMap((id): InsertDeleteOperation[] => {
107
108
  const subject = DataFactory.namedNode(id);
108
109
  const { attributesToUpdate, attributesToDelete } = this.partitionAttributes(attributes);
109
- const deletionTriples = this.partialEntityToDeletionTriples(attributesToUpdate, subject);
110
- const insertionTriples = this.partialEntityToTriples(subject, attributesToUpdate);
111
- const deleteOnlyTriples = this.partialEntityToDeletionTriples(attributesToDelete, subject);
110
+ const { triples: deletionTriples, deletions: deletionDeletions } = this.partialEntityToDeletionTriples(attributesToUpdate, subject);
111
+ const { triples: insertionTriples, insertions: insertionInsertions } = this.partialEntityToTriples(subject, attributesToUpdate);
112
+ const { triples: deleteOnlyTriples } = this.partialEntityToDeletionTriples(attributesToDelete, subject);
112
113
 
113
114
  const updates: InsertDeleteOperation[] = [];
114
115
 
@@ -126,10 +127,26 @@ export class SparqlUpdateBuilder {
126
127
  } as InsertDeleteOperation);
127
128
  }
128
129
 
130
+ for (const deletion of deletionDeletions) {
131
+ updates.push({
132
+ updateType: 'insertdelete',
133
+ delete: [ deletion ],
134
+ insert: [],
135
+ where: [
136
+ ...deletion.triples.map(
137
+ (triple): Pattern => createSparqlOptional([ createSparqlBasicGraphPattern([ triple ]) ])
138
+ )
139
+ ],
140
+ using: {
141
+ default: [ deletion.name ]
142
+ }
143
+ } as InsertDeleteOperation);
144
+ }
145
+
129
146
  if (insertionTriples.length > 0) {
130
147
  updates.push({
131
148
  updateType: 'insert',
132
- insert: [ createSparqlGraphQuads(subject, insertionTriples) ]
149
+ insert: [ createSparqlGraphQuads(subject, insertionTriples), ...insertionInsertions ]
133
150
  } as InsertDeleteOperation);
134
151
  }
135
152
 
@@ -192,9 +209,9 @@ export class SparqlUpdateBuilder {
192
209
  return entities.reduce(
193
210
  (obj: EntityUpdateQueries, entity): EntityUpdateQueries => {
194
211
  const entityGraphName = DataFactory.namedNode(entity['@id']);
195
- const { entityTriples, timestampTriples } = this.entityToTriples(entity, entityGraphName);
212
+ const { entityTriples, timestampTriples, insertions } = this.entityToTriples(entity, entityGraphName);
196
213
  obj.clear.push(createSparqlClearUpdate(entityGraphName));
197
- obj.insertions.push(createSparqlGraphQuads(entityGraphName, entityTriples));
214
+ obj.insertions.push(createSparqlGraphQuads(entityGraphName, entityTriples), ...insertions);
198
215
  if (timestampTriples.length > 0) {
199
216
  obj.timestampInsertions.push(createSparqlGraphQuads(entityGraphName, timestampTriples));
200
217
  }
@@ -218,45 +235,52 @@ export class SparqlUpdateBuilder {
218
235
  });
219
236
  }
220
237
 
221
- private partialEntityToDeletionTriples(entity: NodeObject, subject: NamedNode): Triple[] {
222
- return Object.keys(entity).reduce((triples: Triple[], key): Triple[] => {
238
+ private partialEntityToDeletionTriples(entity: NodeObject, subject: NamedNode): { triples: Triple[]; deletions: GraphQuads[] } {
239
+ return Object.entries(entity).reduce((acc: { triples: Triple[]; deletions: GraphQuads[] }, [ key, value ]): { triples: Triple[]; deletions: GraphQuads[] } => {
223
240
  if (key !== '@id') {
224
- return [
225
- ...triples,
226
- this.buildTriplesWithSubjectPredicateAndVariableValue(
227
- subject,
228
- DataFactory.namedNode(key),
229
- this.variableGenerator.getNext()
230
- )
231
- ];
241
+ let deletions: GraphQuads[] = [];
242
+ if (value && typeof value === 'object' && '@id' in value && typeof value['@id'] === 'string' && '@type' in value) {
243
+ const { triples: nestedTriples, deletions: nestedDeletions } = this.partialEntityToDeletionTriples(value as NodeObject, DataFactory.namedNode(value['@id']));
244
+ deletions = [ ...deletions, createSparqlGraphQuads(DataFactory.namedNode(value['@id']), nestedTriples), ...nestedDeletions ];
245
+ }
246
+ return {
247
+ triples: [
248
+ ...acc.triples,
249
+ this.buildTriplesWithSubjectPredicateAndVariableValue(
250
+ subject,
251
+ key === '@type' ? rdfTypeNamedNode : DataFactory.namedNode(key),
252
+ this.variableGenerator.getNext()
253
+ )
254
+ ],
255
+ deletions: [ ...acc.deletions, ...deletions ]
256
+ };
232
257
  }
233
- return triples;
234
- }, []);
258
+ return acc;
259
+ }, { triples: [], deletions: [] });
235
260
  }
236
261
 
237
- private partialEntityToTriples(subject: NamedNode, entity: NodeObject): Triple[] {
238
- const entityTriples = Object.entries(entity).reduce((triples: Triple[], [ key, value ]): Triple[] => {
262
+ private partialEntityToTriples(subject: NamedNode, entity: NodeObject): { triples: Triple[]; insertions: GraphQuads[] } {
263
+ return Object.entries(entity).reduce((acc: { triples: Triple[]; insertions: GraphQuads[] }, [ key, value ]): { triples: Triple[]; insertions: GraphQuads[] } => {
239
264
  const values = ensureArray(value);
240
265
  if (key !== '@id') {
241
- let predicateTriples: Triple[];
266
+ let predicateTriples: { triples: Triple[]; insertions: GraphQuads[] };
242
267
  if (key === '@type') {
243
- predicateTriples = this.buildTriplesWithSubjectPredicateAndIriValue(
268
+ predicateTriples = { triples: this.buildTriplesWithSubjectPredicateAndIriValue(
244
269
  subject,
245
270
  rdfTypeNamedNode,
246
271
  values as string[]
247
- );
272
+ ), insertions: [] };
248
273
  } else {
249
274
  predicateTriples = this.buildTriplesForSubjectPredicateAndValues(subject, key, values);
250
275
  }
251
- return [ ...triples, ...predicateTriples ];
276
+ return { triples: [ ...acc.triples, ...predicateTriples.triples ], insertions: [ ...acc.insertions, ...predicateTriples.insertions ] };
252
277
  }
253
- return triples;
254
- }, []);
255
- return entityTriples;
278
+ return acc;
279
+ }, { triples: [], insertions: [] });
256
280
  }
257
281
 
258
282
  private entityToTriples(entity: NodeObject, subject: BlankNode | NamedNode): EntityUpdateTriples {
259
- const entityTriples = Object.entries(entity).reduce((triples: Triple[], [ key, value ]): Triple[] => {
283
+ const entityTriples = Object.entries(entity).reduce((acc: { triples: Triple[]; insertions: GraphQuads[] }, [ key, value ]): { triples: Triple[]; insertions: GraphQuads[] } => {
260
284
  const values = ensureArray(value);
261
285
  if (key !== '@id') {
262
286
  if (key === '@type') {
@@ -265,15 +289,15 @@ export class SparqlUpdateBuilder {
265
289
  rdfTypeNamedNode,
266
290
  values as string[]
267
291
  );
268
- return [ ...triples, ...predicateTriples ];
292
+ return { triples: [ ...acc.triples, ...predicateTriples ], insertions: acc.insertions };
269
293
  }
270
294
  if (!(this.setTimestamps && key === EngineConstants.prop.dateModified)) {
271
295
  const predicateTriples = this.buildTriplesForSubjectPredicateAndValues(subject, key, values);
272
- return [ ...triples, ...predicateTriples ];
296
+ return { triples: [ ...acc.triples, ...predicateTriples.triples ], insertions: [ ...acc.insertions, ...predicateTriples.insertions ] };
273
297
  }
274
298
  }
275
- return triples;
276
- }, []);
299
+ return acc;
300
+ }, { triples: [], insertions: [] });
277
301
 
278
302
  const timestampTriples = [];
279
303
  if (this.setTimestamps && subject.termType === 'NamedNode') {
@@ -283,7 +307,8 @@ export class SparqlUpdateBuilder {
283
307
  timestampTriples.push({ subject, predicate: modified, object: now });
284
308
  }
285
309
  return {
286
- entityTriples,
310
+ entityTriples: entityTriples.triples,
311
+ insertions: entityTriples.insertions,
287
312
  timestampTriples
288
313
  };
289
314
  }
@@ -292,10 +317,14 @@ export class SparqlUpdateBuilder {
292
317
  subject: BlankNode | NamedNode,
293
318
  predicate: string,
294
319
  values: any[]
295
- ): Triple[] {
320
+ ): { triples: Triple[]; insertions: GraphQuads[] } {
296
321
  const predicateTerm = DataFactory.namedNode(predicate);
297
- return values.flatMap((value: any): Triple[] =>
298
- this.buildTriplesWithSubjectPredicateAndValue(subject, predicateTerm, value));
322
+ // Return values.flatMap((value: any): { triples: Triple[]; insertions: GraphQuads[] } =>
323
+ // this.buildTriplesWithSubjectPredicateAndValue(subject, predicateTerm, value));
324
+ return values.reduce((acc: { triples: Triple[]; insertions: GraphQuads[] }, value: any) => {
325
+ const { triples, insertions } = this.buildTriplesWithSubjectPredicateAndValue(subject, predicateTerm, value);
326
+ return { triples: [ ...acc.triples, ...triples ], insertions: [ ...acc.insertions, ...insertions ] };
327
+ }, { triples: [], insertions: [] });
299
328
  }
300
329
 
301
330
  private buildTriplesWithSubjectPredicateAndIriValue(
@@ -329,26 +358,33 @@ export class SparqlUpdateBuilder {
329
358
  subject: BlankNode | NamedNode,
330
359
  predicate: NamedNode,
331
360
  value: any
332
- ): Triple[] {
361
+ ): { triples: Triple[]; insertions: GraphQuads[] } {
333
362
  const isObject = typeof value === 'object';
334
363
  if (isObject) {
335
364
  if ('@list' in value) {
336
- return this.buildTriplesForList(subject, predicate, value['@list']);
365
+ return { triples: this.buildTriplesForList(subject, predicate, value['@list']), insertions: [] };
337
366
  }
338
367
  if ('@value' in value) {
339
- return [ { subject, predicate, object: this.jsonLdValueObjectToLiteral(value) } as Triple ];
368
+ return { triples: [ { subject, predicate, object: this.jsonLdValueObjectToLiteral(value) } as Triple ], insertions: [] };
340
369
  }
341
370
 
342
371
  const isReferenceObject = '@id' in value;
343
372
  const isBlankNodeReferenceObject = !isReferenceObject || (value['@id'] as string).startsWith('_:');
344
373
  if (isBlankNodeReferenceObject) {
345
- return this.buildTriplesForBlankNode(subject, predicate, value as NodeObject);
374
+ return { triples: this.buildTriplesForBlankNode(subject, predicate, value as NodeObject), insertions: [] };
346
375
  }
347
376
  if (isReferenceObject) {
348
- return [ { subject, predicate, object: DataFactory.namedNode(value['@id']) } as Triple ];
377
+ const triples = [
378
+ { subject, predicate, object: DataFactory.namedNode(value['@id']) } as Triple
379
+ ];
380
+ if (value['@type']) {
381
+ const { entityTriples, insertions } = this.entityToTriples(value as NodeObject, DataFactory.namedNode(value['@id']));
382
+ return { triples, insertions: [ ...insertions, createSparqlGraphQuads(DataFactory.namedNode(value['@id']), entityTriples) ] };
383
+ }
384
+ return { triples, insertions: [] };
349
385
  }
350
386
  }
351
- return [ { subject, predicate, object: valueToLiteral(value) } as Triple ];
387
+ return { triples: [ { subject, predicate, object: valueToLiteral(value) } as Triple ], insertions: [] };
352
388
  }
353
389
 
354
390
  private jsonLdValueObjectToLiteral(value: ValueObject): Term {
@@ -372,7 +408,7 @@ export class SparqlUpdateBuilder {
372
408
  : [{ subject: blankNode, predicate: restPredicate, object: nilPredicate }];
373
409
  return [
374
410
  { subject, predicate, object: blankNode },
375
- ...this.buildTriplesWithSubjectPredicateAndValue(blankNode, firstPredicate, value[0]),
411
+ ...this.buildTriplesWithSubjectPredicateAndValue(blankNode, firstPredicate, value[0]).triples,
376
412
  ...rest
377
413
  ];
378
414
  }