rdf-dataset-fragmenter
Version:
Fragments an RDF dataset into multiple parts
34 lines • 1.87 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.FragmentationStrategySubject = void 0;
const relative_to_absolute_iri_1 = require("relative-to-absolute-iri");
const FragmentationBlankNodeBuffer_1 = require("./FragmentationBlankNodeBuffer");
const FragmentationStrategyStreamAdapter_1 = require("./FragmentationStrategyStreamAdapter");
/**
* A fragmentation strategy that places quads into their subject's document.
*/
class FragmentationStrategySubject extends FragmentationStrategyStreamAdapter_1.FragmentationStrategyStreamAdapter {
constructor(eagerFlushing = true, relativePath) {
super();
this.blankNodeBuffer = new FragmentationBlankNodeBuffer_1.FragmentationBlankNodeBuffer('subject', 'object', eagerFlushing);
this.relativePath = relativePath;
}
async handleQuad(quad, quadSink) {
// Only accept IRI subjects.
if (quad.subject.termType === 'NamedNode') {
// If the subject is a named node, add the quad to the subject's document.
const baseIri = quad.subject.value.endsWith('/') ? quad.subject.value : `${quad.subject.value}/`;
const iri = this.relativePath ? (0, relative_to_absolute_iri_1.resolve)(this.relativePath, baseIri) : quad.subject.value;
await quadSink.push(iri, quad);
// Save the subject in our blank node buffer, as it may be needed to identify documents for other quads.
await this.blankNodeBuffer.materializeValueForNamedKey(quad.object, quad.subject, quadSink);
}
await this.blankNodeBuffer.push(quad, quadSink);
}
async flush(quadSink) {
await super.flush(quadSink);
await this.blankNodeBuffer.flush(quadSink);
}
}
exports.FragmentationStrategySubject = FragmentationStrategySubject;
//# sourceMappingURL=FragmentationStrategySubject.js.map