@comake/skl-js-engine 1.5.3 → 1.5.5

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.
@@ -24,6 +24,9 @@ export declare class SparqlUpdateBuilder {
24
24
  buildDeleteAll(): Update;
25
25
  private idsAndAttributesToGraphDeletionsAndInsertions;
26
26
  private partitionAttributes;
27
+ private createBlankNodeCleanupUpdates;
28
+ private shouldCleanupBlankNodeSubgraphForValue;
29
+ private createBlankNodeCleanupUpdate;
27
30
  private entitiesToGraphDeletionsAndInsertions;
28
31
  private idsToGraphDropUpdates;
29
32
  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;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"}
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,EAGnB,MAAM,UAAU,CAAC;AAsBlB,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;IAsFrD,OAAO,CAAC,mBAAmB;IAoB3B,OAAO,CAAC,6BAA6B;IAYrC,OAAO,CAAC,sCAAsC;IAgB9C,OAAO,CAAC,4BAA4B;IAyEpC,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"}
@@ -60,6 +60,7 @@ class SparqlUpdateBuilder {
60
60
  const { triples: insertionTriples, insertions: insertionInsertions } = this.partialEntityToTriples(subject, attributesToUpdate);
61
61
  const { triples: deleteOnlyTriples } = this.partialEntityToDeletionTriples(attributesToDelete, subject);
62
62
  const updates = [];
63
+ updates.push(...this.createBlankNodeCleanupUpdates(subject, attributesToUpdate));
63
64
  if (deletionTriples.length > 0) {
64
65
  updates.push({
65
66
  updateType: 'insertdelete',
@@ -135,6 +136,97 @@ class SparqlUpdateBuilder {
135
136
  });
136
137
  return { attributesToUpdate, attributesToDelete };
137
138
  }
139
+ createBlankNodeCleanupUpdates(subject, attributesToUpdate) {
140
+ const updateKeysToCleanup = Object.entries(attributesToUpdate)
141
+ .filter(([, value]) => this.shouldCleanupBlankNodeSubgraphForValue(value))
142
+ .map(([key]) => key);
143
+ return updateKeysToCleanup.map((predicate) => this.createBlankNodeCleanupUpdate(subject, predicate));
144
+ }
145
+ shouldCleanupBlankNodeSubgraphForValue(value) {
146
+ return (0, Util_1.ensureArray)(value).some((valueItem) => {
147
+ if (!valueItem || typeof valueItem !== 'object') {
148
+ return false;
149
+ }
150
+ const nodeObject = valueItem;
151
+ if ('@value' in nodeObject) {
152
+ return false;
153
+ }
154
+ if ('@id' in nodeObject && typeof nodeObject['@id'] === 'string') {
155
+ return nodeObject['@id'].startsWith('_:');
156
+ }
157
+ return true;
158
+ });
159
+ }
160
+ createBlankNodeCleanupUpdate(subject, predicate) {
161
+ const existingObjectVariable = data_model_1.default.variable(this.variableGenerator.getNext());
162
+ const existingBlankNodeVariable = data_model_1.default.variable(this.variableGenerator.getNext());
163
+ const existingBlankPredicateVariable = data_model_1.default.variable(this.variableGenerator.getNext());
164
+ const existingBlankObjectVariable = data_model_1.default.variable(this.variableGenerator.getNext());
165
+ const existingIncomingSubjectVariable = data_model_1.default.variable(this.variableGenerator.getNext());
166
+ const existingIncomingPredicateVariable = data_model_1.default.variable(this.variableGenerator.getNext());
167
+ const predicateTerm = predicate === '@type' ? SparqlUtil_1.rdfTypeNamedNode : data_model_1.default.namedNode(predicate);
168
+ // Traverse any outgoing predicate path from the old predicate value to clean nested blank-node trees.
169
+ const anyPredicatePath = {
170
+ type: 'path',
171
+ pathType: '!',
172
+ items: [data_model_1.default.namedNode('urn:skl-js-engine:blank-node-cleanup')]
173
+ };
174
+ const anyPredicatePathZeroOrMore = (0, SparqlUtil_1.createSparqlZeroOrMorePredicate)([anyPredicatePath]);
175
+ const oldRootTriple = { subject, predicate: predicateTerm, object: existingObjectVariable };
176
+ const blankOutgoingTriple = {
177
+ subject: existingBlankNodeVariable,
178
+ predicate: existingBlankPredicateVariable,
179
+ object: existingBlankObjectVariable
180
+ };
181
+ const incomingToBlankTriple = {
182
+ subject: existingIncomingSubjectVariable,
183
+ predicate: existingIncomingPredicateVariable,
184
+ object: existingBlankNodeVariable
185
+ };
186
+ const existingBlankPathTriple = {
187
+ subject: existingObjectVariable,
188
+ predicate: anyPredicatePathZeroOrMore,
189
+ object: existingBlankNodeVariable
190
+ };
191
+ const blankNodeFilters = [
192
+ (0, SparqlUtil_1.createSparqlFilterWithExpression)({
193
+ type: 'operation',
194
+ operator: 'isblank',
195
+ args: [existingObjectVariable]
196
+ }),
197
+ (0, SparqlUtil_1.createSparqlFilterWithExpression)({
198
+ type: 'operation',
199
+ operator: 'isblank',
200
+ args: [existingBlankNodeVariable]
201
+ })
202
+ ];
203
+ return {
204
+ updateType: 'insertdelete',
205
+ delete: [(0, SparqlUtil_1.createSparqlGraphQuads)(subject, [blankOutgoingTriple, incomingToBlankTriple])],
206
+ insert: [],
207
+ where: [
208
+ (0, SparqlUtil_1.createSparqlOptional)([
209
+ (0, SparqlUtil_1.createSparqlBasicGraphPattern)([
210
+ oldRootTriple,
211
+ existingBlankPathTriple,
212
+ blankOutgoingTriple
213
+ ]),
214
+ ...blankNodeFilters
215
+ ]),
216
+ (0, SparqlUtil_1.createSparqlOptional)([
217
+ (0, SparqlUtil_1.createSparqlBasicGraphPattern)([
218
+ oldRootTriple,
219
+ existingBlankPathTriple,
220
+ incomingToBlankTriple
221
+ ]),
222
+ ...blankNodeFilters
223
+ ])
224
+ ],
225
+ using: {
226
+ default: [subject]
227
+ }
228
+ };
229
+ }
138
230
  entitiesToGraphDeletionsAndInsertions(entities) {
139
231
  return entities.reduce((obj, entity) => {
140
232
  const entityGraphName = data_model_1.default.namedNode(entity['@id']);
@@ -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 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"]}
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 PropertyPath\n} from 'sparqljs';\nimport { EngineConstants } from '../../../constants';\nimport {\n bindNow,\n created,\n createSparqlBasicGraphPattern,\n createSparqlClearUpdate,\n createSparqlFilterWithExpression,\n createSparqlDropUpdate,\n createSparqlGraphQuads,\n createSparqlOptional,\n createSparqlUpdate,\n createSparqlZeroOrMorePredicate,\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 updates.push(...this.createBlankNodeCleanupUpdates(subject, attributesToUpdate));\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 createBlankNodeCleanupUpdates(\n subject: NamedNode,\n attributesToUpdate: Partial<Entity>\n ): InsertDeleteOperation[] {\n const updateKeysToCleanup = Object.entries(attributesToUpdate)\n .filter(([, value ]): boolean => this.shouldCleanupBlankNodeSubgraphForValue(value))\n .map(([ key ]): string => key);\n return updateKeysToCleanup.map(\n (predicate): InsertDeleteOperation => this.createBlankNodeCleanupUpdate(subject, predicate)\n );\n }\n\n private shouldCleanupBlankNodeSubgraphForValue(value: unknown): boolean {\n return ensureArray(value).some((valueItem: unknown): boolean => {\n if (!valueItem || typeof valueItem !== 'object') {\n return false;\n }\n const nodeObject = valueItem as Record<string, unknown>;\n if ('@value' in nodeObject) {\n return false;\n }\n if ('@id' in nodeObject && typeof nodeObject['@id'] === 'string') {\n return nodeObject['@id'].startsWith('_:');\n }\n return true;\n });\n }\n\n private createBlankNodeCleanupUpdate(subject: NamedNode, predicate: string): InsertDeleteOperation {\n const existingObjectVariable = DataFactory.variable(this.variableGenerator.getNext());\n const existingBlankNodeVariable = DataFactory.variable(this.variableGenerator.getNext());\n const existingBlankPredicateVariable = DataFactory.variable(this.variableGenerator.getNext());\n const existingBlankObjectVariable = DataFactory.variable(this.variableGenerator.getNext());\n const existingIncomingSubjectVariable = DataFactory.variable(this.variableGenerator.getNext());\n const existingIncomingPredicateVariable = DataFactory.variable(this.variableGenerator.getNext());\n const predicateTerm = predicate === '@type' ? rdfTypeNamedNode : DataFactory.namedNode(predicate);\n\n // Traverse any outgoing predicate path from the old predicate value to clean nested blank-node trees.\n const anyPredicatePath = {\n type: 'path',\n pathType: '!',\n items: [ DataFactory.namedNode('urn:skl-js-engine:blank-node-cleanup') ]\n } as PropertyPath;\n const anyPredicatePathZeroOrMore = createSparqlZeroOrMorePredicate([ anyPredicatePath ]);\n const oldRootTriple = { subject, predicate: predicateTerm, object: existingObjectVariable } as Triple;\n const blankOutgoingTriple = {\n subject: existingBlankNodeVariable,\n predicate: existingBlankPredicateVariable,\n object: existingBlankObjectVariable\n } as Triple;\n const incomingToBlankTriple = {\n subject: existingIncomingSubjectVariable,\n predicate: existingIncomingPredicateVariable,\n object: existingBlankNodeVariable\n } as Triple;\n const existingBlankPathTriple = {\n subject: existingObjectVariable,\n predicate: anyPredicatePathZeroOrMore,\n object: existingBlankNodeVariable\n } as Triple;\n const blankNodeFilters = [\n createSparqlFilterWithExpression({\n type: 'operation',\n operator: 'isblank',\n args: [ existingObjectVariable ]\n }),\n createSparqlFilterWithExpression({\n type: 'operation',\n operator: 'isblank',\n args: [ existingBlankNodeVariable ]\n })\n ];\n\n return {\n updateType: 'insertdelete',\n delete: [ createSparqlGraphQuads(subject, [ blankOutgoingTriple, incomingToBlankTriple ]) ],\n insert: [],\n where: [\n createSparqlOptional([\n createSparqlBasicGraphPattern([\n oldRootTriple,\n existingBlankPathTriple,\n blankOutgoingTriple\n ]),\n ...blankNodeFilters\n ]),\n createSparqlOptional([\n createSparqlBasicGraphPattern([\n oldRootTriple,\n existingBlankPathTriple,\n incomingToBlankTriple\n ]),\n ...blankNodeFilters\n ])\n ],\n using: {\n default: [ subject ]\n }\n } as InsertDeleteOperation;\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"]}
@@ -1 +1 @@
1
- {"version":3,"file":"TripleUtil.d.ts","sourceRoot":"","sources":["../../src/util/TripleUtil.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAA6B,QAAQ,EAAE,MAAM,cAAc,CAAC;AACvF,OAAO,KAAK,EAAqB,WAAW,EAAE,UAAU,EAAe,MAAM,QAAQ,CAAC;AAEtF,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAEhD,OAAO,KAAK,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAE1F,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAM9D,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,CA4BhG;AA0SD,wBAAsB,eAAe,CACnC,OAAO,EAAE,IAAI,EAAE,EACf,WAAW,CAAC,EAAE,OAAO,EACrB,SAAS,CAAC,EAAE,oBAAoB,EAChC,KAAK,CAAC,EAAE,gBAAgB,EACxB,cAAc,CAAC,EAAE,MAAM,EAAE,EACzB,QAAQ,CAAC,EAAE,MAAM,EAAE,GAClB,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAmB9B;AAED,wBAAsB,wBAAwB,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,KAAK,CAAC,EAAE,KAAK,GAAG,OAAO,CAAC,WAAW,CAAC,CAcnG;AAED,wBAAgB,cAAc,CAC5B,KAAK,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,IAAI,GAAG,UAAU,GAAG,SAAS,EAChE,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,GAAG,QAAQ,CAwBpB"}
1
+ {"version":3,"file":"TripleUtil.d.ts","sourceRoot":"","sources":["../../src/util/TripleUtil.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAA6B,QAAQ,EAAE,MAAM,cAAc,CAAC;AACvF,OAAO,KAAK,EAAqB,WAAW,EAAE,UAAU,EAAe,MAAM,QAAQ,CAAC;AAEtF,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAEhD,OAAO,KAAK,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAE1F,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAM9D,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,CA4BhG;AA0TD,wBAAsB,eAAe,CACnC,OAAO,EAAE,IAAI,EAAE,EACf,WAAW,CAAC,EAAE,OAAO,EACrB,SAAS,CAAC,EAAE,oBAAoB,EAChC,KAAK,CAAC,EAAE,gBAAgB,EACxB,cAAc,CAAC,EAAE,MAAM,EAAE,EACzB,QAAQ,CAAC,EAAE,MAAM,EAAE,GAClB,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAuB9B;AAED,wBAAsB,wBAAwB,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,KAAK,CAAC,EAAE,KAAK,GAAG,OAAO,CAAC,WAAW,CAAC,CAcnG;AAED,wBAAgB,cAAc,CAC5B,KAAK,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,IAAI,GAAG,UAAU,GAAG,SAAS,EAChE,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,GAAG,QAAQ,CAwBpB"}
@@ -289,7 +289,11 @@ async function frameWithRelationsOrNonBlankNodes(nodesById, frame, relations, wh
289
289
  if (orderedNodeIds && orderedNodeIds.length > 0) {
290
290
  const nonBlankNodeIds = orderedNodeIds.filter((id) => !id.startsWith('_:'));
291
291
  if (nonBlankNodeIds.length > 0) {
292
- frame['@id'] = nonBlankNodeIds;
292
+ const nonBlankNodeSet = new Set(Object.keys(nodesById).filter((nodeId) => !nodeId.startsWith(BLANK_NODE_PREFIX)));
293
+ const matchingNodeIds = nonBlankNodeIds.filter((nodeId) => nonBlankNodeSet.has(nodeId));
294
+ if (matchingNodeIds.length > 0) {
295
+ frame['@id'] = matchingNodeIds;
296
+ }
293
297
  }
294
298
  }
295
299
  }
@@ -304,7 +308,11 @@ async function frameWithRelationsOrNonBlankNodes(nodesById, frame, relations, wh
304
308
  if (Object.keys(frame).length > 0) {
305
309
  const results = await jsonld.frame({ '@graph': nodesValue }, frame);
306
310
  if (Array.isArray(results['@graph'])) {
307
- results['@graph'] = results['@graph'].filter((node) => !node['@id']?.startsWith(BLANK_NODE_PREFIX));
311
+ results['@graph'] = results['@graph'].filter((node) => (!node['@id']?.startsWith(BLANK_NODE_PREFIX) &&
312
+ (Object.keys(node).length > 0 &&
313
+ (!!node['@id'] ||
314
+ !!node['@type'] ||
315
+ Object.entries(node).some(([key, value]) => key !== '@context' && value !== null)))));
308
316
  }
309
317
  if (typeof frame === 'object' && '@context' in frame && Object.keys(frame['@context']).length > 0) {
310
318
  let resultsList;
@@ -354,6 +362,10 @@ async function triplesToJsonld(triples, skipFraming, relations, where, orderedNo
354
362
  if ('@graph' in framed) {
355
363
  return sortNodesByOrder(framed['@graph'], orderedNodeIds ?? nodeIdOrder);
356
364
  }
365
+ const { '@context': _unusedContext, ...framedWithoutContext } = framed;
366
+ if (Object.keys(framedWithoutContext).length === 0) {
367
+ return [];
368
+ }
357
369
  return framed;
358
370
  }
359
371
  exports.triplesToJsonld = triplesToJsonld;
@@ -1 +1 @@
1
- {"version":3,"file":"TripleUtil.js","sourceRoot":"","sources":["../../src/util/TripleUtil.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable multiline-comment-style */\n/* eslint-disable capitalized-comments */\n/* eslint-disable indent */\n/* eslint-disable @typescript-eslint/naming-convention */\nimport DataFactory from '@rdfjs/data-model';\nimport type { Literal, Quad, Quad_Object, Quad_Subject, Variable } from '@rdfjs/types';\nimport type { ContextDefinition, GraphObject, NodeObject, ValueObject } from 'jsonld';\nimport * as jsonld from 'jsonld';\nimport type { Frame } from 'jsonld/jsonld-spec';\nimport { FindOperator } from '../storage/FindOperator';\nimport type { FindOptionsRelations, FindOptionsWhere } from '../storage/FindOptionsTypes';\nimport type { InverseRelationOperatorValue } from '../storage/operator/InverseRelation';\nimport type { JSONArray, JSONObject, OrArray } from './Types';\nimport { ensureArray } from './Util';\nimport { RDF, XSD } from './Vocabularies';\n\nconst BLANK_NODE_PREFIX = '_:';\n\nexport function toJSValueFromDataType(value: string, dataType: string): number | boolean | string {\n switch (dataType) {\n case XSD.int:\n case XSD.positiveInteger:\n case XSD.negativeInteger:\n case XSD.integer: {\n return Number.parseInt(value, 10);\n }\n case XSD.boolean: {\n if (value === 'true') {\n return true;\n }\n if (value === 'false') {\n return false;\n }\n return value;\n }\n case XSD.double:\n case XSD.decimal:\n case XSD.float: {\n return Number.parseFloat(value);\n }\n case RDF.JSON:\n return JSON.parse(value);\n default: {\n return value;\n }\n }\n}\n\nfunction toJsonLdObject(object: Quad_Object): NodeObject | ValueObject {\n if (object.termType === 'Literal') {\n if (object.language && object.language.length > 0) {\n return {\n '@value': object.value,\n '@language': object.language\n };\n }\n return {\n '@value': toJSValueFromDataType(object.value, object.datatype.value),\n '@type': object.datatype.value === RDF.JSON ? '@json' : object.datatype.value\n };\n }\n if (object.termType === 'BlankNode') {\n return { '@id': `_:${object.value}` };\n }\n return { '@id': object.value };\n}\n\nfunction toJsonLdSubject(object: Quad_Subject): string {\n if (object.termType === 'BlankNode') {\n return `_:${object.value}`;\n }\n return object.value;\n}\n\nfunction relationsToFrame(relations: FindOptionsRelations): NodeObject {\n return Object.entries(relations).reduce((obj: NodeObject, [ field, value ]): NodeObject => {\n const fieldFrame: Frame = {\n '@explicit': false\n };\n let contextAddition: ContextDefinition | undefined;\n if (typeof value === 'object' && value.type === 'operator') {\n const { resolvedName, relations: subRelations } = value.value as InverseRelationOperatorValue;\n contextAddition = { [resolvedName]: { '@reverse': field }};\n if (subRelations) {\n fieldFrame[resolvedName] = relationsToFrame(subRelations);\n } else {\n fieldFrame[resolvedName] = {\n \"@embed\": \"@always\"\n };\n }\n } else if (typeof value === 'boolean') {\n fieldFrame[field] = {\n \"@embed\": \"@always\"\n };\n } else {\n fieldFrame[field] = relationsToFrame(value as FindOptionsRelations);\n }\n if (contextAddition) {\n return {\n ...obj,\n '@context': {\n ...(obj['@context'] as ContextDefinition),\n ...contextAddition\n },\n ...fieldFrame\n };\n }\n return {\n ...obj,\n ...fieldFrame\n };\n }, {});\n}\n\nfunction whereToFrame(where: FindOptionsWhere): NodeObject {\n if (where.id && typeof where.id === 'string') {\n return { '@id': where.id };\n }\n if (where.id && FindOperator.isFindOperator(where.id)) {\n const operator = where.id as FindOperator<any, any>;\n if (operator.operator === 'in') {\n return { '@id': operator.value };\n }\n if (operator.operator === 'equal') {\n return { '@id': operator.value };\n }\n }\n if (where.type && typeof where.type === 'string') {\n return { '@type': where.type };\n }\n if (where.type && typeof where.type === 'object' && 'value' in where.type && typeof where.type.value === 'string') {\n return { '@type': where.type.value };\n }\n\n // Handle arbitrary property constraints\n /* const frame: NodeObject = {};\n Object.entries(where).forEach(([ key, value ]) => {\n if (key !== 'id' && key !== 'type') {\n if (typeof value === 'string') {\n frame[key] = { '@id': value };\n } else if (FindOperator.isFindOperator(value)) {\n const operator = value as FindOperator<any, any>;\n if (operator.operator === 'in') {\n frame[key] = { '@id': operator.value };\n }\n }\n }\n }); */\n\n return {};\n}\n\nfunction triplesToNodes(triples: Quad[]): {\n nodesById: Record<string, NodeObject>;\n nodeIdOrder: string[];\n} {\n const nodeIdOrder: string[] = [];\n const nodesById = triples.reduce((obj: Record<string, NodeObject>, triple): Record<string, NodeObject> => {\n const subject = toJsonLdSubject(triple.subject);\n const isTypePredicate = triple.predicate.value === RDF.type;\n const predicate = isTypePredicate ? '@type' : triple.predicate.value;\n const object = isTypePredicate ? triple.object.value : toJsonLdObject(triple.object);\n if (obj[subject]) {\n if (obj[subject][predicate]) {\n if (Array.isArray(obj[subject][predicate])) {\n (obj[subject][predicate]! as any[]).push(object);\n } else {\n obj[subject][predicate] = [ obj[subject][predicate]!, object ] as any;\n }\n } else {\n obj[subject][predicate] = object;\n }\n } else {\n obj[subject] = {\n '@id': subject,\n [predicate]: object\n };\n if (!subject.startsWith(BLANK_NODE_PREFIX)) {\n nodeIdOrder.push(subject);\n }\n }\n return obj;\n }, {});\n return { nodesById, nodeIdOrder };\n}\n\nasync function frameWithRelationsOrNonBlankNodes(\n nodesById: Record<string, NodeObject>,\n frame?: Frame,\n relations?: FindOptionsRelations,\n where?: FindOptionsWhere,\n queriedType?: string,\n orderedNodeIds?: string[],\n rdfTypes?: string[]\n): Promise<NodeObject> {\n if (!frame) {\n const relationsFrame = relations ? relationsToFrame(relations) : {};\n const whereFrame = where ? whereToFrame(where) : {};\n frame = { ...relationsFrame, ...whereFrame };\n const nodesValue = Object.values(nodesById);\n /* // eslint-disable-next-line no-console\n console.log('nodesValue', JSON.stringify(nodesValue, null, 2));\n // eslint-disable-next-line no-console\n console.log('whereFrame', JSON.stringify(whereFrame, null, 2));\n // eslint-disable-next-line no-console\n console.log('relationsFrame', JSON.stringify(relationsFrame, null, 2)); */\n /* Add all the @types in the nodes to the frame */\n const typeSet = new Set<string>();\n const hasTypeConstraint = whereFrame['@type'];\n const hasIriTypeConstraint = where?.id;\n\n if (Object.keys(frame).length === 0) {\n // Only add all types when there's no where constraint (no filtering)\n nodesValue.forEach((node: NodeObject): void => {\n const isBlankNode = node['@id']?.startsWith(BLANK_NODE_PREFIX);\n if (isBlankNode) {\n return;\n }\n if (node['@type'] && frame && typeof frame === 'object') {\n ensureArray(node['@type']).forEach((type: string): void => {\n typeSet.add(type);\n });\n }\n });\n frame['@type'] ??= [];\n frame['@type'] = [ ...typeSet ];\n } else if (hasTypeConstraint) {\n // For type-based queries, include the constraint type and types from entities that matched the WHERE clause\n const constraintType = hasTypeConstraint as string;\n\n // Always include the queried/constraint type\n typeSet.add(constraintType);\n if (rdfTypes && Array.isArray(rdfTypes)) {\n rdfTypes.forEach((rdfType: string): void => {\n typeSet.add(rdfType);\n });\n }\n\n // If we have orderedNodeIds (entities that matched the WHERE clause), only include types from those\n // This prevents over-matching related entities while still supporting subclass matching\n if (orderedNodeIds && orderedNodeIds.length > 0) {\n const orderedNodeIdSet = new Set(orderedNodeIds);\n nodesValue.forEach((node: NodeObject): void => {\n const nodeId = node['@id'];\n if (!nodeId || node['@id']?.startsWith(BLANK_NODE_PREFIX)) {\n return;\n }\n // Only include types from entities that matched the WHERE clause (in orderedNodeIds)\n if (orderedNodeIdSet.has(nodeId) && node['@type'] && frame && typeof frame === 'object') {\n const nodeTypes = ensureArray(node['@type']);\n nodeTypes.forEach((type: string | undefined): void => {\n if (type) {\n typeSet.add(type);\n }\n });\n }\n });\n } else {\n // Fallback: if no orderedNodeIds, only add types from entities with the constraint type\n nodesValue.forEach((node: NodeObject): void => {\n const isBlankNode = node['@id']?.startsWith(BLANK_NODE_PREFIX);\n if (isBlankNode) {\n return;\n }\n if (node['@type'] && frame && typeof frame === 'object') {\n const nodeTypes = ensureArray(node['@type']);\n if (nodeTypes.includes(constraintType)) {\n nodeTypes.forEach((type: string): void => {\n typeSet.add(type);\n });\n }\n }\n });\n }\n\n frame['@type'] ??= [];\n frame['@type'] = [ ...typeSet ];\n \n // When we have orderedNodeIds, restrict root-level results to only those IDs\n // This prevents related entities with the same type from appearing at the root level\n // Only apply this constraint if we have non-blank node IDs, since blank nodes\n // will be filtered out anyway and we need them during framing\n if (orderedNodeIds && orderedNodeIds.length > 0) {\n const nonBlankNodeIds = orderedNodeIds.filter((id: string): boolean => !id.startsWith('_:'));\n if (nonBlankNodeIds.length > 0) {\n frame['@id'] = nonBlankNodeIds as any;\n }\n }\n }\n else if (hasIriTypeConstraint && !frame['@id']) {\n frame['@id'] = Object.keys(nodesById).map((nodeId: string): string | undefined => {\n if (!nodeId.startsWith(BLANK_NODE_PREFIX)) {\n return nodeId;\n }\n return undefined;\n }).filter(Boolean) as any;\n }\n if (Object.keys(frame).length > 0) {\n const results = await jsonld.frame({ '@graph': nodesValue }, frame);\n if (Array.isArray(results['@graph'])) {\n results['@graph'] = results['@graph'].filter(\n (node: NodeObject): boolean => !node['@id']?.startsWith(BLANK_NODE_PREFIX)\n );\n }\n if (typeof frame === 'object' && '@context' in frame && Object.keys(frame['@context']!).length > 0) {\n let resultsList;\n if (Array.isArray(results)) {\n resultsList = results;\n } else if ('@graph' in results) {\n resultsList = ensureArray(results['@graph']);\n } else {\n const { '@context': unusedContext, ...entityResult } = results;\n resultsList = [ entityResult ];\n }\n /* return {\n '@graph': resultsList.filter((result): boolean =>\n Object.keys((frame as NodeObject)['@context']!).some((relationField): boolean => relationField in result))\n }; */\n return resultsList as NodeObject;\n }\n return results;\n }\n const nonBlankNodes = Object.keys(nodesById).filter(\n (nodeId: string): boolean => !nodeId.startsWith(BLANK_NODE_PREFIX)\n );\n return await jsonld.frame({ '@graph': Object.values(nodesById) }, { '@id': nonBlankNodes as any });\n }\n return await jsonld.frame({ '@graph': Object.values(nodesById) }, frame);\n}\n\nfunction sortNodesByOrder(nodes: NodeObject[], nodeIdOrder: string[]): NodeObject[] {\n return nodes.sort(\n (aNode: NodeObject, bNode: NodeObject): number =>\n nodeIdOrder.indexOf(aNode['@id']!) - nodeIdOrder.indexOf(bNode['@id']!)\n );\n}\n\nfunction sortGraphOfNodeObject(graphObject: GraphObject, nodeIdOrder: string[]): GraphObject {\n return {\n ...graphObject,\n '@graph': sortNodesByOrder(graphObject['@graph'] as NodeObject[], nodeIdOrder)\n };\n}\n\nexport async function triplesToJsonld(\n triples: Quad[],\n skipFraming?: boolean,\n relations?: FindOptionsRelations,\n where?: FindOptionsWhere,\n orderedNodeIds?: string[],\n rdfTypes?: string[]\n): Promise<OrArray<NodeObject>> {\n if (triples.length === 0) {\n return [];\n }\n const { nodeIdOrder, nodesById } = triplesToNodes(triples);\n if (skipFraming) {\n return Object.values(nodesById);\n }\n\n // Extract the queried type from where clause for subclass handling\n const queriedType = where?.type && typeof where.type === 'string' ? where.type : undefined;\n\n const framed = await frameWithRelationsOrNonBlankNodes(\n nodesById, undefined, relations, where, queriedType, orderedNodeIds, rdfTypes\n );\n if ('@graph' in framed) {\n return sortNodesByOrder(framed['@graph'] as NodeObject[], orderedNodeIds ?? nodeIdOrder);\n }\n return framed;\n}\n\nexport async function triplesToJsonldWithFrame(triples: Quad[], frame?: Frame): Promise<GraphObject> {\n const { nodeIdOrder, nodesById } = triplesToNodes(triples);\n const framed = await frameWithRelationsOrNonBlankNodes(nodesById, frame);\n if ('@graph' in framed) {\n return sortGraphOfNodeObject(framed as GraphObject, nodeIdOrder);\n }\n const { '@context': context, ...framedWithoutContext } = framed;\n const graphObject: GraphObject = {\n '@graph': [ framedWithoutContext as NodeObject ]\n };\n if (context) {\n graphObject['@context'] = context;\n }\n return graphObject;\n}\n\nexport function valueToLiteral(\n value: string | boolean | number | Date | JSONObject | JSONArray,\n datatype?: string\n): Literal | Variable {\n if (datatype) {\n if (datatype === '@json' || datatype === RDF.JSON) {\n return DataFactory.literal(JSON.stringify(value), RDF.JSON);\n }\n return DataFactory.literal((value as string | boolean | number).toString(), datatype);\n }\n if (typeof value === 'number') {\n if (Number.isInteger(value)) {\n return DataFactory.literal(value.toString(), XSD.integer);\n }\n return DataFactory.literal(value.toString(), XSD.decimal);\n }\n if (typeof value === 'boolean') {\n return DataFactory.literal(value.toString(), XSD.boolean);\n }\n if (typeof value === 'string' && value.startsWith('?') && value.length > 1) {\n return DataFactory.variable(value.slice(1));\n }\n if (value instanceof Date) {\n return DataFactory.literal(value.toISOString(), XSD.dateTime);\n }\n // eslint-disable-next-line @typescript-eslint/no-base-to-string\n return DataFactory.literal(value.toString());\n}\n"]}
1
+ {"version":3,"file":"TripleUtil.js","sourceRoot":"","sources":["../../src/util/TripleUtil.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable multiline-comment-style */\n/* eslint-disable capitalized-comments */\n/* eslint-disable indent */\n/* eslint-disable @typescript-eslint/naming-convention */\nimport DataFactory from '@rdfjs/data-model';\nimport type { Literal, Quad, Quad_Object, Quad_Subject, Variable } from '@rdfjs/types';\nimport type { ContextDefinition, GraphObject, NodeObject, ValueObject } from 'jsonld';\nimport * as jsonld from 'jsonld';\nimport type { Frame } from 'jsonld/jsonld-spec';\nimport { FindOperator } from '../storage/FindOperator';\nimport type { FindOptionsRelations, FindOptionsWhere } from '../storage/FindOptionsTypes';\nimport type { InverseRelationOperatorValue } from '../storage/operator/InverseRelation';\nimport type { JSONArray, JSONObject, OrArray } from './Types';\nimport { ensureArray } from './Util';\nimport { RDF, XSD } from './Vocabularies';\n\nconst BLANK_NODE_PREFIX = '_:';\n\nexport function toJSValueFromDataType(value: string, dataType: string): number | boolean | string {\n switch (dataType) {\n case XSD.int:\n case XSD.positiveInteger:\n case XSD.negativeInteger:\n case XSD.integer: {\n return Number.parseInt(value, 10);\n }\n case XSD.boolean: {\n if (value === 'true') {\n return true;\n }\n if (value === 'false') {\n return false;\n }\n return value;\n }\n case XSD.double:\n case XSD.decimal:\n case XSD.float: {\n return Number.parseFloat(value);\n }\n case RDF.JSON:\n return JSON.parse(value);\n default: {\n return value;\n }\n }\n}\n\nfunction toJsonLdObject(object: Quad_Object): NodeObject | ValueObject {\n if (object.termType === 'Literal') {\n if (object.language && object.language.length > 0) {\n return {\n '@value': object.value,\n '@language': object.language\n };\n }\n return {\n '@value': toJSValueFromDataType(object.value, object.datatype.value),\n '@type': object.datatype.value === RDF.JSON ? '@json' : object.datatype.value\n };\n }\n if (object.termType === 'BlankNode') {\n return { '@id': `_:${object.value}` };\n }\n return { '@id': object.value };\n}\n\nfunction toJsonLdSubject(object: Quad_Subject): string {\n if (object.termType === 'BlankNode') {\n return `_:${object.value}`;\n }\n return object.value;\n}\n\nfunction relationsToFrame(relations: FindOptionsRelations): NodeObject {\n return Object.entries(relations).reduce((obj: NodeObject, [ field, value ]): NodeObject => {\n const fieldFrame: Frame = {\n '@explicit': false\n };\n let contextAddition: ContextDefinition | undefined;\n if (typeof value === 'object' && value.type === 'operator') {\n const { resolvedName, relations: subRelations } = value.value as InverseRelationOperatorValue;\n contextAddition = { [resolvedName]: { '@reverse': field }};\n if (subRelations) {\n fieldFrame[resolvedName] = relationsToFrame(subRelations);\n } else {\n fieldFrame[resolvedName] = {\n \"@embed\": \"@always\"\n };\n }\n } else if (typeof value === 'boolean') {\n fieldFrame[field] = {\n \"@embed\": \"@always\"\n };\n } else {\n fieldFrame[field] = relationsToFrame(value as FindOptionsRelations);\n }\n if (contextAddition) {\n return {\n ...obj,\n '@context': {\n ...(obj['@context'] as ContextDefinition),\n ...contextAddition\n },\n ...fieldFrame\n };\n }\n return {\n ...obj,\n ...fieldFrame\n };\n }, {});\n}\n\nfunction whereToFrame(where: FindOptionsWhere): NodeObject {\n if (where.id && typeof where.id === 'string') {\n return { '@id': where.id };\n }\n if (where.id && FindOperator.isFindOperator(where.id)) {\n const operator = where.id as FindOperator<any, any>;\n if (operator.operator === 'in') {\n return { '@id': operator.value };\n }\n if (operator.operator === 'equal') {\n return { '@id': operator.value };\n }\n }\n if (where.type && typeof where.type === 'string') {\n return { '@type': where.type };\n }\n if (where.type && typeof where.type === 'object' && 'value' in where.type && typeof where.type.value === 'string') {\n return { '@type': where.type.value };\n }\n\n // Handle arbitrary property constraints\n /* const frame: NodeObject = {};\n Object.entries(where).forEach(([ key, value ]) => {\n if (key !== 'id' && key !== 'type') {\n if (typeof value === 'string') {\n frame[key] = { '@id': value };\n } else if (FindOperator.isFindOperator(value)) {\n const operator = value as FindOperator<any, any>;\n if (operator.operator === 'in') {\n frame[key] = { '@id': operator.value };\n }\n }\n }\n }); */\n\n return {};\n}\n\nfunction triplesToNodes(triples: Quad[]): {\n nodesById: Record<string, NodeObject>;\n nodeIdOrder: string[];\n} {\n const nodeIdOrder: string[] = [];\n const nodesById = triples.reduce((obj: Record<string, NodeObject>, triple): Record<string, NodeObject> => {\n const subject = toJsonLdSubject(triple.subject);\n const isTypePredicate = triple.predicate.value === RDF.type;\n const predicate = isTypePredicate ? '@type' : triple.predicate.value;\n const object = isTypePredicate ? triple.object.value : toJsonLdObject(triple.object);\n if (obj[subject]) {\n if (obj[subject][predicate]) {\n if (Array.isArray(obj[subject][predicate])) {\n (obj[subject][predicate]! as any[]).push(object);\n } else {\n obj[subject][predicate] = [ obj[subject][predicate]!, object ] as any;\n }\n } else {\n obj[subject][predicate] = object;\n }\n } else {\n obj[subject] = {\n '@id': subject,\n [predicate]: object\n };\n if (!subject.startsWith(BLANK_NODE_PREFIX)) {\n nodeIdOrder.push(subject);\n }\n }\n return obj;\n }, {});\n return { nodesById, nodeIdOrder };\n}\n\nasync function frameWithRelationsOrNonBlankNodes(\n nodesById: Record<string, NodeObject>,\n frame?: Frame,\n relations?: FindOptionsRelations,\n where?: FindOptionsWhere,\n queriedType?: string,\n orderedNodeIds?: string[],\n rdfTypes?: string[]\n): Promise<NodeObject> {\n if (!frame) {\n const relationsFrame = relations ? relationsToFrame(relations) : {};\n const whereFrame = where ? whereToFrame(where) : {};\n frame = { ...relationsFrame, ...whereFrame };\n const nodesValue = Object.values(nodesById);\n /* // eslint-disable-next-line no-console\n console.log('nodesValue', JSON.stringify(nodesValue, null, 2));\n // eslint-disable-next-line no-console\n console.log('whereFrame', JSON.stringify(whereFrame, null, 2));\n // eslint-disable-next-line no-console\n console.log('relationsFrame', JSON.stringify(relationsFrame, null, 2)); */\n /* Add all the @types in the nodes to the frame */\n const typeSet = new Set<string>();\n const hasTypeConstraint = whereFrame['@type'];\n const hasIriTypeConstraint = where?.id;\n\n if (Object.keys(frame).length === 0) {\n // Only add all types when there's no where constraint (no filtering)\n nodesValue.forEach((node: NodeObject): void => {\n const isBlankNode = node['@id']?.startsWith(BLANK_NODE_PREFIX);\n if (isBlankNode) {\n return;\n }\n if (node['@type'] && frame && typeof frame === 'object') {\n ensureArray(node['@type']).forEach((type: string): void => {\n typeSet.add(type);\n });\n }\n });\n frame['@type'] ??= [];\n frame['@type'] = [ ...typeSet ];\n } else if (hasTypeConstraint) {\n // For type-based queries, include the constraint type and types from entities that matched the WHERE clause\n const constraintType = hasTypeConstraint as string;\n\n // Always include the queried/constraint type\n typeSet.add(constraintType);\n if (rdfTypes && Array.isArray(rdfTypes)) {\n rdfTypes.forEach((rdfType: string): void => {\n typeSet.add(rdfType);\n });\n }\n\n // If we have orderedNodeIds (entities that matched the WHERE clause), only include types from those\n // This prevents over-matching related entities while still supporting subclass matching\n if (orderedNodeIds && orderedNodeIds.length > 0) {\n const orderedNodeIdSet = new Set(orderedNodeIds);\n nodesValue.forEach((node: NodeObject): void => {\n const nodeId = node['@id'];\n if (!nodeId || node['@id']?.startsWith(BLANK_NODE_PREFIX)) {\n return;\n }\n // Only include types from entities that matched the WHERE clause (in orderedNodeIds)\n if (orderedNodeIdSet.has(nodeId) && node['@type'] && frame && typeof frame === 'object') {\n const nodeTypes = ensureArray(node['@type']);\n nodeTypes.forEach((type: string | undefined): void => {\n if (type) {\n typeSet.add(type);\n }\n });\n }\n });\n } else {\n // Fallback: if no orderedNodeIds, only add types from entities with the constraint type\n nodesValue.forEach((node: NodeObject): void => {\n const isBlankNode = node['@id']?.startsWith(BLANK_NODE_PREFIX);\n if (isBlankNode) {\n return;\n }\n if (node['@type'] && frame && typeof frame === 'object') {\n const nodeTypes = ensureArray(node['@type']);\n if (nodeTypes.includes(constraintType)) {\n nodeTypes.forEach((type: string): void => {\n typeSet.add(type);\n });\n }\n }\n });\n }\n\n frame['@type'] ??= [];\n frame['@type'] = [ ...typeSet ];\n \n // When we have orderedNodeIds, restrict root-level results to only those IDs\n // This prevents related entities with the same type from appearing at the root level\n // Only apply this constraint if we have non-blank node IDs, since blank nodes\n // will be filtered out anyway and we need them during framing\n if (orderedNodeIds && orderedNodeIds.length > 0) {\n const nonBlankNodeIds = orderedNodeIds.filter((id: string): boolean => !id.startsWith('_:'));\n if (nonBlankNodeIds.length > 0) {\n const nonBlankNodeSet = new Set(\n Object.keys(nodesById).filter((nodeId: string): boolean => !nodeId.startsWith(BLANK_NODE_PREFIX))\n );\n const matchingNodeIds = nonBlankNodeIds.filter((nodeId: string): boolean => nonBlankNodeSet.has(nodeId));\n if (matchingNodeIds.length > 0) {\n frame['@id'] = matchingNodeIds as any;\n }\n }\n }\n }\n else if (hasIriTypeConstraint && !frame['@id']) {\n frame['@id'] = Object.keys(nodesById).map((nodeId: string): string | undefined => {\n if (!nodeId.startsWith(BLANK_NODE_PREFIX)) {\n return nodeId;\n }\n return undefined;\n }).filter(Boolean) as any;\n }\n if (Object.keys(frame).length > 0) {\n const results = await jsonld.frame({ '@graph': nodesValue }, frame);\n if (Array.isArray(results['@graph'])) {\n results['@graph'] = results['@graph'].filter(\n (node: NodeObject): boolean => (\n !node['@id']?.startsWith(BLANK_NODE_PREFIX) &&\n (\n Object.keys(node).length > 0 &&\n (\n !!node['@id'] ||\n !!node['@type'] ||\n Object.entries(node).some(([ key, value ]): boolean => key !== '@context' && value !== null)\n )\n )\n )\n );\n }\n if (typeof frame === 'object' && '@context' in frame && Object.keys(frame['@context']!).length > 0) {\n let resultsList;\n if (Array.isArray(results)) {\n resultsList = results;\n } else if ('@graph' in results) {\n resultsList = ensureArray(results['@graph']);\n } else {\n const { '@context': unusedContext, ...entityResult } = results;\n resultsList = [ entityResult ];\n }\n /* return {\n '@graph': resultsList.filter((result): boolean =>\n Object.keys((frame as NodeObject)['@context']!).some((relationField): boolean => relationField in result))\n }; */\n return resultsList as NodeObject;\n }\n return results;\n }\n const nonBlankNodes = Object.keys(nodesById).filter(\n (nodeId: string): boolean => !nodeId.startsWith(BLANK_NODE_PREFIX)\n );\n return await jsonld.frame({ '@graph': Object.values(nodesById) }, { '@id': nonBlankNodes as any });\n }\n return await jsonld.frame({ '@graph': Object.values(nodesById) }, frame);\n}\n\nfunction sortNodesByOrder(nodes: NodeObject[], nodeIdOrder: string[]): NodeObject[] {\n return nodes.sort(\n (aNode: NodeObject, bNode: NodeObject): number =>\n nodeIdOrder.indexOf(aNode['@id']!) - nodeIdOrder.indexOf(bNode['@id']!)\n );\n}\n\nfunction sortGraphOfNodeObject(graphObject: GraphObject, nodeIdOrder: string[]): GraphObject {\n return {\n ...graphObject,\n '@graph': sortNodesByOrder(graphObject['@graph'] as NodeObject[], nodeIdOrder)\n };\n}\n\nexport async function triplesToJsonld(\n triples: Quad[],\n skipFraming?: boolean,\n relations?: FindOptionsRelations,\n where?: FindOptionsWhere,\n orderedNodeIds?: string[],\n rdfTypes?: string[]\n): Promise<OrArray<NodeObject>> {\n if (triples.length === 0) {\n return [];\n }\n const { nodeIdOrder, nodesById } = triplesToNodes(triples);\n if (skipFraming) {\n return Object.values(nodesById);\n }\n\n // Extract the queried type from where clause for subclass handling\n const queriedType = where?.type && typeof where.type === 'string' ? where.type : undefined;\n\n const framed = await frameWithRelationsOrNonBlankNodes(\n nodesById, undefined, relations, where, queriedType, orderedNodeIds, rdfTypes\n );\n if ('@graph' in framed) {\n return sortNodesByOrder(framed['@graph'] as NodeObject[], orderedNodeIds ?? nodeIdOrder);\n }\n const { '@context': _unusedContext, ...framedWithoutContext } = framed;\n if (Object.keys(framedWithoutContext).length === 0) {\n return [];\n }\n return framed;\n}\n\nexport async function triplesToJsonldWithFrame(triples: Quad[], frame?: Frame): Promise<GraphObject> {\n const { nodeIdOrder, nodesById } = triplesToNodes(triples);\n const framed = await frameWithRelationsOrNonBlankNodes(nodesById, frame);\n if ('@graph' in framed) {\n return sortGraphOfNodeObject(framed as GraphObject, nodeIdOrder);\n }\n const { '@context': context, ...framedWithoutContext } = framed;\n const graphObject: GraphObject = {\n '@graph': [ framedWithoutContext as NodeObject ]\n };\n if (context) {\n graphObject['@context'] = context;\n }\n return graphObject;\n}\n\nexport function valueToLiteral(\n value: string | boolean | number | Date | JSONObject | JSONArray,\n datatype?: string\n): Literal | Variable {\n if (datatype) {\n if (datatype === '@json' || datatype === RDF.JSON) {\n return DataFactory.literal(JSON.stringify(value), RDF.JSON);\n }\n return DataFactory.literal((value as string | boolean | number).toString(), datatype);\n }\n if (typeof value === 'number') {\n if (Number.isInteger(value)) {\n return DataFactory.literal(value.toString(), XSD.integer);\n }\n return DataFactory.literal(value.toString(), XSD.decimal);\n }\n if (typeof value === 'boolean') {\n return DataFactory.literal(value.toString(), XSD.boolean);\n }\n if (typeof value === 'string' && value.startsWith('?') && value.length > 1) {\n return DataFactory.variable(value.slice(1));\n }\n if (value instanceof Date) {\n return DataFactory.literal(value.toISOString(), XSD.dateTime);\n }\n // eslint-disable-next-line @typescript-eslint/no-base-to-string\n return DataFactory.literal(value.toString());\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@comake/skl-js-engine",
3
- "version": "1.5.3",
3
+ "version": "1.5.5",
4
4
  "description": "Standard Knowledge Language Javascript Engine",
5
5
  "keywords": [
6
6
  "skl",
@@ -9,7 +9,8 @@ import type {
9
9
  InsertDeleteOperation,
10
10
  UpdateOperation,
11
11
  ClearDropOperation,
12
- Pattern
12
+ Pattern,
13
+ PropertyPath
13
14
  } from 'sparqljs';
14
15
  import { EngineConstants } from '../../../constants';
15
16
  import {
@@ -17,10 +18,12 @@ import {
17
18
  created,
18
19
  createSparqlBasicGraphPattern,
19
20
  createSparqlClearUpdate,
21
+ createSparqlFilterWithExpression,
20
22
  createSparqlDropUpdate,
21
23
  createSparqlGraphQuads,
22
24
  createSparqlOptional,
23
25
  createSparqlUpdate,
26
+ createSparqlZeroOrMorePredicate,
24
27
  dropAll,
25
28
  firstPredicate,
26
29
  modified,
@@ -112,6 +115,7 @@ export class SparqlUpdateBuilder {
112
115
  const { triples: deleteOnlyTriples } = this.partialEntityToDeletionTriples(attributesToDelete, subject);
113
116
 
114
117
  const updates: InsertDeleteOperation[] = [];
118
+ updates.push(...this.createBlankNodeCleanupUpdates(subject, attributesToUpdate));
115
119
 
116
120
  if (deletionTriples.length > 0) {
117
121
  updates.push({
@@ -205,6 +209,107 @@ export class SparqlUpdateBuilder {
205
209
  return { attributesToUpdate, attributesToDelete };
206
210
  }
207
211
 
212
+ private createBlankNodeCleanupUpdates(
213
+ subject: NamedNode,
214
+ attributesToUpdate: Partial<Entity>
215
+ ): InsertDeleteOperation[] {
216
+ const updateKeysToCleanup = Object.entries(attributesToUpdate)
217
+ .filter(([, value ]): boolean => this.shouldCleanupBlankNodeSubgraphForValue(value))
218
+ .map(([ key ]): string => key);
219
+ return updateKeysToCleanup.map(
220
+ (predicate): InsertDeleteOperation => this.createBlankNodeCleanupUpdate(subject, predicate)
221
+ );
222
+ }
223
+
224
+ private shouldCleanupBlankNodeSubgraphForValue(value: unknown): boolean {
225
+ return ensureArray(value).some((valueItem: unknown): boolean => {
226
+ if (!valueItem || typeof valueItem !== 'object') {
227
+ return false;
228
+ }
229
+ const nodeObject = valueItem as Record<string, unknown>;
230
+ if ('@value' in nodeObject) {
231
+ return false;
232
+ }
233
+ if ('@id' in nodeObject && typeof nodeObject['@id'] === 'string') {
234
+ return nodeObject['@id'].startsWith('_:');
235
+ }
236
+ return true;
237
+ });
238
+ }
239
+
240
+ private createBlankNodeCleanupUpdate(subject: NamedNode, predicate: string): InsertDeleteOperation {
241
+ const existingObjectVariable = DataFactory.variable(this.variableGenerator.getNext());
242
+ const existingBlankNodeVariable = DataFactory.variable(this.variableGenerator.getNext());
243
+ const existingBlankPredicateVariable = DataFactory.variable(this.variableGenerator.getNext());
244
+ const existingBlankObjectVariable = DataFactory.variable(this.variableGenerator.getNext());
245
+ const existingIncomingSubjectVariable = DataFactory.variable(this.variableGenerator.getNext());
246
+ const existingIncomingPredicateVariable = DataFactory.variable(this.variableGenerator.getNext());
247
+ const predicateTerm = predicate === '@type' ? rdfTypeNamedNode : DataFactory.namedNode(predicate);
248
+
249
+ // Traverse any outgoing predicate path from the old predicate value to clean nested blank-node trees.
250
+ const anyPredicatePath = {
251
+ type: 'path',
252
+ pathType: '!',
253
+ items: [ DataFactory.namedNode('urn:skl-js-engine:blank-node-cleanup') ]
254
+ } as PropertyPath;
255
+ const anyPredicatePathZeroOrMore = createSparqlZeroOrMorePredicate([ anyPredicatePath ]);
256
+ const oldRootTriple = { subject, predicate: predicateTerm, object: existingObjectVariable } as Triple;
257
+ const blankOutgoingTriple = {
258
+ subject: existingBlankNodeVariable,
259
+ predicate: existingBlankPredicateVariable,
260
+ object: existingBlankObjectVariable
261
+ } as Triple;
262
+ const incomingToBlankTriple = {
263
+ subject: existingIncomingSubjectVariable,
264
+ predicate: existingIncomingPredicateVariable,
265
+ object: existingBlankNodeVariable
266
+ } as Triple;
267
+ const existingBlankPathTriple = {
268
+ subject: existingObjectVariable,
269
+ predicate: anyPredicatePathZeroOrMore,
270
+ object: existingBlankNodeVariable
271
+ } as Triple;
272
+ const blankNodeFilters = [
273
+ createSparqlFilterWithExpression({
274
+ type: 'operation',
275
+ operator: 'isblank',
276
+ args: [ existingObjectVariable ]
277
+ }),
278
+ createSparqlFilterWithExpression({
279
+ type: 'operation',
280
+ operator: 'isblank',
281
+ args: [ existingBlankNodeVariable ]
282
+ })
283
+ ];
284
+
285
+ return {
286
+ updateType: 'insertdelete',
287
+ delete: [ createSparqlGraphQuads(subject, [ blankOutgoingTriple, incomingToBlankTriple ]) ],
288
+ insert: [],
289
+ where: [
290
+ createSparqlOptional([
291
+ createSparqlBasicGraphPattern([
292
+ oldRootTriple,
293
+ existingBlankPathTriple,
294
+ blankOutgoingTriple
295
+ ]),
296
+ ...blankNodeFilters
297
+ ]),
298
+ createSparqlOptional([
299
+ createSparqlBasicGraphPattern([
300
+ oldRootTriple,
301
+ existingBlankPathTriple,
302
+ incomingToBlankTriple
303
+ ]),
304
+ ...blankNodeFilters
305
+ ])
306
+ ],
307
+ using: {
308
+ default: [ subject ]
309
+ }
310
+ } as InsertDeleteOperation;
311
+ }
312
+
208
313
  private entitiesToGraphDeletionsAndInsertions(entities: Entity[]): EntityUpdateQueries {
209
314
  return entities.reduce(
210
315
  (obj: EntityUpdateQueries, entity): EntityUpdateQueries => {
@@ -283,7 +283,13 @@ async function frameWithRelationsOrNonBlankNodes(
283
283
  if (orderedNodeIds && orderedNodeIds.length > 0) {
284
284
  const nonBlankNodeIds = orderedNodeIds.filter((id: string): boolean => !id.startsWith('_:'));
285
285
  if (nonBlankNodeIds.length > 0) {
286
- frame['@id'] = nonBlankNodeIds as any;
286
+ const nonBlankNodeSet = new Set(
287
+ Object.keys(nodesById).filter((nodeId: string): boolean => !nodeId.startsWith(BLANK_NODE_PREFIX))
288
+ );
289
+ const matchingNodeIds = nonBlankNodeIds.filter((nodeId: string): boolean => nonBlankNodeSet.has(nodeId));
290
+ if (matchingNodeIds.length > 0) {
291
+ frame['@id'] = matchingNodeIds as any;
292
+ }
287
293
  }
288
294
  }
289
295
  }
@@ -299,7 +305,17 @@ async function frameWithRelationsOrNonBlankNodes(
299
305
  const results = await jsonld.frame({ '@graph': nodesValue }, frame);
300
306
  if (Array.isArray(results['@graph'])) {
301
307
  results['@graph'] = results['@graph'].filter(
302
- (node: NodeObject): boolean => !node['@id']?.startsWith(BLANK_NODE_PREFIX)
308
+ (node: NodeObject): boolean => (
309
+ !node['@id']?.startsWith(BLANK_NODE_PREFIX) &&
310
+ (
311
+ Object.keys(node).length > 0 &&
312
+ (
313
+ !!node['@id'] ||
314
+ !!node['@type'] ||
315
+ Object.entries(node).some(([ key, value ]): boolean => key !== '@context' && value !== null)
316
+ )
317
+ )
318
+ )
303
319
  );
304
320
  }
305
321
  if (typeof frame === 'object' && '@context' in frame && Object.keys(frame['@context']!).length > 0) {
@@ -367,6 +383,10 @@ export async function triplesToJsonld(
367
383
  if ('@graph' in framed) {
368
384
  return sortNodesByOrder(framed['@graph'] as NodeObject[], orderedNodeIds ?? nodeIdOrder);
369
385
  }
386
+ const { '@context': _unusedContext, ...framedWithoutContext } = framed;
387
+ if (Object.keys(framedWithoutContext).length === 0) {
388
+ return [];
389
+ }
370
390
  return framed;
371
391
  }
372
392