@comake/skl-js-engine
Version:
Standard Knowledge Language Javascript Engine
242 lines • 11.7 kB
JavaScript
"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