@rdfc/sparql-ingest-processor-ts 2.1.4 → 2.1.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/SPARQLIngest.d.ts +2 -0
- package/lib/SPARQLIngest.js +10 -3
- package/lib/SPARQLQueries.js +2 -35
- package/lib/Utils.d.ts +2 -1
- package/lib/Utils.js +3 -11
- package/package.json +8 -8
package/lib/SPARQLIngest.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { Processor } from "@rdfc/js-runner";
|
|
2
|
+
import { Agent } from "undici";
|
|
2
3
|
import { RdfStore } from "rdf-stores";
|
|
3
4
|
import { Logger } from "winston";
|
|
4
5
|
import type { Quad, Term } from "@rdfjs/types";
|
|
@@ -46,6 +47,7 @@ type SPARQLIngestArgs = {
|
|
|
46
47
|
sparqlWriter?: Writer;
|
|
47
48
|
};
|
|
48
49
|
export declare class SPARQLIngest extends Processor<SPARQLIngestArgs> {
|
|
50
|
+
protected globalDispatcher: Agent;
|
|
49
51
|
protected transactionMembers: TransactionMember[];
|
|
50
52
|
protected memberBatch: Quad[];
|
|
51
53
|
protected requestsPerformance: number[];
|
package/lib/SPARQLIngest.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { Processor, extendLogger } from "@rdfc/js-runner";
|
|
2
2
|
import { SDS } from "@treecg/types";
|
|
3
|
+
import { Agent } from "undici";
|
|
3
4
|
import { DataFactory } from "rdf-data-factory";
|
|
4
5
|
import { RdfStore } from "rdf-stores";
|
|
5
6
|
import { Parser } from "n3";
|
|
@@ -13,6 +14,7 @@ export var OperationMode;
|
|
|
13
14
|
OperationMode["SYNC"] = "Sync";
|
|
14
15
|
})(OperationMode || (OperationMode = {}));
|
|
15
16
|
export class SPARQLIngest extends Processor {
|
|
17
|
+
globalDispatcher;
|
|
16
18
|
transactionMembers = [];
|
|
17
19
|
memberBatch = [];
|
|
18
20
|
requestsPerformance = [];
|
|
@@ -22,6 +24,10 @@ export class SPARQLIngest extends Processor {
|
|
|
22
24
|
async init() {
|
|
23
25
|
this.createTransactionQueriesLogger = extendLogger(this.logger, "createTransactionQueries");
|
|
24
26
|
this.doSPARQLRequestLogger = extendLogger(this.logger, "doSPARQLRequest");
|
|
27
|
+
this.globalDispatcher = new Agent({
|
|
28
|
+
headersTimeout: (this.config.measurePerformance?.queryTimeout || 600) * 1000,
|
|
29
|
+
bodyTimeout: (this.config.measurePerformance?.queryTimeout || 600) * 1000,
|
|
30
|
+
});
|
|
25
31
|
if (!this.config.operationMode) {
|
|
26
32
|
this.config.operationMode = OperationMode.SYNC;
|
|
27
33
|
}
|
|
@@ -159,7 +165,7 @@ export class SPARQLIngest extends Processor {
|
|
|
159
165
|
if (this.config.graphStoreUrl) {
|
|
160
166
|
try {
|
|
161
167
|
const t0 = Date.now();
|
|
162
|
-
await doSPARQLRequest(query, this.config, this.logger);
|
|
168
|
+
await doSPARQLRequest(query, this.config, this.globalDispatcher, this.logger);
|
|
163
169
|
const reqTime = Date.now() - t0;
|
|
164
170
|
if (this.config.measurePerformance) {
|
|
165
171
|
this.requestsPerformance.push(reqTime);
|
|
@@ -193,7 +199,7 @@ export class SPARQLIngest extends Processor {
|
|
|
193
199
|
if (this.config.operationMode === OperationMode.REPLICATION) {
|
|
194
200
|
try {
|
|
195
201
|
const t0 = Date.now();
|
|
196
|
-
await doSPARQLRequest(this.memberBatch, this.config, this.logger);
|
|
202
|
+
await doSPARQLRequest(this.memberBatch, this.config, this.globalDispatcher, this.logger);
|
|
197
203
|
const reqTime = Date.now() - t0;
|
|
198
204
|
if (this.config.measurePerformance) {
|
|
199
205
|
this.requestsPerformance.push(reqTime);
|
|
@@ -222,7 +228,7 @@ export class SPARQLIngest extends Processor {
|
|
|
222
228
|
if (this.config.operationMode === OperationMode.REPLICATION && this.memberBatch.length > 0) {
|
|
223
229
|
try {
|
|
224
230
|
const t0 = Date.now();
|
|
225
|
-
await doSPARQLRequest(this.memberBatch, this.config, this.logger);
|
|
231
|
+
await doSPARQLRequest(this.memberBatch, this.config, this.globalDispatcher, this.logger);
|
|
226
232
|
const reqTime = Date.now() - t0;
|
|
227
233
|
if (this.config.measurePerformance) {
|
|
228
234
|
this.requestsPerformance.push(reqTime);
|
|
@@ -250,6 +256,7 @@ export class SPARQLIngest extends Processor {
|
|
|
250
256
|
if (this.config.measurePerformance) {
|
|
251
257
|
await writeFile(`${this.config.measurePerformance.outputPath}/${this.config.measurePerformance.name}.json`, JSON.stringify(this.requestsPerformance), "utf-8");
|
|
252
258
|
}
|
|
259
|
+
await this.globalDispatcher.close();
|
|
253
260
|
}
|
|
254
261
|
async produce() {
|
|
255
262
|
}
|
package/lib/SPARQLQueries.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { SHACL } from "@treecg/types";
|
|
2
2
|
import { Writer as N3Writer, Parser } from "n3";
|
|
3
3
|
import { RdfStore } from "rdf-stores";
|
|
4
4
|
import { DataFactory } from "rdf-data-factory";
|
|
5
|
-
import { getObjects,
|
|
5
|
+
import { getObjects, splitStoreOnSize, splitStorePerNamedGraph } from "./Utils.js";
|
|
6
6
|
const df = new DataFactory();
|
|
7
7
|
export const CREATE = (store, forVirtuoso) => {
|
|
8
8
|
const queries = [];
|
|
@@ -123,36 +123,3 @@ function formatQuery(memberStore, memberIRI, memberShape, indexStart = 0) {
|
|
|
123
123
|
return [queryBuilder.join("\n"), deleteQueryBuilder.join("\n")];
|
|
124
124
|
}
|
|
125
125
|
}
|
|
126
|
-
function extractMainTargetClass(store) {
|
|
127
|
-
const nodeShapes = getSubjects(store, RDF.terms.type, SHACL.terms.NodeShape, null);
|
|
128
|
-
let mainNodeShape = null;
|
|
129
|
-
if (nodeShapes && nodeShapes.length > 0) {
|
|
130
|
-
for (const ns of nodeShapes) {
|
|
131
|
-
const isNotReferenced = getSubjects(store, null, ns, null).length === 0;
|
|
132
|
-
if (isNotReferenced) {
|
|
133
|
-
if (!mainNodeShape) {
|
|
134
|
-
mainNodeShape = ns;
|
|
135
|
-
}
|
|
136
|
-
else {
|
|
137
|
-
throw new Error("There are multiple main node shapes in a given shape."
|
|
138
|
-
+ " Unrelated shapes must be given as separate member shapes");
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
if (mainNodeShape) {
|
|
143
|
-
const tcq = getObjects(store, mainNodeShape, SHACL.terms.targetClass, null)[0];
|
|
144
|
-
if (tcq) {
|
|
145
|
-
return tcq;
|
|
146
|
-
}
|
|
147
|
-
else {
|
|
148
|
-
throw new Error("No target class found in main SHACL Node Shapes");
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
else {
|
|
152
|
-
throw new Error("No main SHACL Node Shapes found in given member shape");
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
else {
|
|
156
|
-
throw new Error("No SHACL Node Shapes found in given member shape");
|
|
157
|
-
}
|
|
158
|
-
}
|
package/lib/Utils.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { RdfStore } from "rdf-stores";
|
|
2
|
+
import { Agent } from "undici";
|
|
2
3
|
import { Logger } from "winston";
|
|
3
4
|
import type { Term, Quad_Subject, Quad_Object, Quad, Quad_Graph } from "@rdfjs/types";
|
|
4
5
|
import type { IngestConfig } from "./SPARQLIngest.js";
|
|
@@ -10,4 +11,4 @@ export declare function splitStorePerNamedGraph(store: RdfStore): {
|
|
|
10
11
|
}[];
|
|
11
12
|
export declare function splitStoreOnSize(store: RdfStore, threshold: number): RdfStore[];
|
|
12
13
|
export declare function sanitizeQuads(store: RdfStore): void;
|
|
13
|
-
export declare function doSPARQLRequest(query: string[] | Quad[], config: IngestConfig, logger: Logger): Promise<void>;
|
|
14
|
+
export declare function doSPARQLRequest(query: string[] | Quad[], config: IngestConfig, dispatcher: Agent, logger: Logger): Promise<void>;
|
package/lib/Utils.js
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { XSD } from "@treecg/types";
|
|
2
2
|
import { DataFactory } from "rdf-data-factory";
|
|
3
3
|
import { RdfStore } from "rdf-stores";
|
|
4
|
-
import { Agent } from "undici";
|
|
5
4
|
import { Writer as N3Writer } from "n3";
|
|
6
5
|
const df = new DataFactory();
|
|
7
6
|
export function getSubjects(store, predicate, object, graph) {
|
|
@@ -76,7 +75,7 @@ export function sanitizeQuads(store) {
|
|
|
76
75
|
}
|
|
77
76
|
}
|
|
78
77
|
}
|
|
79
|
-
export async function doSPARQLRequest(query, config, logger) {
|
|
78
|
+
export async function doSPARQLRequest(query, config, dispatcher, logger) {
|
|
80
79
|
try {
|
|
81
80
|
const timeout = config.measurePerformance?.queryTimeout || 1800;
|
|
82
81
|
if (query.length > 0 && typeof query[0] !== 'string') {
|
|
@@ -99,10 +98,7 @@ export async function doSPARQLRequest(query, config, logger) {
|
|
|
99
98
|
'Content-Type': hasQuads ? 'application/n-quads' : 'application/n-triples',
|
|
100
99
|
},
|
|
101
100
|
body: serialized,
|
|
102
|
-
dispatcher
|
|
103
|
-
headersTimeout: timeout * 1000,
|
|
104
|
-
bodyTimeout: timeout * 1000,
|
|
105
|
-
}),
|
|
101
|
+
dispatcher,
|
|
106
102
|
});
|
|
107
103
|
if (!res.ok) {
|
|
108
104
|
throw new Error(`HTTP request failed with code ${res.status} and message: \n${await res.text()}`);
|
|
@@ -118,7 +114,6 @@ export async function doSPARQLRequest(query, config, logger) {
|
|
|
118
114
|
queries.push(jointQuery);
|
|
119
115
|
}
|
|
120
116
|
for (const q of queries) {
|
|
121
|
-
logger.error(q);
|
|
122
117
|
logger.debug(`[doSPARQLRequest] Executing SPARQL query: \n${q}`);
|
|
123
118
|
const res = await fetch(config.graphStoreUrl, {
|
|
124
119
|
method: "POST",
|
|
@@ -126,10 +121,7 @@ export async function doSPARQLRequest(query, config, logger) {
|
|
|
126
121
|
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
|
|
127
122
|
},
|
|
128
123
|
body: `update=${fixedEncodeURIComponent(q)}${config.accessToken ? `&access-token=${config.accessToken}` : ''}`,
|
|
129
|
-
dispatcher
|
|
130
|
-
headersTimeout: timeout * 1000,
|
|
131
|
-
bodyTimeout: timeout * 1000,
|
|
132
|
-
}),
|
|
124
|
+
dispatcher,
|
|
133
125
|
});
|
|
134
126
|
if (!res.ok) {
|
|
135
127
|
throw new Error(`HTTP request failed with code ${res.status} and message: \n${await res.text()}`);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rdfc/sparql-ingest-processor-ts",
|
|
3
|
-
"version": "2.1.
|
|
3
|
+
"version": "2.1.6",
|
|
4
4
|
"description": "SPARQL Update function to be within RDF-Connect pipelines",
|
|
5
5
|
"author": "Julián Rojas",
|
|
6
6
|
"contributors": [
|
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
"n3": "^1.26.0",
|
|
32
32
|
"rdf-data-factory": "^2.0.2",
|
|
33
33
|
"rdf-stores": "^2.1.1",
|
|
34
|
-
"undici": "^7.
|
|
34
|
+
"undici": "^7.22.0",
|
|
35
35
|
"winston": "^3.19.0"
|
|
36
36
|
},
|
|
37
37
|
"devDependencies": {
|
|
@@ -39,18 +39,18 @@
|
|
|
39
39
|
"@rdfc/js-runner": "^3.0.2",
|
|
40
40
|
"@rdfjs/types": "^2.0.1",
|
|
41
41
|
"@types/n3": "^1.26.1",
|
|
42
|
-
"@types/node": "^25.
|
|
43
|
-
"@typescript-eslint/eslint-plugin": "^8.
|
|
44
|
-
"@typescript-eslint/parser": "^8.
|
|
42
|
+
"@types/node": "^25.3.0",
|
|
43
|
+
"@typescript-eslint/eslint-plugin": "^8.56.1",
|
|
44
|
+
"@typescript-eslint/parser": "^8.56.1",
|
|
45
45
|
"@vitest/coverage-v8": "^4.0.18",
|
|
46
|
-
"eslint": "^9.39.
|
|
46
|
+
"eslint": "^9.39.3",
|
|
47
47
|
"eslint-config-prettier": "^10.1.8",
|
|
48
48
|
"fastify": "^5.7.4",
|
|
49
49
|
"husky": "^9.1.7",
|
|
50
50
|
"ts-patch": "^3.3.0",
|
|
51
51
|
"tsc-alias": "^1.8.16",
|
|
52
52
|
"typescript": "^5.9.3",
|
|
53
|
-
"vite-tsconfig-paths": "^6.1.
|
|
53
|
+
"vite-tsconfig-paths": "^6.1.1",
|
|
54
54
|
"vitest": "^4.0.18"
|
|
55
55
|
}
|
|
56
|
-
}
|
|
56
|
+
}
|