UNPKG

@comake/skl-js-engine

Version:

Standard Knowledge Language Javascript Engine

242 lines 11.7 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.SparqlUpdateBuilder = void 0; const rmlmapper_js_1 = require("@comake/rmlmapper-js"); const data_model_1 = __importDefault(require("@rdfjs/data-model")); const constants_1 = require("../../../constants"); const SparqlUtil_1 = require("../../../util/SparqlUtil"); const TripleUtil_1 = require("../../../util/TripleUtil"); const Util_1 = require("../../../util/Util"); const VariableGenerator_1 = require("./VariableGenerator"); class SparqlUpdateBuilder { constructor(args) { this.variableGenerator = new VariableGenerator_1.VariableGenerator(); this.setTimestamps = args?.setTimestamps ?? false; } buildPartialUpdate(idOrIds, attributes) { const ids = (0, Util_1.ensureArray)(idOrIds); const updates = this.idsAndAttributesToGraphDeletionsAndInsertions(ids, attributes); return (0, SparqlUtil_1.createSparqlUpdate)(updates); } buildUpdate(entityOrEntities) { const entities = (0, Util_1.ensureArray)(entityOrEntities); const { clear, insertions, timestampInsertions } = this.entitiesToGraphDeletionsAndInsertions(entities); const insertUpdate = { updateType: 'insert', insert: insertions, }; const updates = [...clear, insertUpdate]; if (timestampInsertions.length > 0) { updates.push({ updateType: 'insertdelete', delete: [], insert: timestampInsertions, where: [SparqlUtil_1.bindNow], }); } return (0, SparqlUtil_1.createSparqlUpdate)(updates); } buildDeleteById(idOrIds) { const ids = (0, Util_1.ensureArray)(idOrIds); const drops = this.idsToGraphDropUpdates(ids); return (0, SparqlUtil_1.createSparqlUpdate)(drops); } buildDelete(entityOrEntities) { const entities = (0, Util_1.ensureArray)(entityOrEntities); const drops = this.entitiesToGraphDropUpdates(entities); return (0, SparqlUtil_1.createSparqlUpdate)(drops); } buildDeleteAll() { return (0, SparqlUtil_1.createSparqlUpdate)([SparqlUtil_1.dropAll]); } idsAndAttributesToGraphDeletionsAndInsertions(ids, attributes) { return ids.flatMap((id) => { const subject = data_model_1.default.namedNode(id); const deletionTriples = this.partialEntityToDeletionTriples(attributes, subject); const insertionTriples = this.partialEntityToTriples(subject, attributes); const updates = []; if (deletionTriples.length > 0) { updates.push({ updateType: 'insertdelete', delete: [(0, SparqlUtil_1.createSparqlGraphQuads)(subject, deletionTriples)], insert: [], where: deletionTriples.map((triple) => (0, SparqlUtil_1.createSparqlOptional)([(0, SparqlUtil_1.createSparqlBasicGraphPattern)([triple])])), using: { default: [subject], }, }); } if (insertionTriples.length > 0) { updates.push({ updateType: 'insert', insert: [(0, SparqlUtil_1.createSparqlGraphQuads)(subject, insertionTriples)], }); } if (this.setTimestamps) { const modifiedVariable = data_model_1.default.variable(this.variableGenerator.getNext()); const modifiedDeletionTriple = { subject, predicate: SparqlUtil_1.modified, object: modifiedVariable }; const modifiedInsertionTriple = { subject, predicate: SparqlUtil_1.modified, object: SparqlUtil_1.now }; updates.push({ updateType: 'insertdelete', delete: [(0, SparqlUtil_1.createSparqlGraphQuads)(subject, [modifiedDeletionTriple])], insert: [(0, SparqlUtil_1.createSparqlGraphQuads)(subject, [modifiedInsertionTriple])], where: [(0, SparqlUtil_1.createSparqlOptional)([(0, SparqlUtil_1.createSparqlBasicGraphPattern)([modifiedDeletionTriple])]), SparqlUtil_1.bindNow], using: { default: [subject], }, }); } return updates; }); } entitiesToGraphDeletionsAndInsertions(entities) { return entities.reduce((obj, entity) => { const entityGraphName = data_model_1.default.namedNode(entity['@id']); const { entityTriples, timestampTriples } = this.entityToTriples(entity, entityGraphName); obj.clear.push((0, SparqlUtil_1.createSparqlClearUpdate)(entityGraphName)); obj.insertions.push((0, SparqlUtil_1.createSparqlGraphQuads)(entityGraphName, entityTriples)); if (timestampTriples.length > 0) { obj.timestampInsertions.push((0, SparqlUtil_1.createSparqlGraphQuads)(entityGraphName, timestampTriples)); } return obj; }, { clear: [], insertions: [], timestampInsertions: [] }); } idsToGraphDropUpdates(ids) { return ids.map((id) => { const entityGraphName = data_model_1.default.namedNode(id); return (0, SparqlUtil_1.createSparqlDropUpdate)(entityGraphName); }); } entitiesToGraphDropUpdates(entities) { return entities.map((entity) => { const entityGraphName = data_model_1.default.namedNode(entity['@id']); return (0, SparqlUtil_1.createSparqlDropUpdate)(entityGraphName); }); } partialEntityToDeletionTriples(entity, subject) { return Object.keys(entity).reduce((triples, key) => { if (key !== '@id') { return [ ...triples, this.buildTriplesWithSubjectPredicateAndVariableValue(subject, data_model_1.default.namedNode(key), this.variableGenerator.getNext()), ]; } return triples; }, []); } partialEntityToTriples(subject, entity) { const entityTriples = Object.entries(entity).reduce((triples, [key, value]) => { const values = (0, Util_1.ensureArray)(value); if (key !== '@id') { let predicateTriples; if (key === '@type') { predicateTriples = this.buildTriplesWithSubjectPredicateAndIriValue(subject, SparqlUtil_1.rdfTypeNamedNode, values); } else { predicateTriples = this.buildTriplesForSubjectPredicateAndValues(subject, key, values); } return [...triples, ...predicateTriples]; } return triples; }, []); return entityTriples; } entityToTriples(entity, subject) { const entityTriples = Object.entries(entity).reduce((triples, [key, value]) => { const values = (0, Util_1.ensureArray)(value); if (key !== '@id') { if (key === '@type') { const predicateTriples = this.buildTriplesWithSubjectPredicateAndIriValue(subject, SparqlUtil_1.rdfTypeNamedNode, values); return [...triples, ...predicateTriples]; } if (!(this.setTimestamps && key === constants_1.EngineConstants.prop.dateModified)) { const predicateTriples = this.buildTriplesForSubjectPredicateAndValues(subject, key, values); return [...triples, ...predicateTriples]; } } return triples; }, []); const timestampTriples = []; if (this.setTimestamps && subject.termType === 'NamedNode') { if (!(constants_1.EngineConstants.prop.dateCreated in entity)) { timestampTriples.push({ subject, predicate: SparqlUtil_1.created, object: SparqlUtil_1.now }); } timestampTriples.push({ subject, predicate: SparqlUtil_1.modified, object: SparqlUtil_1.now }); } return { entityTriples, timestampTriples, }; } buildTriplesForSubjectPredicateAndValues(subject, predicate, values) { const predicateTerm = data_model_1.default.namedNode(predicate); return values.flatMap((value) => this.buildTriplesWithSubjectPredicateAndValue(subject, predicateTerm, value)); } buildTriplesWithSubjectPredicateAndIriValue(subject, predicate, values) { return values.map((valueItem) => ({ subject, predicate, object: data_model_1.default.namedNode(valueItem), })); } buildTriplesWithSubjectPredicateAndVariableValue(subject, predicate, value) { return { subject, predicate, object: data_model_1.default.variable(value), }; } buildTriplesWithSubjectPredicateAndValue(subject, predicate, value) { const isObject = typeof value === 'object'; if (isObject) { if ('@list' in value) { return this.buildTriplesForList(subject, predicate, value['@list']); } if ('@value' in value) { return [{ subject, predicate, object: this.jsonLdValueObjectToLiteral(value) }]; } const isReferenceObject = '@id' in value; const isBlankNodeReferenceObject = !isReferenceObject || value['@id'].startsWith('_:'); if (isBlankNodeReferenceObject) { return this.buildTriplesForBlankNode(subject, predicate, value); } if (isReferenceObject) { return [{ subject, predicate, object: data_model_1.default.namedNode(value['@id']) }]; } } return [{ subject, predicate, object: (0, TripleUtil_1.valueToLiteral)(value) }]; } jsonLdValueObjectToLiteral(value) { if (typeof value['@value'] === 'object') { return data_model_1.default.literal(JSON.stringify(value['@value']), rmlmapper_js_1.RDF.JSON); } if (value['@language']) { return data_model_1.default.literal(value['@value'], value['@language']); } if (value['@type']) { return data_model_1.default.literal(value['@value'].toString(), value['@type']); } return (0, TripleUtil_1.valueToLiteral)(value['@value']); } buildTriplesForList(subject, predicate, value) { const blankNode = data_model_1.default.blankNode(this.variableGenerator.getNext()); const rest = value.length > 1 ? this.buildTriplesForList(blankNode, SparqlUtil_1.restPredicate, value.slice(1)) : [{ subject: blankNode, predicate: SparqlUtil_1.restPredicate, object: SparqlUtil_1.nilPredicate }]; return [ { subject, predicate, object: blankNode }, ...this.buildTriplesWithSubjectPredicateAndValue(blankNode, SparqlUtil_1.firstPredicate, value[0]), ...rest, ]; } buildTriplesForBlankNode(subject, predicate, value) { const blankNode = data_model_1.default.blankNode(this.variableGenerator.getNext()); const { entityTriples } = this.entityToTriples(value, blankNode); return [{ subject, predicate, object: blankNode }, ...entityTriples]; } } exports.SparqlUpdateBuilder = SparqlUpdateBuilder; //# sourceMappingURL=SparqlUpdateBuilder.js.map