You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
40 lines
1.2 KiB
40 lines
1.2 KiB
import type { BaseQuad, Dataset, Quad } from "@rdfjs/types";
|
|
import { quad as createQuad } from "@rdfjs/data-model";
|
|
import { datasetToString } from "./datasetConverters";
|
|
|
|
/**
|
|
* An interface representing the changes made
|
|
*/
|
|
export interface DatasetChanges<InAndOutQuad extends BaseQuad = BaseQuad> {
|
|
added?: Dataset<InAndOutQuad, InAndOutQuad>;
|
|
removed?: Dataset<InAndOutQuad, InAndOutQuad>;
|
|
}
|
|
|
|
/**
|
|
* Takes Dataset Changes and converts them to SPARQL UPDATE
|
|
* @param changes: Dataset Changes
|
|
* @returns String SPARQL Update
|
|
*/
|
|
export async function changesToSparqlUpdate(changes: DatasetChanges<Quad>) {
|
|
let output = "";
|
|
if (changes.removed) {
|
|
const removedTriples = changes.removed.map((quad) =>
|
|
createQuad(quad.subject, quad.predicate, quad.object),
|
|
);
|
|
output += `DELETE DATA { ${await datasetToString(removedTriples, {
|
|
format: "N-Triples",
|
|
})} }`;
|
|
}
|
|
if (changes.added && changes.removed) {
|
|
output += "; ";
|
|
}
|
|
if (changes.added) {
|
|
const addedTriples = changes.added.map((quad) =>
|
|
createQuad(quad.subject, quad.predicate, quad.object),
|
|
);
|
|
output += `INSERT DATA { ${await datasetToString(addedTriples, {
|
|
format: "N-Triples",
|
|
})} }`;
|
|
}
|
|
return output.replaceAll("\n", " ");
|
|
}
|
|
|