@_linked/core 1.1.0 → 1.2.0-next.20260302120536

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.
Files changed (187) hide show
  1. package/CHANGELOG.md +60 -0
  2. package/README.md +321 -43
  3. package/lib/cjs/index.js +4 -0
  4. package/lib/cjs/index.js.map +1 -1
  5. package/lib/cjs/interfaces/IQuadStore.d.ts +19 -7
  6. package/lib/cjs/queries/CreateQuery.d.ts +7 -8
  7. package/lib/cjs/queries/CreateQuery.js +4 -4
  8. package/lib/cjs/queries/CreateQuery.js.map +1 -1
  9. package/lib/cjs/queries/DeleteQuery.d.ts +7 -8
  10. package/lib/cjs/queries/DeleteQuery.js +4 -4
  11. package/lib/cjs/queries/DeleteQuery.js.map +1 -1
  12. package/lib/cjs/queries/IRAliasScope.d.ts +20 -0
  13. package/lib/cjs/queries/IRAliasScope.js +52 -0
  14. package/lib/cjs/queries/IRAliasScope.js.map +1 -0
  15. package/lib/cjs/queries/IRCanonicalize.d.ts +36 -0
  16. package/lib/cjs/queries/IRCanonicalize.js +121 -0
  17. package/lib/cjs/queries/IRCanonicalize.js.map +1 -0
  18. package/lib/cjs/queries/IRDesugar.d.ts +98 -0
  19. package/lib/cjs/queries/IRDesugar.js +244 -0
  20. package/lib/cjs/queries/IRDesugar.js.map +1 -0
  21. package/lib/cjs/queries/IRLower.d.ts +8 -0
  22. package/lib/cjs/queries/IRLower.js +272 -0
  23. package/lib/cjs/queries/IRLower.js.map +1 -0
  24. package/lib/cjs/queries/IRMutation.d.ts +23 -0
  25. package/lib/cjs/queries/IRMutation.js +77 -0
  26. package/lib/cjs/queries/IRMutation.js.map +1 -0
  27. package/lib/cjs/queries/IRPipeline.d.ts +8 -0
  28. package/lib/cjs/queries/IRPipeline.js +25 -0
  29. package/lib/cjs/queries/IRPipeline.js.map +1 -0
  30. package/lib/cjs/queries/IRProjection.d.ts +38 -0
  31. package/lib/cjs/queries/IRProjection.js +98 -0
  32. package/lib/cjs/queries/IRProjection.js.map +1 -0
  33. package/lib/cjs/queries/IntermediateRepresentation.d.ts +210 -0
  34. package/lib/cjs/queries/IntermediateRepresentation.js +3 -0
  35. package/lib/cjs/queries/IntermediateRepresentation.js.map +1 -0
  36. package/lib/cjs/queries/MutationQuery.js +9 -23
  37. package/lib/cjs/queries/MutationQuery.js.map +1 -1
  38. package/lib/cjs/queries/QueryFactory.d.ts +0 -2
  39. package/lib/cjs/queries/QueryFactory.js +0 -3
  40. package/lib/cjs/queries/QueryFactory.js.map +1 -1
  41. package/lib/cjs/queries/QueryParser.d.ts +6 -1
  42. package/lib/cjs/queries/QueryParser.js +14 -22
  43. package/lib/cjs/queries/QueryParser.js.map +1 -1
  44. package/lib/cjs/queries/SelectQuery.d.ts +18 -27
  45. package/lib/cjs/queries/SelectQuery.js +54 -45
  46. package/lib/cjs/queries/SelectQuery.js.map +1 -1
  47. package/lib/cjs/queries/UpdateQuery.d.ts +8 -9
  48. package/lib/cjs/queries/UpdateQuery.js +4 -4
  49. package/lib/cjs/queries/UpdateQuery.js.map +1 -1
  50. package/lib/cjs/shapes/SHACL.d.ts +1 -0
  51. package/lib/cjs/shapes/SHACL.js +82 -2
  52. package/lib/cjs/shapes/SHACL.js.map +1 -1
  53. package/lib/cjs/shapes/Shape.d.ts +11 -10
  54. package/lib/cjs/shapes/Shape.js +11 -5
  55. package/lib/cjs/shapes/Shape.js.map +1 -1
  56. package/lib/cjs/sparql/SparqlAlgebra.d.ts +158 -0
  57. package/lib/cjs/sparql/SparqlAlgebra.js +4 -0
  58. package/lib/cjs/sparql/SparqlAlgebra.js.map +1 -0
  59. package/lib/cjs/sparql/SparqlStore.d.ts +52 -0
  60. package/lib/cjs/sparql/SparqlStore.js +81 -0
  61. package/lib/cjs/sparql/SparqlStore.js.map +1 -0
  62. package/lib/cjs/sparql/algebraToString.d.ts +13 -0
  63. package/lib/cjs/sparql/algebraToString.js +298 -0
  64. package/lib/cjs/sparql/algebraToString.js.map +1 -0
  65. package/lib/cjs/sparql/index.d.ts +9 -0
  66. package/lib/cjs/sparql/index.js +40 -0
  67. package/lib/cjs/sparql/index.js.map +1 -0
  68. package/lib/cjs/sparql/irToAlgebra.d.ts +39 -0
  69. package/lib/cjs/sparql/irToAlgebra.js +927 -0
  70. package/lib/cjs/sparql/irToAlgebra.js.map +1 -0
  71. package/lib/cjs/sparql/resultMapping.d.ts +36 -0
  72. package/lib/cjs/sparql/resultMapping.js +501 -0
  73. package/lib/cjs/sparql/resultMapping.js.map +1 -0
  74. package/lib/cjs/sparql/sparqlUtils.d.ts +32 -0
  75. package/lib/cjs/sparql/sparqlUtils.js +89 -0
  76. package/lib/cjs/sparql/sparqlUtils.js.map +1 -0
  77. package/lib/cjs/test-helpers/FusekiStore.d.ts +29 -0
  78. package/lib/cjs/test-helpers/FusekiStore.js +82 -0
  79. package/lib/cjs/test-helpers/FusekiStore.js.map +1 -0
  80. package/lib/cjs/test-helpers/fuseki-test-store.d.ts +43 -0
  81. package/lib/cjs/test-helpers/fuseki-test-store.js +144 -0
  82. package/lib/cjs/test-helpers/fuseki-test-store.js.map +1 -0
  83. package/lib/cjs/test-helpers/query-capture-store.d.ts +5 -0
  84. package/lib/cjs/test-helpers/query-capture-store.js +59 -0
  85. package/lib/cjs/test-helpers/query-capture-store.js.map +1 -0
  86. package/lib/cjs/test-helpers/query-fixtures.d.ts +700 -117
  87. package/lib/cjs/test-helpers/query-fixtures.js +39 -1
  88. package/lib/cjs/test-helpers/query-fixtures.js.map +1 -1
  89. package/lib/cjs/utils/LinkedStorage.d.ts +7 -7
  90. package/lib/cjs/utils/LinkedStorage.js +4 -3
  91. package/lib/cjs/utils/LinkedStorage.js.map +1 -1
  92. package/lib/esm/index.js +4 -0
  93. package/lib/esm/index.js.map +1 -1
  94. package/lib/esm/interfaces/IQuadStore.d.ts +19 -7
  95. package/lib/esm/queries/CreateQuery.d.ts +7 -8
  96. package/lib/esm/queries/CreateQuery.js +4 -4
  97. package/lib/esm/queries/CreateQuery.js.map +1 -1
  98. package/lib/esm/queries/DeleteQuery.d.ts +7 -8
  99. package/lib/esm/queries/DeleteQuery.js +4 -4
  100. package/lib/esm/queries/DeleteQuery.js.map +1 -1
  101. package/lib/esm/queries/IRAliasScope.d.ts +20 -0
  102. package/lib/esm/queries/IRAliasScope.js +47 -0
  103. package/lib/esm/queries/IRAliasScope.js.map +1 -0
  104. package/lib/esm/queries/IRCanonicalize.d.ts +36 -0
  105. package/lib/esm/queries/IRCanonicalize.js +116 -0
  106. package/lib/esm/queries/IRCanonicalize.js.map +1 -0
  107. package/lib/esm/queries/IRDesugar.d.ts +98 -0
  108. package/lib/esm/queries/IRDesugar.js +240 -0
  109. package/lib/esm/queries/IRDesugar.js.map +1 -0
  110. package/lib/esm/queries/IRLower.d.ts +8 -0
  111. package/lib/esm/queries/IRLower.js +268 -0
  112. package/lib/esm/queries/IRLower.js.map +1 -0
  113. package/lib/esm/queries/IRMutation.d.ts +23 -0
  114. package/lib/esm/queries/IRMutation.js +71 -0
  115. package/lib/esm/queries/IRMutation.js.map +1 -0
  116. package/lib/esm/queries/IRPipeline.d.ts +8 -0
  117. package/lib/esm/queries/IRPipeline.js +21 -0
  118. package/lib/esm/queries/IRPipeline.js.map +1 -0
  119. package/lib/esm/queries/IRProjection.d.ts +38 -0
  120. package/lib/esm/queries/IRProjection.js +92 -0
  121. package/lib/esm/queries/IRProjection.js.map +1 -0
  122. package/lib/esm/queries/IntermediateRepresentation.d.ts +210 -0
  123. package/lib/esm/queries/IntermediateRepresentation.js +2 -0
  124. package/lib/esm/queries/IntermediateRepresentation.js.map +1 -0
  125. package/lib/esm/queries/MutationQuery.js +9 -23
  126. package/lib/esm/queries/MutationQuery.js.map +1 -1
  127. package/lib/esm/queries/QueryFactory.d.ts +0 -2
  128. package/lib/esm/queries/QueryFactory.js +0 -3
  129. package/lib/esm/queries/QueryFactory.js.map +1 -1
  130. package/lib/esm/queries/QueryParser.d.ts +6 -1
  131. package/lib/esm/queries/QueryParser.js +14 -23
  132. package/lib/esm/queries/QueryParser.js.map +1 -1
  133. package/lib/esm/queries/SelectQuery.d.ts +18 -27
  134. package/lib/esm/queries/SelectQuery.js +54 -45
  135. package/lib/esm/queries/SelectQuery.js.map +1 -1
  136. package/lib/esm/queries/UpdateQuery.d.ts +8 -9
  137. package/lib/esm/queries/UpdateQuery.js +4 -4
  138. package/lib/esm/queries/UpdateQuery.js.map +1 -1
  139. package/lib/esm/shapes/SHACL.d.ts +1 -0
  140. package/lib/esm/shapes/SHACL.js +82 -2
  141. package/lib/esm/shapes/SHACL.js.map +1 -1
  142. package/lib/esm/shapes/Shape.d.ts +11 -10
  143. package/lib/esm/shapes/Shape.js +11 -5
  144. package/lib/esm/shapes/Shape.js.map +1 -1
  145. package/lib/esm/sparql/SparqlAlgebra.d.ts +158 -0
  146. package/lib/esm/sparql/SparqlAlgebra.js +3 -0
  147. package/lib/esm/sparql/SparqlAlgebra.js.map +1 -0
  148. package/lib/esm/sparql/SparqlStore.d.ts +52 -0
  149. package/lib/esm/sparql/SparqlStore.js +77 -0
  150. package/lib/esm/sparql/SparqlStore.js.map +1 -0
  151. package/lib/esm/sparql/algebraToString.d.ts +13 -0
  152. package/lib/esm/sparql/algebraToString.js +289 -0
  153. package/lib/esm/sparql/algebraToString.js.map +1 -0
  154. package/lib/esm/sparql/index.d.ts +9 -0
  155. package/lib/esm/sparql/index.js +13 -0
  156. package/lib/esm/sparql/index.js.map +1 -0
  157. package/lib/esm/sparql/irToAlgebra.d.ts +39 -0
  158. package/lib/esm/sparql/irToAlgebra.js +917 -0
  159. package/lib/esm/sparql/irToAlgebra.js.map +1 -0
  160. package/lib/esm/sparql/resultMapping.d.ts +36 -0
  161. package/lib/esm/sparql/resultMapping.js +496 -0
  162. package/lib/esm/sparql/resultMapping.js.map +1 -0
  163. package/lib/esm/sparql/sparqlUtils.d.ts +32 -0
  164. package/lib/esm/sparql/sparqlUtils.js +82 -0
  165. package/lib/esm/sparql/sparqlUtils.js.map +1 -0
  166. package/lib/esm/test-helpers/FusekiStore.d.ts +29 -0
  167. package/lib/esm/test-helpers/FusekiStore.js +78 -0
  168. package/lib/esm/test-helpers/FusekiStore.js.map +1 -0
  169. package/lib/esm/test-helpers/fuseki-test-store.d.ts +43 -0
  170. package/lib/esm/test-helpers/fuseki-test-store.js +135 -0
  171. package/lib/esm/test-helpers/fuseki-test-store.js.map +1 -0
  172. package/lib/esm/test-helpers/query-capture-store.d.ts +5 -0
  173. package/lib/esm/test-helpers/query-capture-store.js +55 -0
  174. package/lib/esm/test-helpers/query-capture-store.js.map +1 -0
  175. package/lib/esm/test-helpers/query-fixtures.d.ts +700 -117
  176. package/lib/esm/test-helpers/query-fixtures.js +38 -0
  177. package/lib/esm/test-helpers/query-fixtures.js.map +1 -1
  178. package/lib/esm/utils/LinkedStorage.d.ts +7 -7
  179. package/lib/esm/utils/LinkedStorage.js +4 -3
  180. package/lib/esm/utils/LinkedStorage.js.map +1 -1
  181. package/package.json +7 -3
  182. package/lib/cjs/interfaces/IQueryParser.d.ts +0 -13
  183. package/lib/cjs/interfaces/IQueryParser.js +0 -10
  184. package/lib/cjs/interfaces/IQueryParser.js.map +0 -1
  185. package/lib/esm/interfaces/IQueryParser.d.ts +0 -13
  186. package/lib/esm/interfaces/IQueryParser.js +0 -7
  187. package/lib/esm/interfaces/IQueryParser.js.map +0 -1
