@comake/skl-js-engine 1.3.12 → 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.
- package/dist/storage/query-adapter/sparql/SparqlUpdateBuilder.d.ts +2 -0
- package/dist/storage/query-adapter/sparql/SparqlUpdateBuilder.d.ts.map +1 -1
- package/dist/storage/query-adapter/sparql/SparqlUpdateBuilder.js +95 -32
- package/dist/storage/query-adapter/sparql/SparqlUpdateBuilder.js.map +1 -1
- package/package.json +1 -1
- package/src/storage/query-adapter/sparql/SparqlUpdateBuilder.ts +117 -43
|
@@ -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;
|
|
@@ -22,6 +23,7 @@ export declare class SparqlUpdateBuilder {
|
|
|
22
23
|
buildDelete(entityOrEntities: Entity | Entity[]): Update;
|
|
23
24
|
buildDeleteAll(): Update;
|
|
24
25
|
private idsAndAttributesToGraphDeletionsAndInsertions;
|
|
26
|
+
private partitionAttributes;
|
|
25
27
|
private entitiesToGraphDeletionsAndInsertions;
|
|
26
28
|
private idsToGraphDropUpdates;
|
|
27
29
|
private entitiesToGraphDropUpdates;
|
|
@@ -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;
|
|
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"}
|
|
@@ -55,8 +55,10 @@ class SparqlUpdateBuilder {
|
|
|
55
55
|
idsAndAttributesToGraphDeletionsAndInsertions(ids, attributes) {
|
|
56
56
|
return ids.flatMap((id) => {
|
|
57
57
|
const subject = data_model_1.default.namedNode(id);
|
|
58
|
-
const
|
|
59
|
-
const
|
|
58
|
+
const { attributesToUpdate, attributesToDelete } = this.partitionAttributes(attributes);
|
|
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);
|
|
60
62
|
const updates = [];
|
|
61
63
|
if (deletionTriples.length > 0) {
|
|
62
64
|
updates.push({
|
|
@@ -69,13 +71,38 @@ class SparqlUpdateBuilder {
|
|
|
69
71
|
}
|
|
70
72
|
});
|
|
71
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
|
+
}
|
|
72
87
|
if (insertionTriples.length > 0) {
|
|
73
88
|
updates.push({
|
|
74
89
|
updateType: 'insert',
|
|
75
|
-
insert: [(0, SparqlUtil_1.createSparqlGraphQuads)(subject, insertionTriples)]
|
|
90
|
+
insert: [(0, SparqlUtil_1.createSparqlGraphQuads)(subject, insertionTriples), ...insertionInsertions]
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
if (deleteOnlyTriples.length > 0) {
|
|
94
|
+
updates.push({
|
|
95
|
+
updateType: 'insertdelete',
|
|
96
|
+
delete: [(0, SparqlUtil_1.createSparqlGraphQuads)(subject, deleteOnlyTriples)],
|
|
97
|
+
insert: [],
|
|
98
|
+
where: deleteOnlyTriples.map((triple) => (0, SparqlUtil_1.createSparqlOptional)([(0, SparqlUtil_1.createSparqlBasicGraphPattern)([triple])])),
|
|
99
|
+
using: {
|
|
100
|
+
default: [subject]
|
|
101
|
+
}
|
|
76
102
|
});
|
|
77
103
|
}
|
|
78
|
-
|
|
104
|
+
const hasAnyChanges = deletionTriples.length > 0 || insertionTriples.length > 0 || deleteOnlyTriples.length > 0;
|
|
105
|
+
if (this.setTimestamps && hasAnyChanges) {
|
|
79
106
|
const modifiedVariable = data_model_1.default.variable(this.variableGenerator.getNext());
|
|
80
107
|
const modifiedDeletionTriple = { subject, predicate: SparqlUtil_1.modified, object: modifiedVariable };
|
|
81
108
|
const modifiedInsertionTriple = { subject, predicate: SparqlUtil_1.modified, object: SparqlUtil_1.now };
|
|
@@ -92,12 +119,28 @@ class SparqlUpdateBuilder {
|
|
|
92
119
|
return updates;
|
|
93
120
|
});
|
|
94
121
|
}
|
|
122
|
+
partitionAttributes(attributes) {
|
|
123
|
+
const attributesToUpdate = {};
|
|
124
|
+
const attributesToDelete = {};
|
|
125
|
+
Object.entries(attributes).forEach(([key, value]) => {
|
|
126
|
+
if (key === '@id') {
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
if (value === null) {
|
|
130
|
+
attributesToDelete[key] = value;
|
|
131
|
+
}
|
|
132
|
+
else if (value !== undefined) {
|
|
133
|
+
attributesToUpdate[key] = value;
|
|
134
|
+
}
|
|
135
|
+
});
|
|
136
|
+
return { attributesToUpdate, attributesToDelete };
|
|
137
|
+
}
|
|
95
138
|
entitiesToGraphDeletionsAndInsertions(entities) {
|
|
96
139
|
return entities.reduce((obj, entity) => {
|
|
97
140
|
const entityGraphName = data_model_1.default.namedNode(entity['@id']);
|
|
98
|
-
const { entityTriples, timestampTriples } = this.entityToTriples(entity, entityGraphName);
|
|
141
|
+
const { entityTriples, timestampTriples, insertions } = this.entityToTriples(entity, entityGraphName);
|
|
99
142
|
obj.clear.push((0, SparqlUtil_1.createSparqlClearUpdate)(entityGraphName));
|
|
100
|
-
obj.insertions.push((0, SparqlUtil_1.createSparqlGraphQuads)(entityGraphName, entityTriples));
|
|
143
|
+
obj.insertions.push((0, SparqlUtil_1.createSparqlGraphQuads)(entityGraphName, entityTriples), ...insertions);
|
|
101
144
|
if (timestampTriples.length > 0) {
|
|
102
145
|
obj.timestampInsertions.push((0, SparqlUtil_1.createSparqlGraphQuads)(entityGraphName, timestampTriples));
|
|
103
146
|
}
|
|
@@ -117,48 +160,55 @@ class SparqlUpdateBuilder {
|
|
|
117
160
|
});
|
|
118
161
|
}
|
|
119
162
|
partialEntityToDeletionTriples(entity, subject) {
|
|
120
|
-
return Object.
|
|
163
|
+
return Object.entries(entity).reduce((acc, [key, value]) => {
|
|
121
164
|
if (key !== '@id') {
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
this.
|
|
125
|
-
|
|
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
|
+
};
|
|
126
177
|
}
|
|
127
|
-
return
|
|
128
|
-
}, []);
|
|
178
|
+
return acc;
|
|
179
|
+
}, { triples: [], deletions: [] });
|
|
129
180
|
}
|
|
130
181
|
partialEntityToTriples(subject, entity) {
|
|
131
|
-
|
|
182
|
+
return Object.entries(entity).reduce((acc, [key, value]) => {
|
|
132
183
|
const values = (0, Util_1.ensureArray)(value);
|
|
133
184
|
if (key !== '@id') {
|
|
134
185
|
let predicateTriples;
|
|
135
186
|
if (key === '@type') {
|
|
136
|
-
predicateTriples = this.buildTriplesWithSubjectPredicateAndIriValue(subject, SparqlUtil_1.rdfTypeNamedNode, values);
|
|
187
|
+
predicateTriples = { triples: this.buildTriplesWithSubjectPredicateAndIriValue(subject, SparqlUtil_1.rdfTypeNamedNode, values), insertions: [] };
|
|
137
188
|
}
|
|
138
189
|
else {
|
|
139
190
|
predicateTriples = this.buildTriplesForSubjectPredicateAndValues(subject, key, values);
|
|
140
191
|
}
|
|
141
|
-
return [...triples, ...predicateTriples];
|
|
192
|
+
return { triples: [...acc.triples, ...predicateTriples.triples], insertions: [...acc.insertions, ...predicateTriples.insertions] };
|
|
142
193
|
}
|
|
143
|
-
return
|
|
144
|
-
}, []);
|
|
145
|
-
return entityTriples;
|
|
194
|
+
return acc;
|
|
195
|
+
}, { triples: [], insertions: [] });
|
|
146
196
|
}
|
|
147
197
|
entityToTriples(entity, subject) {
|
|
148
|
-
const entityTriples = Object.entries(entity).reduce((
|
|
198
|
+
const entityTriples = Object.entries(entity).reduce((acc, [key, value]) => {
|
|
149
199
|
const values = (0, Util_1.ensureArray)(value);
|
|
150
200
|
if (key !== '@id') {
|
|
151
201
|
if (key === '@type') {
|
|
152
202
|
const predicateTriples = this.buildTriplesWithSubjectPredicateAndIriValue(subject, SparqlUtil_1.rdfTypeNamedNode, values);
|
|
153
|
-
return [...triples, ...predicateTriples];
|
|
203
|
+
return { triples: [...acc.triples, ...predicateTriples], insertions: acc.insertions };
|
|
154
204
|
}
|
|
155
205
|
if (!(this.setTimestamps && key === constants_1.EngineConstants.prop.dateModified)) {
|
|
156
206
|
const predicateTriples = this.buildTriplesForSubjectPredicateAndValues(subject, key, values);
|
|
157
|
-
return [...triples, ...predicateTriples];
|
|
207
|
+
return { triples: [...acc.triples, ...predicateTriples.triples], insertions: [...acc.insertions, ...predicateTriples.insertions] };
|
|
158
208
|
}
|
|
159
209
|
}
|
|
160
|
-
return
|
|
161
|
-
}, []);
|
|
210
|
+
return acc;
|
|
211
|
+
}, { triples: [], insertions: [] });
|
|
162
212
|
const timestampTriples = [];
|
|
163
213
|
if (this.setTimestamps && subject.termType === 'NamedNode') {
|
|
164
214
|
if (!(constants_1.EngineConstants.prop.dateCreated in entity)) {
|
|
@@ -167,13 +217,19 @@ class SparqlUpdateBuilder {
|
|
|
167
217
|
timestampTriples.push({ subject, predicate: SparqlUtil_1.modified, object: SparqlUtil_1.now });
|
|
168
218
|
}
|
|
169
219
|
return {
|
|
170
|
-
entityTriples,
|
|
220
|
+
entityTriples: entityTriples.triples,
|
|
221
|
+
insertions: entityTriples.insertions,
|
|
171
222
|
timestampTriples
|
|
172
223
|
};
|
|
173
224
|
}
|
|
174
225
|
buildTriplesForSubjectPredicateAndValues(subject, predicate, values) {
|
|
175
226
|
const predicateTerm = data_model_1.default.namedNode(predicate);
|
|
176
|
-
|
|
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: [] });
|
|
177
233
|
}
|
|
178
234
|
buildTriplesWithSubjectPredicateAndIriValue(subject, predicate, values) {
|
|
179
235
|
return values.map((valueItem) => ({
|
|
@@ -193,21 +249,28 @@ class SparqlUpdateBuilder {
|
|
|
193
249
|
const isObject = typeof value === 'object';
|
|
194
250
|
if (isObject) {
|
|
195
251
|
if ('@list' in value) {
|
|
196
|
-
return this.buildTriplesForList(subject, predicate, value['@list']);
|
|
252
|
+
return { triples: this.buildTriplesForList(subject, predicate, value['@list']), insertions: [] };
|
|
197
253
|
}
|
|
198
254
|
if ('@value' in value) {
|
|
199
|
-
return [{ subject, predicate, object: this.jsonLdValueObjectToLiteral(value) }];
|
|
255
|
+
return { triples: [{ subject, predicate, object: this.jsonLdValueObjectToLiteral(value) }], insertions: [] };
|
|
200
256
|
}
|
|
201
257
|
const isReferenceObject = '@id' in value;
|
|
202
258
|
const isBlankNodeReferenceObject = !isReferenceObject || value['@id'].startsWith('_:');
|
|
203
259
|
if (isBlankNodeReferenceObject) {
|
|
204
|
-
return this.buildTriplesForBlankNode(subject, predicate, value);
|
|
260
|
+
return { triples: this.buildTriplesForBlankNode(subject, predicate, value), insertions: [] };
|
|
205
261
|
}
|
|
206
262
|
if (isReferenceObject) {
|
|
207
|
-
|
|
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: [] };
|
|
208
271
|
}
|
|
209
272
|
}
|
|
210
|
-
return [{ subject, predicate, object: (0, TripleUtil_1.valueToLiteral)(value) }];
|
|
273
|
+
return { triples: [{ subject, predicate, object: (0, TripleUtil_1.valueToLiteral)(value) }], insertions: [] };
|
|
211
274
|
}
|
|
212
275
|
jsonLdValueObjectToLiteral(value) {
|
|
213
276
|
if (typeof value['@value'] === 'object') {
|
|
@@ -228,7 +291,7 @@ class SparqlUpdateBuilder {
|
|
|
228
291
|
: [{ subject: blankNode, predicate: SparqlUtil_1.restPredicate, object: SparqlUtil_1.nilPredicate }];
|
|
229
292
|
return [
|
|
230
293
|
{ subject, predicate, object: blankNode },
|
|
231
|
-
...this.buildTriplesWithSubjectPredicateAndValue(blankNode, SparqlUtil_1.firstPredicate, value[0]),
|
|
294
|
+
...this.buildTriplesWithSubjectPredicateAndValue(blankNode, SparqlUtil_1.firstPredicate, value[0]).triples,
|
|
232
295
|
...rest
|
|
233
296
|
];
|
|
234
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 deletionTriples = this.partialEntityToDeletionTriples(attributes, subject);\n const insertionTriples = this.partialEntityToTriples(subject, attributes);\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 (this.setTimestamps) {\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 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
|
@@ -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 {
|
|
@@ -105,8 +106,10 @@ export class SparqlUpdateBuilder {
|
|
|
105
106
|
): InsertDeleteOperation[] {
|
|
106
107
|
return ids.flatMap((id): InsertDeleteOperation[] => {
|
|
107
108
|
const subject = DataFactory.namedNode(id);
|
|
108
|
-
const
|
|
109
|
-
const
|
|
109
|
+
const { attributesToUpdate, attributesToDelete } = this.partitionAttributes(attributes);
|
|
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);
|
|
110
113
|
|
|
111
114
|
const updates: InsertDeleteOperation[] = [];
|
|
112
115
|
|
|
@@ -124,14 +127,46 @@ export class SparqlUpdateBuilder {
|
|
|
124
127
|
} as InsertDeleteOperation);
|
|
125
128
|
}
|
|
126
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
|
+
|
|
127
146
|
if (insertionTriples.length > 0) {
|
|
128
147
|
updates.push({
|
|
129
148
|
updateType: 'insert',
|
|
130
|
-
insert: [ createSparqlGraphQuads(subject, insertionTriples) ]
|
|
149
|
+
insert: [ createSparqlGraphQuads(subject, insertionTriples), ...insertionInsertions ]
|
|
131
150
|
} as InsertDeleteOperation);
|
|
132
151
|
}
|
|
133
152
|
|
|
134
|
-
if (
|
|
153
|
+
if (deleteOnlyTriples.length > 0) {
|
|
154
|
+
updates.push({
|
|
155
|
+
updateType: 'insertdelete',
|
|
156
|
+
delete: [ createSparqlGraphQuads(subject, deleteOnlyTriples) ],
|
|
157
|
+
insert: [],
|
|
158
|
+
where: deleteOnlyTriples.map(
|
|
159
|
+
(triple): Pattern => createSparqlOptional([ createSparqlBasicGraphPattern([ triple ]) ])
|
|
160
|
+
),
|
|
161
|
+
using: {
|
|
162
|
+
default: [ subject ]
|
|
163
|
+
}
|
|
164
|
+
} as InsertDeleteOperation);
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
const hasAnyChanges = deletionTriples.length > 0 || insertionTriples.length > 0 || deleteOnlyTriples.length > 0;
|
|
168
|
+
|
|
169
|
+
if (this.setTimestamps && hasAnyChanges) {
|
|
135
170
|
const modifiedVariable = DataFactory.variable(this.variableGenerator.getNext());
|
|
136
171
|
const modifiedDeletionTriple = { subject, predicate: modified, object: modifiedVariable };
|
|
137
172
|
const modifiedInsertionTriple = { subject, predicate: modified, object: now };
|
|
@@ -150,13 +185,33 @@ export class SparqlUpdateBuilder {
|
|
|
150
185
|
});
|
|
151
186
|
}
|
|
152
187
|
|
|
188
|
+
private partitionAttributes(
|
|
189
|
+
attributes: Partial<Entity>
|
|
190
|
+
): { attributesToUpdate: Partial<Entity>; attributesToDelete: Partial<Entity> } {
|
|
191
|
+
const attributesToUpdate: Partial<Entity> = {};
|
|
192
|
+
const attributesToDelete: Partial<Entity> = {};
|
|
193
|
+
|
|
194
|
+
Object.entries(attributes).forEach(([ key, value ]) => {
|
|
195
|
+
if (key === '@id') {
|
|
196
|
+
return;
|
|
197
|
+
}
|
|
198
|
+
if (value === null) {
|
|
199
|
+
attributesToDelete[key] = value;
|
|
200
|
+
} else if (value !== undefined) {
|
|
201
|
+
attributesToUpdate[key] = value;
|
|
202
|
+
}
|
|
203
|
+
});
|
|
204
|
+
|
|
205
|
+
return { attributesToUpdate, attributesToDelete };
|
|
206
|
+
}
|
|
207
|
+
|
|
153
208
|
private entitiesToGraphDeletionsAndInsertions(entities: Entity[]): EntityUpdateQueries {
|
|
154
209
|
return entities.reduce(
|
|
155
210
|
(obj: EntityUpdateQueries, entity): EntityUpdateQueries => {
|
|
156
211
|
const entityGraphName = DataFactory.namedNode(entity['@id']);
|
|
157
|
-
const { entityTriples, timestampTriples } = this.entityToTriples(entity, entityGraphName);
|
|
212
|
+
const { entityTriples, timestampTriples, insertions } = this.entityToTriples(entity, entityGraphName);
|
|
158
213
|
obj.clear.push(createSparqlClearUpdate(entityGraphName));
|
|
159
|
-
obj.insertions.push(createSparqlGraphQuads(entityGraphName, entityTriples));
|
|
214
|
+
obj.insertions.push(createSparqlGraphQuads(entityGraphName, entityTriples), ...insertions);
|
|
160
215
|
if (timestampTriples.length > 0) {
|
|
161
216
|
obj.timestampInsertions.push(createSparqlGraphQuads(entityGraphName, timestampTriples));
|
|
162
217
|
}
|
|
@@ -180,45 +235,52 @@ export class SparqlUpdateBuilder {
|
|
|
180
235
|
});
|
|
181
236
|
}
|
|
182
237
|
|
|
183
|
-
private partialEntityToDeletionTriples(entity: NodeObject, subject: NamedNode): Triple[] {
|
|
184
|
-
return Object.
|
|
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[] } => {
|
|
185
240
|
if (key !== '@id') {
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
this.
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
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
|
+
};
|
|
194
257
|
}
|
|
195
|
-
return
|
|
196
|
-
}, []);
|
|
258
|
+
return acc;
|
|
259
|
+
}, { triples: [], deletions: [] });
|
|
197
260
|
}
|
|
198
261
|
|
|
199
|
-
private partialEntityToTriples(subject: NamedNode, entity: NodeObject): Triple[] {
|
|
200
|
-
|
|
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[] } => {
|
|
201
264
|
const values = ensureArray(value);
|
|
202
265
|
if (key !== '@id') {
|
|
203
|
-
let predicateTriples: Triple[];
|
|
266
|
+
let predicateTriples: { triples: Triple[]; insertions: GraphQuads[] };
|
|
204
267
|
if (key === '@type') {
|
|
205
|
-
predicateTriples = this.buildTriplesWithSubjectPredicateAndIriValue(
|
|
268
|
+
predicateTriples = { triples: this.buildTriplesWithSubjectPredicateAndIriValue(
|
|
206
269
|
subject,
|
|
207
270
|
rdfTypeNamedNode,
|
|
208
271
|
values as string[]
|
|
209
|
-
);
|
|
272
|
+
), insertions: [] };
|
|
210
273
|
} else {
|
|
211
274
|
predicateTriples = this.buildTriplesForSubjectPredicateAndValues(subject, key, values);
|
|
212
275
|
}
|
|
213
|
-
return [ ...triples, ...predicateTriples ];
|
|
276
|
+
return { triples: [ ...acc.triples, ...predicateTriples.triples ], insertions: [ ...acc.insertions, ...predicateTriples.insertions ] };
|
|
214
277
|
}
|
|
215
|
-
return
|
|
216
|
-
}, []);
|
|
217
|
-
return entityTriples;
|
|
278
|
+
return acc;
|
|
279
|
+
}, { triples: [], insertions: [] });
|
|
218
280
|
}
|
|
219
281
|
|
|
220
282
|
private entityToTriples(entity: NodeObject, subject: BlankNode | NamedNode): EntityUpdateTriples {
|
|
221
|
-
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[] } => {
|
|
222
284
|
const values = ensureArray(value);
|
|
223
285
|
if (key !== '@id') {
|
|
224
286
|
if (key === '@type') {
|
|
@@ -227,15 +289,15 @@ export class SparqlUpdateBuilder {
|
|
|
227
289
|
rdfTypeNamedNode,
|
|
228
290
|
values as string[]
|
|
229
291
|
);
|
|
230
|
-
return [ ...triples, ...predicateTriples ];
|
|
292
|
+
return { triples: [ ...acc.triples, ...predicateTriples ], insertions: acc.insertions };
|
|
231
293
|
}
|
|
232
294
|
if (!(this.setTimestamps && key === EngineConstants.prop.dateModified)) {
|
|
233
295
|
const predicateTriples = this.buildTriplesForSubjectPredicateAndValues(subject, key, values);
|
|
234
|
-
return [ ...triples, ...predicateTriples ];
|
|
296
|
+
return { triples: [ ...acc.triples, ...predicateTriples.triples ], insertions: [ ...acc.insertions, ...predicateTriples.insertions ] };
|
|
235
297
|
}
|
|
236
298
|
}
|
|
237
|
-
return
|
|
238
|
-
}, []);
|
|
299
|
+
return acc;
|
|
300
|
+
}, { triples: [], insertions: [] });
|
|
239
301
|
|
|
240
302
|
const timestampTriples = [];
|
|
241
303
|
if (this.setTimestamps && subject.termType === 'NamedNode') {
|
|
@@ -245,7 +307,8 @@ export class SparqlUpdateBuilder {
|
|
|
245
307
|
timestampTriples.push({ subject, predicate: modified, object: now });
|
|
246
308
|
}
|
|
247
309
|
return {
|
|
248
|
-
entityTriples,
|
|
310
|
+
entityTriples: entityTriples.triples,
|
|
311
|
+
insertions: entityTriples.insertions,
|
|
249
312
|
timestampTriples
|
|
250
313
|
};
|
|
251
314
|
}
|
|
@@ -254,10 +317,14 @@ export class SparqlUpdateBuilder {
|
|
|
254
317
|
subject: BlankNode | NamedNode,
|
|
255
318
|
predicate: string,
|
|
256
319
|
values: any[]
|
|
257
|
-
): Triple[] {
|
|
320
|
+
): { triples: Triple[]; insertions: GraphQuads[] } {
|
|
258
321
|
const predicateTerm = DataFactory.namedNode(predicate);
|
|
259
|
-
|
|
260
|
-
|
|
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: [] });
|
|
261
328
|
}
|
|
262
329
|
|
|
263
330
|
private buildTriplesWithSubjectPredicateAndIriValue(
|
|
@@ -291,26 +358,33 @@ export class SparqlUpdateBuilder {
|
|
|
291
358
|
subject: BlankNode | NamedNode,
|
|
292
359
|
predicate: NamedNode,
|
|
293
360
|
value: any
|
|
294
|
-
): Triple[] {
|
|
361
|
+
): { triples: Triple[]; insertions: GraphQuads[] } {
|
|
295
362
|
const isObject = typeof value === 'object';
|
|
296
363
|
if (isObject) {
|
|
297
364
|
if ('@list' in value) {
|
|
298
|
-
return this.buildTriplesForList(subject, predicate, value['@list']);
|
|
365
|
+
return { triples: this.buildTriplesForList(subject, predicate, value['@list']), insertions: [] };
|
|
299
366
|
}
|
|
300
367
|
if ('@value' in value) {
|
|
301
|
-
return [ { subject, predicate, object: this.jsonLdValueObjectToLiteral(value) } as Triple ];
|
|
368
|
+
return { triples: [ { subject, predicate, object: this.jsonLdValueObjectToLiteral(value) } as Triple ], insertions: [] };
|
|
302
369
|
}
|
|
303
370
|
|
|
304
371
|
const isReferenceObject = '@id' in value;
|
|
305
372
|
const isBlankNodeReferenceObject = !isReferenceObject || (value['@id'] as string).startsWith('_:');
|
|
306
373
|
if (isBlankNodeReferenceObject) {
|
|
307
|
-
return this.buildTriplesForBlankNode(subject, predicate, value as NodeObject);
|
|
374
|
+
return { triples: this.buildTriplesForBlankNode(subject, predicate, value as NodeObject), insertions: [] };
|
|
308
375
|
}
|
|
309
376
|
if (isReferenceObject) {
|
|
310
|
-
|
|
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: [] };
|
|
311
385
|
}
|
|
312
386
|
}
|
|
313
|
-
return [ { subject, predicate, object: valueToLiteral(value) } as Triple ];
|
|
387
|
+
return { triples: [ { subject, predicate, object: valueToLiteral(value) } as Triple ], insertions: [] };
|
|
314
388
|
}
|
|
315
389
|
|
|
316
390
|
private jsonLdValueObjectToLiteral(value: ValueObject): Term {
|
|
@@ -334,7 +408,7 @@ export class SparqlUpdateBuilder {
|
|
|
334
408
|
: [{ subject: blankNode, predicate: restPredicate, object: nilPredicate }];
|
|
335
409
|
return [
|
|
336
410
|
{ subject, predicate, object: blankNode },
|
|
337
|
-
...this.buildTriplesWithSubjectPredicateAndValue(blankNode, firstPredicate, value[0]),
|
|
411
|
+
...this.buildTriplesWithSubjectPredicateAndValue(blankNode, firstPredicate, value[0]).triples,
|
|
338
412
|
...rest
|
|
339
413
|
];
|
|
340
414
|
}
|