rdf-dataset-fragmenter
Version:
Fragments an RDF dataset into multiple parts
62 lines • 2.79 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.FragmentationStrategyResourceObject = void 0;
const FragmentationStrategyStreamAdapter_1 = require("./FragmentationStrategyStreamAdapter");
/**
* A fragmentation strategy that groups triples by (subject) resources,
* and places quads into the document identified by the given predicate value.
*
* Blank nodes are not supported.
*/
class FragmentationStrategyResourceObject extends FragmentationStrategyStreamAdapter_1.FragmentationStrategyStreamAdapter {
constructor(targetPredicateRegex) {
super();
this.targetPredicate = new RegExp(targetPredicateRegex, 'u');
this.resourceBuffer = {};
}
async handleQuad(quad, quadSink) {
// Create buffer if one doesn't exist yet
if (!this.resourceBuffer[quad.subject.value]) {
this.resourceBuffer[quad.subject.value] = [];
}
// Handle remaining quads
const buffer = this.resourceBuffer[quad.subject.value];
if (Array.isArray(buffer)) {
// Buffer remaining quads
buffer.push(quad);
}
else {
// If the target predicate was already set, flush immediately
await quadSink.push(buffer.value, quad);
}
// Match the target predicate
if (this.targetPredicate.test(quad.predicate.value)) {
if (quad.object.termType !== 'NamedNode') {
throw new Error(`Expected target predicate value of type NamedNode on resource '${quad.subject.value}', but got '${quad.object.value}' (${quad.object.termType})`);
}
// Flush the buffer of this resource
await this.flushResourceBuffer(quadSink, quad.subject.value, quad.object.value);
// Indicate that further triples of this resource should be emitted immediately
this.resourceBuffer[quad.subject.value] = quad.object;
}
}
async flush(quadSink) {
await super.flush(quadSink);
for (const resourceIri of Object.keys(this.resourceBuffer)) {
if (Array.isArray(this.resourceBuffer[resourceIri])) {
// eslint-disable-next-line no-console
console.warn(`Detected quads of the resource ${resourceIri} without a defined target predicate.`);
}
}
}
async flushResourceBuffer(quadSink, resourceIri, targetIri) {
const quads = this.resourceBuffer[resourceIri];
if (Array.isArray(quads)) {
for (const quad of quads) {
await quadSink.push(targetIri, quad);
}
}
}
}
exports.FragmentationStrategyResourceObject = FragmentationStrategyResourceObject;
//# sourceMappingURL=FragmentationStrategyResourceObject.js.map