@@ -5,6 +5,7 @@
5
5
  */
6
6
  import nextTick from 'next-tick';
7
7
  import { QueryShape, SelectQueryFactory, } from '../queries/SelectQuery.js';
8
+ import { QueryParser } from '../queries/QueryParser.js';
8
9
  import { getPropertyShapeByLabel } from '../utils/ShapeClass.js';
9
10
  import { ShapeSet } from '../collections/ShapeSet.js';
10
11
  export class Shape {
@@ -68,8 +69,7 @@ export class Shape {
68
69
  const query = new SelectQueryFactory(this, _selectFn, subject);
69
70
  let p = new Promise((resolve, reject) => {
70
71
  nextTick(() => {
71
- this.queryParser
72
- .selectQuery(query)
72
+ QueryParser.selectQuery(query)
73
73
  .then((result) => {
74
74
  resolve(result);
75
75
  })
@@ -80,14 +80,20 @@ export class Shape {
80
80
  });
81
81
  return query.patchResultPromise(p);
82
82
  }
83
+ static selectAll(subject) {
84
+ const propertyLabels = this
85
+ .shape.getUniquePropertyShapes()
86
+ .map((propertyShape) => propertyShape.label);
87
+ return this.select(subject, (shape) => propertyLabels.map((label) => shape[label]));
88
+ }
83
89
  static update(id, updateObjectOrFn) {
84
- return this.queryParser.updateQuery(id, updateObjectOrFn, this);
90
+ return QueryParser.updateQuery(id, updateObjectOrFn, this);
85
91
  }
86
92
  static create(updateObjectOrFn) {
87
- return this.queryParser.createQuery(updateObjectOrFn, this);
93
+ return QueryParser.createQuery(updateObjectOrFn, this);
88
94
  }
89
95
  static delete(id) {
90
- return this.queryParser.deleteQuery(id, this);
96
+ return QueryParser.deleteQuery(id, this);
91
97
  }
92
98
  static mapPropertyShapes(mapFunction) {
93
99
  let dummyShape = new this();
@@ -1 +1 @@
1
- {"version":3,"file":"Shape.js","sourceRoot":"","sources":["../../../src/shapes/Shape.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Shape.js","sourceRoot":"","sources":["../../../src/shapes/Shape.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,158 @@
1
+ export type SparqlTerm = {
2
+ kind: 'variable';
3
+ name: string;
4
+ } | {
5
+ kind: 'iri';
6
+ value: string;
7
+ } | {
8
+ kind: 'literal';
9
+ value: string;
10
+ datatype?: string;
11
+ language?: string;
12
+ };
13
+ export type SparqlTriple = {
14
+ subject: SparqlTerm;
15
+ predicate: SparqlTerm;
16
+ object: SparqlTerm;
17
+ };
18
+ export type SparqlAlgebraNode = SparqlBGP | SparqlJoin | SparqlLeftJoin | SparqlFilter | SparqlUnion | SparqlMinus | SparqlExtend | SparqlGraph;
19
+ export type SparqlBGP = {
20
+ type: 'bgp';
21
+ triples: SparqlTriple[];
22
+ };
23
+ export type SparqlJoin = {
24
+ type: 'join';
25
+ left: SparqlAlgebraNode;
26
+ right: SparqlAlgebraNode;
27
+ };
28
+ export type SparqlLeftJoin = {
29
+ type: 'left_join';
30
+ left: SparqlAlgebraNode;
31
+ right: SparqlAlgebraNode;
32
+ condition?: SparqlExpression;
33
+ };
34
+ export type SparqlFilter = {
35
+ type: 'filter';
36
+ expression: SparqlExpression;
37
+ inner: SparqlAlgebraNode;
38
+ };
39
+ export type SparqlUnion = {
40
+ type: 'union';
41
+ left: SparqlAlgebraNode;
42
+ right: SparqlAlgebraNode;
43
+ };
44
+ export type SparqlMinus = {
45
+ type: 'minus';
46
+ left: SparqlAlgebraNode;
47
+ right: SparqlAlgebraNode;
48
+ };
49
+ export type SparqlExtend = {
50
+ type: 'extend';
51
+ inner: SparqlAlgebraNode;
52
+ variable: string;
53
+ expression: SparqlExpression;
54
+ };
55
+ export type SparqlGraph = {
56
+ type: 'graph';
57
+ iri: string;
58
+ inner: SparqlAlgebraNode;
59
+ };
60
+ export type SparqlExpression = SparqlVariableExpr | SparqlIriExpr | SparqlLiteralExpr | SparqlBinaryExpr | SparqlLogicalExpr | SparqlNotExpr | SparqlFunctionExpr | SparqlAggregateExpr | SparqlExistsExpr | SparqlBoundExpr;
61
+ export type SparqlVariableExpr = {
62
+ kind: 'variable_expr';
63
+ name: string;
64
+ };
65
+ export type SparqlIriExpr = {
66
+ kind: 'iri_expr';
67
+ value: string;
68
+ };
69
+ export type SparqlLiteralExpr = {
70
+ kind: 'literal_expr';
71
+ value: string;
72
+ datatype?: string;
73
+ };
74
+ export type SparqlBinaryExpr = {
75
+ kind: 'binary_expr';
76
+ op: string;
77
+ left: SparqlExpression;
78
+ right: SparqlExpression;
79
+ };
80
+ export type SparqlLogicalExpr = {
81
+ kind: 'logical_expr';
82
+ op: 'and' | 'or';
83
+ exprs: SparqlExpression[];
84
+ };
85
+ export type SparqlNotExpr = {
86
+ kind: 'not_expr';
87
+ inner: SparqlExpression;
88
+ };
89
+ export type SparqlFunctionExpr = {
90
+ kind: 'function_expr';
91
+ name: string;
92
+ args: SparqlExpression[];
93
+ };
94
+ export type SparqlAggregateExpr = {
95
+ kind: 'aggregate_expr';
96
+ name: string;
97
+ args: SparqlExpression[];
98
+ distinct?: boolean;
99
+ };
100
+ export type SparqlExistsExpr = {
101
+ kind: 'exists_expr';
102
+ pattern: SparqlAlgebraNode;
103
+ negated: boolean;
104
+ };
105
+ export type SparqlBoundExpr = {
106
+ kind: 'bound_expr';
107
+ variable: string;
108
+ };
109
+ export type SparqlProjectionItem = {
110
+ kind: 'variable';
111
+ name: string;
112
+ } | {
113
+ kind: 'aggregate';
114
+ expression: SparqlAggregateExpr;
115
+ alias: string;
116
+ } | {
117
+ kind: 'expression';
118
+ expression: SparqlExpression;
119
+ alias: string;
120
+ };
121
+ export type SparqlOrderCondition = {
122
+ expression: SparqlExpression;
123
+ direction: 'ASC' | 'DESC';
124
+ };
125
+ export type SparqlAggregateBinding = {
126
+ variable: string;
127
+ aggregate: SparqlAggregateExpr;
128
+ };
129
+ export type SparqlSelectPlan = {
130
+ type: 'select';
131
+ algebra: SparqlAlgebraNode;
132
+ projection: SparqlProjectionItem[];
133
+ distinct?: boolean;
134
+ orderBy?: SparqlOrderCondition[];
135
+ limit?: number;
136
+ offset?: number;
137
+ groupBy?: string[];
138
+ having?: SparqlExpression;
139
+ aggregates?: SparqlAggregateBinding[];
140
+ };
141
+ export type SparqlInsertDataPlan = {
142
+ type: 'insert_data';
143
+ triples: SparqlTriple[];
144
+ graph?: string;
145
+ };
146
+ export type SparqlDeleteInsertPlan = {
147
+ type: 'delete_insert';
148
+ deletePatterns: SparqlTriple[];
149
+ insertPatterns: SparqlTriple[];
150
+ whereAlgebra: SparqlAlgebraNode;
151
+ graph?: string;
152
+ };
153
+ export type SparqlDeleteWherePlan = {
154
+ type: 'delete_where';
155
+ patterns: SparqlAlgebraNode;
156
+ graph?: string;
157
+ };
158
+ export type SparqlPlan = SparqlSelectPlan | SparqlInsertDataPlan | SparqlDeleteInsertPlan | SparqlDeleteWherePlan;
@@ -0,0 +1,3 @@
1
+ // --- Term types ---
2
+ export {};
3
+ //# sourceMappingURL=SparqlAlgebra.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SparqlAlgebra.js","sourceRoot":"","sources":["../../../src/sparql/SparqlAlgebra.ts"],"names":[],"mappings":"AAAA,qBAAqB"}
@@ -0,0 +1,52 @@
1
+ import type { IQuadStore } from '../interfaces/IQuadStore.js';
2
+ import type { SelectQuery } from '../queries/SelectQuery.js';
3
+ import type { CreateQuery } from '../queries/CreateQuery.js';
4
+ import type { UpdateQuery } from '../queries/UpdateQuery.js';
5
+ import type { DeleteQuery, DeleteResponse } from '../queries/DeleteQuery.js';
6
+ import type { SelectResult, CreateResult, UpdateResult } from '../queries/IntermediateRepresentation.js';
7
+ import type { SparqlJsonResults } from './resultMapping.js';
8
+ import { type SparqlOptions } from './sparqlUtils.js';
9
+ /**
10
+ * Abstract base class for SPARQL-backed quad stores.
11
+ *
12
+ * Handles the full pipeline: IR query → SPARQL string → execute → map results.
13
+ * Subclasses only need to implement the two transport methods:
14
+ * - `executeSparqlSelect` — send a SPARQL SELECT and return JSON results
15
+ * - `executeSparqlUpdate` — send a SPARQL UPDATE (INSERT DATA / DELETE..INSERT / etc.)
16
+ *
17
+ * Example subclass (Fuseki):
18
+ * ```ts
19
+ * class FusekiStore extends SparqlStore {
20
+ * constructor(baseUrl: string, dataset: string) {
21
+ * super({ dataRoot: 'http://data.example.org' });
22
+ * this.queryEndpoint = `${baseUrl}/${dataset}/sparql`;
23
+ * this.updateEndpoint = `${baseUrl}/${dataset}/update`;
24
+ * }
25
+ * protected async executeSparqlSelect(sparql: string) {
26
+ * const res = await fetch(this.queryEndpoint, { ... });
27
+ * return res.json();
28
+ * }
29
+ * protected async executeSparqlUpdate(sparql: string) {
30
+ * await fetch(this.updateEndpoint, { ... });
31
+ * }
32
+ * }
33
+ * ```
34
+ */
35
+ export declare abstract class SparqlStore implements IQuadStore {
36
+ protected options?: SparqlOptions;
37
+ constructor(options?: SparqlOptions);
38
+ /**
39
+ * Send a SPARQL SELECT/ASK/CONSTRUCT query and return the parsed
40
+ * SPARQL JSON Results (application/sparql-results+json).
41
+ */
42
+ protected abstract executeSparqlSelect(sparql: string): Promise<SparqlJsonResults>;
43
+ /**
44
+ * Send a SPARQL UPDATE request (INSERT DATA, DELETE/INSERT, etc.).
45
+ * No return value — the update is fire-and-forget at the SPARQL level.
46
+ */
47
+ protected abstract executeSparqlUpdate(sparql: string): Promise<void>;
48
+ selectQuery(query: SelectQuery): Promise<SelectResult>;
49
+ createQuery(query: CreateQuery): Promise<CreateResult>;
50
+ updateQuery(query: UpdateQuery): Promise<UpdateResult>;
51
+ deleteQuery(query: DeleteQuery): Promise<DeleteResponse>;
52
+ }
@@ -0,0 +1,77 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import { selectToSparql, createToSparql, updateToSparql, deleteToSparql, } from './irToAlgebra.js';
11
+ import { mapSparqlSelectResult, mapSparqlCreateResult, mapSparqlUpdateResult, } from './resultMapping.js';
12
+ import { generateEntityUri } from './sparqlUtils.js';
13
+ /**
14
+ * Abstract base class for SPARQL-backed quad stores.
15
+ *
16
+ * Handles the full pipeline: IR query → SPARQL string → execute → map results.
17
+ * Subclasses only need to implement the two transport methods:
18
+ * - `executeSparqlSelect` — send a SPARQL SELECT and return JSON results
19
+ * - `executeSparqlUpdate` — send a SPARQL UPDATE (INSERT DATA / DELETE..INSERT / etc.)
20
+ *
21
+ * Example subclass (Fuseki):
22
+ * ```ts
23
+ * class FusekiStore extends SparqlStore {
24
+ * constructor(baseUrl: string, dataset: string) {
25
+ * super({ dataRoot: 'http://data.example.org' });
26
+ * this.queryEndpoint = `${baseUrl}/${dataset}/sparql`;
27
+ * this.updateEndpoint = `${baseUrl}/${dataset}/update`;
28
+ * }
29
+ * protected async executeSparqlSelect(sparql: string) {
30
+ * const res = await fetch(this.queryEndpoint, { ... });
31
+ * return res.json();
32
+ * }
33
+ * protected async executeSparqlUpdate(sparql: string) {
34
+ * await fetch(this.updateEndpoint, { ... });
35
+ * }
36
+ * }
37
+ * ```
38
+ */
39
+ export class SparqlStore {
40
+ constructor(options) {
41
+ this.options = options;
42
+ }
43
+ selectQuery(query) {
44
+ return __awaiter(this, void 0, void 0, function* () {
45
+ const sparql = selectToSparql(query, this.options);
46
+ const json = yield this.executeSparqlSelect(sparql);
47
+ return mapSparqlSelectResult(json, query);
48
+ });
49
+ }
50
+ createQuery(query) {
51
+ return __awaiter(this, void 0, void 0, function* () {
52
+ const uri = generateEntityUri(query.data.shape, this.options);
53
+ query.data.id = uri;
54
+ const sparql = createToSparql(query, this.options);
55
+ yield this.executeSparqlUpdate(sparql);
56
+ return mapSparqlCreateResult(uri, query);
57
+ });
58
+ }
59
+ updateQuery(query) {
60
+ return __awaiter(this, void 0, void 0, function* () {
61
+ const sparql = updateToSparql(query, this.options);
62
+ yield this.executeSparqlUpdate(sparql);
63
+ return mapSparqlUpdateResult(query);
64
+ });
65
+ }
66
+ deleteQuery(query) {
67
+ return __awaiter(this, void 0, void 0, function* () {
68
+ const sparql = deleteToSparql(query, this.options);
69
+ yield this.executeSparqlUpdate(sparql);
70
+ return {
71
+ deleted: query.ids,
72
+ count: query.ids.length,
73
+ };
74
+ });
75
+ }
76
+ }
77
+ //# sourceMappingURL=SparqlStore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SparqlStore.js","sourceRoot":"","sources":["../../../src/sparql/SparqlStore.ts"],"names":[],"mappings":";;;;;;;;;AAWA,OAAO,EACL,cAAc,EACd,cAAc,EACd,cAAc,EACd,cAAc,GACf,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,qBAAqB,EACrB,qBAAqB,EACrB,qBAAqB,GACtB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAC,iBAAiB,EAAqB,MAAM,kBAAkB,CAAC;AAEvE;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,MAAM,OAAgB,WAAW;IAG/B,YAAY,OAAuB;QACjC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAgBK,WAAW,CAAC,KAAkB;;YAClC,MAAM,MAAM,GAAG,cAAc,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;YACnD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC;YACpD,OAAO,qBAAqB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAC5C,CAAC;KAAA;IAEK,WAAW,CAAC,KAAkB;;YAClC,MAAM,GAAG,GAAG,iBAAiB,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;YAC9D,KAAK,CAAC,IAAI,CAAC,EAAE,GAAG,GAAG,CAAC;YACpB,MAAM,MAAM,GAAG,cAAc,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;YACnD,MAAM,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC;YACvC,OAAO,qBAAqB,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC3C,CAAC;KAAA;IAEK,WAAW,CAAC,KAAkB;;YAClC,MAAM,MAAM,GAAG,cAAc,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;YACnD,MAAM,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC;YACvC,OAAO,qBAAqB,CAAC,KAAK,CAAC,CAAC;QACtC,CAAC;KAAA;IAEK,WAAW,CAAC,KAAkB;;YAClC,MAAM,MAAM,GAAG,cAAc,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;YACnD,MAAM,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC;YACvC,OAAO;gBACL,OAAO,EAAE,KAAK,CAAC,GAAG;gBAClB,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,MAAM;aACxB,CAAC;QACJ,CAAC;KAAA;CACF"}
@@ -0,0 +1,13 @@
1
+ import { SparqlAlgebraNode, SparqlExpression, SparqlTerm, SparqlSelectPlan, SparqlInsertDataPlan, SparqlDeleteInsertPlan, SparqlDeleteWherePlan } from './SparqlAlgebra.js';
2
+ import { SparqlOptions } from './sparqlUtils.js';
3
+ type UriCollector = {
4
+ uris: Set<string>;
5
+ };
6
+ export declare function serializeTerm(term: SparqlTerm, collector?: UriCollector): string;
7
+ export declare function serializeExpression(expr: SparqlExpression, collector?: UriCollector): string;
8
+ export declare function serializeAlgebraNode(node: SparqlAlgebraNode, collector?: UriCollector): string;
9
+ export declare function selectPlanToSparql(plan: SparqlSelectPlan, _options?: SparqlOptions): string;
10
+ export declare function insertDataPlanToSparql(plan: SparqlInsertDataPlan, _options?: SparqlOptions): string;
11
+ export declare function deleteInsertPlanToSparql(plan: SparqlDeleteInsertPlan, _options?: SparqlOptions): string;
12
+ export declare function deleteWherePlanToSparql(plan: SparqlDeleteWherePlan, _options?: SparqlOptions): string;
13
+ export {};
@@ -0,0 +1,289 @@
1
+ import { formatUri, formatLiteral, escapeSparqlString, collectPrefixes, } from './sparqlUtils.js';
2
+ function collectUri(collector, uri) {
3
+ collector.uris.add(uri);
4
+ }
5
+ // ---------------------------------------------------------------------------
6
+ // Term serialization
7
+ // ---------------------------------------------------------------------------
8
+ export function serializeTerm(term, collector) {
9
+ switch (term.kind) {
10
+ case 'variable':
11
+ return `?${term.name}`;
12
+ case 'iri':
13
+ if (collector)
14
+ collectUri(collector, term.value);
15
+ return formatUri(term.value);
16
+ case 'literal': {
17
+ if (term.language) {
18
+ return `"${escapeSparqlString(term.value)}"@${term.language}`;
19
+ }
20
+ if (term.datatype) {
21
+ if (collector)
22
+ collectUri(collector, term.datatype);
23
+ }
24
+ return formatLiteral(term.value, term.datatype);
25
+ }
26
+ }
27
+ }
28
+ // ---------------------------------------------------------------------------
29
+ // Triple serialization
30
+ // ---------------------------------------------------------------------------
31
+ function serializeTriple(triple, collector) {
32
+ const s = serializeTerm(triple.subject, collector);
33
+ const p = serializeTerm(triple.predicate, collector);
34
+ const o = serializeTerm(triple.object, collector);
35
+ return `${s} ${p} ${o}`;
36
+ }
37
+ function serializeTriples(triples, collector) {
38
+ return triples
39
+ .map((t) => serializeTriple(t, collector) + ' .')
40
+ .join('\n');
41
+ }
42
+ // ---------------------------------------------------------------------------
43
+ // Expression serialization
44
+ // ---------------------------------------------------------------------------
45
+ export function serializeExpression(expr, collector) {
46
+ switch (expr.kind) {
47
+ case 'variable_expr':
48
+ return `?${expr.name}`;
49
+ case 'iri_expr':
50
+ if (collector)
51
+ collectUri(collector, expr.value);
52
+ return formatUri(expr.value);
53
+ case 'literal_expr': {
54
+ if (expr.datatype && collector)
55
+ collectUri(collector, expr.datatype);
56
+ return formatLiteral(expr.value, expr.datatype);
57
+ }
58
+ case 'binary_expr': {
59
+ const left = serializeExpression(expr.left, collector);
60
+ const right = serializeExpression(expr.right, collector);
61
+ return `${left} ${expr.op} ${right}`;
62
+ }
63
+ case 'logical_expr': {
64
+ const op = expr.op === 'and' ? '&&' : '||';
65
+ const parts = expr.exprs.map((e) => {
66
+ const s = serializeExpression(e, collector);
67
+ // Parenthesize OR children inside AND (AND binds tighter than OR)
68
+ if (expr.op === 'and' && e.kind === 'logical_expr' && e.op === 'or') {
69
+ return `(${s})`;
70
+ }
71
+ return s;
72
+ });
73
+ return parts.join(` ${op} `);
74
+ }
75
+ case 'not_expr':
76
+ return `!(${serializeExpression(expr.inner, collector)})`;
77
+ case 'function_expr': {
78
+ const args = expr.args
79
+ .map((a) => serializeExpression(a, collector))
80
+ .join(', ');
81
+ return `${expr.name}(${args})`;
82
+ }
83
+ case 'aggregate_expr': {
84
+ const args = expr.args
85
+ .map((a) => serializeExpression(a, collector))
86
+ .join(', ');
87
+ const distinctPrefix = expr.distinct ? 'DISTINCT ' : '';
88
+ return `${expr.name}(${distinctPrefix}${args})`;
89
+ }
90
+ case 'exists_expr': {
91
+ const inner = serializeAlgebraNode(expr.pattern, collector);
92
+ const prefix = expr.negated ? 'NOT EXISTS' : 'EXISTS';
93
+ return `${prefix} {\n${indent(inner)}\n}`;
94
+ }
95
+ case 'bound_expr':
96
+ return `BOUND(?${expr.variable})`;
97
+ }
98
+ }
99
+ // ---------------------------------------------------------------------------
100
+ // Algebra node serialization
101
+ // ---------------------------------------------------------------------------
102
+ export function serializeAlgebraNode(node, collector) {
103
+ switch (node.type) {
104
+ case 'bgp':
105
+ return serializeTriples(node.triples, collector);
106
+ case 'join': {
107
+ const left = serializeAlgebraNode(node.left, collector);
108
+ const right = serializeAlgebraNode(node.right, collector);
109
+ return `${left}\n${right}`;
110
+ }
111
+ case 'left_join': {
112
+ const left = serializeAlgebraNode(node.left, collector);
113
+ const right = serializeAlgebraNode(node.right, collector);
114
+ let optionalBlock = `OPTIONAL {\n${indent(right)}\n}`;
115
+ if (node.condition) {
116
+ const cond = serializeExpression(node.condition, collector);
117
+ // OPTIONAL with filter: OPTIONAL { pattern FILTER(cond) }
118
+ // Re-build to include filter inside the OPTIONAL block
119
+ optionalBlock = `OPTIONAL {\n${indent(right)}\n FILTER(${cond})\n}`;
120
+ }
121
+ // If left side is empty (e.g. UPDATE WHERE with all-OPTIONAL triples),
122
+ // omit the empty prefix to avoid blank lines
123
+ return left ? `${left}\n${optionalBlock}` : optionalBlock;
124
+ }
125
+ case 'filter': {
126
+ const inner = serializeAlgebraNode(node.inner, collector);
127
+ const expr = serializeExpression(node.expression, collector);
128
+ return `${inner}\nFILTER(${expr})`;
129
+ }
130
+ case 'union': {
131
+ const left = serializeAlgebraNode(node.left, collector);
132
+ const right = serializeAlgebraNode(node.right, collector);
133
+ return `{\n${indent(left)}\n}\nUNION\n{\n${indent(right)}\n}`;
134
+ }
135
+ case 'minus': {
136
+ const left = serializeAlgebraNode(node.left, collector);
137
+ const right = serializeAlgebraNode(node.right, collector);
138
+ return `${left}\nMINUS {\n${indent(right)}\n}`;
139
+ }
140
+ case 'extend': {
141
+ const inner = serializeAlgebraNode(node.inner, collector);
142
+ const expr = serializeExpression(node.expression, collector);
143
+ return `${inner}\nBIND(${expr} AS ?${node.variable})`;
144
+ }
145
+ case 'graph': {
146
+ if (collector)
147
+ collectUri(collector, node.iri);
148
+ const inner = serializeAlgebraNode(node.inner, collector);
149
+ return `GRAPH ${formatUri(node.iri)} {\n${indent(inner)}\n}`;
150
+ }
151
+ }
152
+ }
153
+ // ---------------------------------------------------------------------------
154
+ // Helpers
155
+ // ---------------------------------------------------------------------------
156
+ function indent(text, level = 1) {
157
+ const prefix = ' '.repeat(level);
158
+ return text
159
+ .split('\n')
160
+ .map((line) => prefix + line)
161
+ .join('\n');
162
+ }
163
+ function buildPrefixBlock(usedUris) {
164
+ const prefixes = collectPrefixes([...usedUris]);
165
+ const lines = Object.entries(prefixes)
166
+ .sort(([a], [b]) => a.localeCompare(b))
167
+ .map(([prefix, uri]) => `PREFIX ${prefix}: <${uri}>`);
168
+ return lines.join('\n');
169
+ }
170
+ // ---------------------------------------------------------------------------
171
+ // Top-level plan serializers
172
+ // ---------------------------------------------------------------------------
173
+ export function selectPlanToSparql(plan, _options) {
174
+ const collector = { uris: new Set() };
175
+ // 1. Serialize WHERE body
176
+ const body = serializeAlgebraNode(plan.algebra, collector);
177
+ // 2. Build SELECT line
178
+ const projectionParts = plan.projection.map((item) => {
179
+ if (item.kind === 'variable') {
180
+ return `?${item.name}`;
181
+ }
182
+ else {
183
+ // aggregate or expression projection: (expr AS ?alias)
184
+ const expr = serializeExpression(item.expression, collector);
185
+ return `(${expr} AS ?${item.alias})`;
186
+ }
187
+ });
188
+ const distinctStr = plan.distinct ? 'DISTINCT ' : '';
189
+ const selectLine = `SELECT ${distinctStr}${projectionParts.join(' ')}`;
190
+ // 3. Build WHERE block
191
+ const whereBlock = `WHERE {\n${indent(body)}\n}`;
192
+ // 4. Build trailing clauses
193
+ const clauses = [];
194
+ if (plan.groupBy && plan.groupBy.length > 0) {
195
+ clauses.push(`GROUP BY ${plan.groupBy.map((v) => `?${v}`).join(' ')}`);
196
+ }
197
+ if (plan.having) {
198
+ const havingExpr = serializeExpression(plan.having, collector);
199
+ clauses.push(`HAVING(${havingExpr})`);
200
+ }
201
+ if (plan.orderBy && plan.orderBy.length > 0) {
202
+ const orderParts = plan.orderBy.map((cond) => {
203
+ const expr = serializeExpression(cond.expression, collector);
204
+ return `${cond.direction}(${expr})`;
205
+ });
206
+ clauses.push(`ORDER BY ${orderParts.join(' ')}`);
207
+ }
208
+ if (plan.limit !== undefined) {
209
+ clauses.push(`LIMIT ${plan.limit}`);
210
+ }
211
+ if (plan.offset !== undefined) {
212
+ clauses.push(`OFFSET ${plan.offset}`);
213
+ }
214
+ // 5. Build PREFIX block (after collecting all URIs)
215
+ const prefixBlock = buildPrefixBlock(collector.uris);
216
+ // 6. Assemble
217
+ const parts = [];
218
+ if (prefixBlock)
219
+ parts.push(prefixBlock);
220
+ parts.push(selectLine);
221
+ parts.push(whereBlock);
222
+ parts.push(...clauses);
223
+ return parts.join('\n');
224
+ }
225
+ export function insertDataPlanToSparql(plan, _options) {
226
+ const collector = { uris: new Set() };
227
+ let triplesStr;
228
+ if (plan.graph) {
229
+ if (collector)
230
+ collectUri(collector, plan.graph);
231
+ const innerTriples = serializeTriples(plan.triples, collector);
232
+ triplesStr = `GRAPH ${formatUri(plan.graph)} {\n${indent(innerTriples)}\n}`;
233
+ }
234
+ else {
235
+ triplesStr = serializeTriples(plan.triples, collector);
236
+ }
237
+ const body = `INSERT DATA {\n${indent(triplesStr)}\n}`;
238
+ const prefixBlock = buildPrefixBlock(collector.uris);
239
+ const parts = [];
240
+ if (prefixBlock)
241
+ parts.push(prefixBlock);
242
+ parts.push(body);
243
+ return parts.join('\n');
244
+ }
245
+ export function deleteInsertPlanToSparql(plan, _options) {
246
+ const collector = { uris: new Set() };
247
+ // DELETE block
248
+ const deleteTriples = serializeTriples(plan.deletePatterns, collector);
249
+ const deletePart = `DELETE {\n${indent(deleteTriples)}\n}`;
250
+ // INSERT block (may be empty)
251
+ let insertPart = '';
252
+ if (plan.insertPatterns.length > 0) {
253
+ const insertTriples = serializeTriples(plan.insertPatterns, collector);
254
+ insertPart = `INSERT {\n${indent(insertTriples)}\n}\n`;
255
+ }
256
+ // WHERE block
257
+ const whereBody = serializeAlgebraNode(plan.whereAlgebra, collector);
258
+ const wherePart = `WHERE {\n${indent(whereBody)}\n}`;
259
+ const prefixBlock = buildPrefixBlock(collector.uris);
260
+ const parts = [];
261
+ if (prefixBlock)
262
+ parts.push(prefixBlock);
263
+ parts.push(deletePart);
264
+ if (insertPart)
265
+ parts.push(insertPart.trimEnd());
266
+ parts.push(wherePart);
267
+ return parts.join('\n');
268
+ }
269
+ export function deleteWherePlanToSparql(plan, _options) {
270
+ const collector = { uris: new Set() };
271
+ const body = serializeAlgebraNode(plan.patterns, collector);
272
+ let content;
273
+ if (plan.graph) {
274
+ if (collector)
275
+ collectUri(collector, plan.graph);
276
+ content = `GRAPH ${formatUri(plan.graph)} {\n${indent(body)}\n}`;
277
+ }
278
+ else {
279
+ content = body;
280
+ }
281
+ const result = `DELETE WHERE {\n${indent(content)}\n}`;
282
+ const prefixBlock = buildPrefixBlock(collector.uris);
283
+ const parts = [];
284
+ if (prefixBlock)
285
+ parts.push(prefixBlock);
286
+ parts.push(result);
287
+ return parts.join('\n');
288
+ }
289
+ //# sourceMappingURL=algebraToString.js.map