@_linked/core 2.2.0-next.20260313111743 → 2.2.0
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/CHANGELOG.md +253 -0
- package/lib/cjs/ontologies/shacl.d.ts +5 -0
- package/lib/cjs/ontologies/shacl.js +10 -0
- package/lib/cjs/ontologies/shacl.js.map +1 -1
- package/lib/cjs/paths/PropertyPathExpr.d.ts +38 -0
- package/lib/cjs/paths/PropertyPathExpr.js +221 -0
- package/lib/cjs/paths/PropertyPathExpr.js.map +1 -0
- package/lib/cjs/paths/normalizePropertyPath.d.ts +23 -0
- package/lib/cjs/paths/normalizePropertyPath.js +75 -0
- package/lib/cjs/paths/normalizePropertyPath.js.map +1 -0
- package/lib/cjs/paths/pathExprToSparql.d.ts +14 -0
- package/lib/cjs/paths/pathExprToSparql.js +136 -0
- package/lib/cjs/paths/pathExprToSparql.js.map +1 -0
- package/lib/cjs/paths/serializePathToSHACL.d.ts +22 -0
- package/lib/cjs/paths/serializePathToSHACL.js +126 -0
- package/lib/cjs/paths/serializePathToSHACL.js.map +1 -0
- package/lib/cjs/queries/IRDesugar.d.ts +2 -0
- package/lib/cjs/queries/IRDesugar.js +24 -8
- package/lib/cjs/queries/IRDesugar.js.map +1 -1
- package/lib/cjs/queries/IRLower.js +9 -5
- package/lib/cjs/queries/IRLower.js.map +1 -1
- package/lib/cjs/queries/IRProjection.d.ts +2 -1
- package/lib/cjs/queries/IRProjection.js +7 -3
- package/lib/cjs/queries/IRProjection.js.map +1 -1
- package/lib/cjs/queries/IntermediateRepresentation.d.ts +3 -0
- package/lib/cjs/queries/QueryBuilder.js +3 -2
- package/lib/cjs/queries/QueryBuilder.js.map +1 -1
- package/lib/cjs/shapes/SHACL.d.ts +62 -24
- package/lib/cjs/shapes/SHACL.js +30 -26
- package/lib/cjs/shapes/SHACL.js.map +1 -1
- package/lib/cjs/sparql/SparqlAlgebra.d.ts +4 -0
- package/lib/cjs/sparql/algebraToString.js +6 -0
- package/lib/cjs/sparql/algebraToString.js.map +1 -1
- package/lib/cjs/sparql/irToAlgebra.js +13 -3
- package/lib/cjs/sparql/irToAlgebra.js.map +1 -1
- package/lib/cjs/utils/NodeReference.d.ts +24 -0
- package/lib/cjs/utils/NodeReference.js +41 -1
- package/lib/cjs/utils/NodeReference.js.map +1 -1
- package/lib/cjs/utils/ShapeClass.js +3 -1
- package/lib/cjs/utils/ShapeClass.js.map +1 -1
- package/lib/esm/ontologies/shacl.d.ts +5 -0
- package/lib/esm/ontologies/shacl.js +10 -0
- package/lib/esm/ontologies/shacl.js.map +1 -1
- package/lib/esm/paths/PropertyPathExpr.d.ts +38 -0
- package/lib/esm/paths/PropertyPathExpr.js +215 -0
- package/lib/esm/paths/PropertyPathExpr.js.map +1 -0
- package/lib/esm/paths/normalizePropertyPath.d.ts +23 -0
- package/lib/esm/paths/normalizePropertyPath.js +71 -0
- package/lib/esm/paths/normalizePropertyPath.js.map +1 -0
- package/lib/esm/paths/pathExprToSparql.d.ts +14 -0
- package/lib/esm/paths/pathExprToSparql.js +132 -0
- package/lib/esm/paths/pathExprToSparql.js.map +1 -0
- package/lib/esm/paths/serializePathToSHACL.d.ts +22 -0
- package/lib/esm/paths/serializePathToSHACL.js +122 -0
- package/lib/esm/paths/serializePathToSHACL.js.map +1 -0
- package/lib/esm/queries/IRDesugar.d.ts +2 -0
- package/lib/esm/queries/IRDesugar.js +24 -8
- package/lib/esm/queries/IRDesugar.js.map +1 -1
- package/lib/esm/queries/IRLower.js +9 -5
- package/lib/esm/queries/IRLower.js.map +1 -1
- package/lib/esm/queries/IRProjection.d.ts +2 -1
- package/lib/esm/queries/IRProjection.js +7 -3
- package/lib/esm/queries/IRProjection.js.map +1 -1
- package/lib/esm/queries/IntermediateRepresentation.d.ts +3 -0
- package/lib/esm/queries/QueryBuilder.js +3 -2
- package/lib/esm/queries/QueryBuilder.js.map +1 -1
- package/lib/esm/shapes/SHACL.d.ts +62 -24
- package/lib/esm/shapes/SHACL.js +30 -26
- package/lib/esm/shapes/SHACL.js.map +1 -1
- package/lib/esm/sparql/SparqlAlgebra.d.ts +4 -0
- package/lib/esm/sparql/algebraToString.js +6 -0
- package/lib/esm/sparql/algebraToString.js.map +1 -1
- package/lib/esm/sparql/irToAlgebra.js +13 -3
- package/lib/esm/sparql/irToAlgebra.js.map +1 -1
- package/lib/esm/utils/NodeReference.d.ts +24 -0
- package/lib/esm/utils/NodeReference.js +39 -1
- package/lib/esm/utils/NodeReference.js.map +1 -1
- package/lib/esm/utils/ShapeClass.js +3 -1
- package/lib/esm/utils/ShapeClass.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PropertyPathExpr.js","sourceRoot":"","sources":["../../../src/paths/PropertyPathExpr.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { PathExpr } from './PropertyPathExpr.js';
|
|
2
|
+
/**
|
|
3
|
+
* Input type for property path decorators.
|
|
4
|
+
* Accepts all forms: string, {id}, array (sequence shorthand), or PathExpr.
|
|
5
|
+
*/
|
|
6
|
+
export type PropertyPathDecoratorInput = string | {
|
|
7
|
+
id: string;
|
|
8
|
+
} | PropertyPathDecoratorInput[] | PathExpr;
|
|
9
|
+
/**
|
|
10
|
+
* Normalize any property path decorator input into a canonical PathExpr.
|
|
11
|
+
*
|
|
12
|
+
* - `string` without path operators → preserved as-is (a PathRef)
|
|
13
|
+
* - `string` with operators → parsed via `parsePropertyPath`
|
|
14
|
+
* - `{id: string}` → preserved as PathRef
|
|
15
|
+
* - `PathExpr` structured object → passed through
|
|
16
|
+
* - `Array` → converted to `{seq: [...]}`
|
|
17
|
+
*/
|
|
18
|
+
export declare function normalizePropertyPath(input: PropertyPathDecoratorInput): PathExpr;
|
|
19
|
+
/**
|
|
20
|
+
* Check whether a PathExpr is a simple single-IRI path (backward-compatible form).
|
|
21
|
+
* Returns the IRI string if simple, or null if complex.
|
|
22
|
+
*/
|
|
23
|
+
export declare function getSimplePathId(expr: PathExpr): string | null;
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
3
|
+
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
4
|
+
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
5
|
+
*/
|
|
6
|
+
import { parsePropertyPath, PATH_OPERATOR_CHARS } from './PropertyPathExpr.js';
|
|
7
|
+
/** Path expression operator keys used to detect structured PathExpr objects. */
|
|
8
|
+
const PATH_EXPR_KEYS = new Set(['seq', 'alt', 'inv', 'zeroOrMore', 'oneOrMore', 'zeroOrOne', 'negatedPropertySet']);
|
|
9
|
+
/** Check if an object is a structured PathExpr (not a plain {id} ref). */
|
|
10
|
+
const isStructuredPathExpr = (value) => {
|
|
11
|
+
if (typeof value !== 'object' || value === null)
|
|
12
|
+
return false;
|
|
13
|
+
return Object.keys(value).some((key) => PATH_EXPR_KEYS.has(key));
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* Normalize any property path decorator input into a canonical PathExpr.
|
|
17
|
+
*
|
|
18
|
+
* - `string` without path operators → preserved as-is (a PathRef)
|
|
19
|
+
* - `string` with operators → parsed via `parsePropertyPath`
|
|
20
|
+
* - `{id: string}` → preserved as PathRef
|
|
21
|
+
* - `PathExpr` structured object → passed through
|
|
22
|
+
* - `Array` → converted to `{seq: [...]}`
|
|
23
|
+
*/
|
|
24
|
+
export function normalizePropertyPath(input) {
|
|
25
|
+
let result;
|
|
26
|
+
// String input
|
|
27
|
+
if (typeof input === 'string') {
|
|
28
|
+
if (PATH_OPERATOR_CHARS.test(input)) {
|
|
29
|
+
result = parsePropertyPath(input);
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
result = input;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
// Array → sequence shorthand
|
|
36
|
+
else if (Array.isArray(input)) {
|
|
37
|
+
const normalized = input.map((item) => normalizePropertyPath(item));
|
|
38
|
+
result = normalized.length === 1 ? normalized[0] : { seq: normalized };
|
|
39
|
+
}
|
|
40
|
+
// Object
|
|
41
|
+
else if (typeof input === 'object' && input !== null) {
|
|
42
|
+
// Structured PathExpr (has seq, alt, inv, etc.)
|
|
43
|
+
if (isStructuredPathExpr(input)) {
|
|
44
|
+
result = input;
|
|
45
|
+
}
|
|
46
|
+
// Plain {id} ref
|
|
47
|
+
else if ('id' in input) {
|
|
48
|
+
result = input;
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
throw new Error(`Invalid property path input: ${JSON.stringify(input)}`);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
throw new Error(`Invalid property path input: ${JSON.stringify(input)}`);
|
|
56
|
+
}
|
|
57
|
+
return result;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Check whether a PathExpr is a simple single-IRI path (backward-compatible form).
|
|
61
|
+
* Returns the IRI string if simple, or null if complex.
|
|
62
|
+
*/
|
|
63
|
+
export function getSimplePathId(expr) {
|
|
64
|
+
if (typeof expr === 'string')
|
|
65
|
+
return expr;
|
|
66
|
+
if (typeof expr === 'object' && expr !== null && 'id' in expr && !isStructuredPathExpr(expr)) {
|
|
67
|
+
return expr.id;
|
|
68
|
+
}
|
|
69
|
+
return null;
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=normalizePropertyPath.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"normalizePropertyPath.js","sourceRoot":"","sources":["../../../src/paths/normalizePropertyPath.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAW,iBAAiB,EAAE,mBAAmB,EAAC,MAAM,uBAAuB,CAAC;AAYvF,gFAAgF;AAChF,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,oBAAoB,CAAC,CAAC,CAAC;AAEpH,0EAA0E;AAC1E,MAAM,oBAAoB,GAAG,CAAC,KAAc,EAAW,EAAE;IACvD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAC9D,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;AACnE,CAAC,CAAC;AAEF;;;;;;;;GAQG;AACH,MAAM,UAAU,qBAAqB,CAAC,KAAiC;IACrE,IAAI,MAAgB,CAAC;IAErB,eAAe;IACf,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,IAAI,mBAAmB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YACpC,MAAM,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;QACpC,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,KAAK,CAAC;QACjB,CAAC;IACH,CAAC;IACD,6BAA6B;SACxB,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAC9B,MAAM,UAAU,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC,CAAC;QACpE,MAAM,GAAG,UAAU,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAC,GAAG,EAAE,UAAU,EAAC,CAAC;IACvE,CAAC;IACD,SAAS;SACJ,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACrD,gDAAgD;QAChD,IAAI,oBAAoB,CAAC,KAAK,CAAC,EAAE,CAAC;YAChC,MAAM,GAAG,KAAiB,CAAC;QAC7B,CAAC;QACD,iBAAiB;aACZ,IAAI,IAAI,IAAI,KAAK,EAAE,CAAC;YACvB,MAAM,GAAG,KAAqB,CAAC;QACjC,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,KAAK,CAAC,gCAAgC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC3E,CAAC;IACH,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,KAAK,CAAC,gCAAgC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC3E,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,IAAc;IAC5C,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC1C,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,EAAE,CAAC;QAC7F,OAAQ,IAAqB,CAAC,EAAE,CAAC;IACnC,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { PathExpr } from './PropertyPathExpr.js';
|
|
2
|
+
/**
|
|
3
|
+
* Collect all full IRIs from a PathExpr AST.
|
|
4
|
+
* Returns IRIs that need PREFIX declarations (full URIs from string refs
|
|
5
|
+
* containing `://` and from `{id}` refs). Does not collect prefixed-name
|
|
6
|
+
* string refs since those are already in prefix:local form.
|
|
7
|
+
*/
|
|
8
|
+
export declare function collectPathUris(expr: PathExpr): string[];
|
|
9
|
+
/**
|
|
10
|
+
* Render a PathExpr to SPARQL property path syntax.
|
|
11
|
+
* Handles all forms including negatedPropertySet.
|
|
12
|
+
* Adds parentheses only when needed for correct precedence.
|
|
13
|
+
*/
|
|
14
|
+
export declare function pathExprToSparql(expr: PathExpr): string;
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
3
|
+
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
4
|
+
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
5
|
+
*/
|
|
6
|
+
import { isPathRef } from './PropertyPathExpr.js';
|
|
7
|
+
import { formatUri } from '../sparql/sparqlUtils.js';
|
|
8
|
+
// ---------------------------------------------------------------------------
|
|
9
|
+
// Precedence levels (higher = tighter binding)
|
|
10
|
+
// ---------------------------------------------------------------------------
|
|
11
|
+
const PREC_ALT = 1;
|
|
12
|
+
const PREC_SEQ = 2;
|
|
13
|
+
const PREC_UNARY = 3;
|
|
14
|
+
const PREC_PRIMARY = 4;
|
|
15
|
+
function refToSparql(ref) {
|
|
16
|
+
if (typeof ref === 'string') {
|
|
17
|
+
// If it looks like a full IRI (contains ://), use formatUri for prefix shortening
|
|
18
|
+
if (ref.includes('://'))
|
|
19
|
+
return formatUri(ref);
|
|
20
|
+
// Otherwise treat as prefixed name (already in prefix:local form)
|
|
21
|
+
return ref;
|
|
22
|
+
}
|
|
23
|
+
// {id} refs always contain full IRIs — use formatUri for prefix shortening
|
|
24
|
+
return formatUri(ref.id);
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Collect all full IRIs from a PathExpr AST.
|
|
28
|
+
* Returns IRIs that need PREFIX declarations (full URIs from string refs
|
|
29
|
+
* containing `://` and from `{id}` refs). Does not collect prefixed-name
|
|
30
|
+
* string refs since those are already in prefix:local form.
|
|
31
|
+
*/
|
|
32
|
+
export function collectPathUris(expr) {
|
|
33
|
+
const uris = [];
|
|
34
|
+
walkPathExpr(expr, uris);
|
|
35
|
+
return uris;
|
|
36
|
+
}
|
|
37
|
+
function collectRef(ref, uris) {
|
|
38
|
+
if (typeof ref === 'string') {
|
|
39
|
+
if (ref.includes('://'))
|
|
40
|
+
uris.push(ref);
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
uris.push(ref.id);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
function walkPathExpr(expr, uris) {
|
|
47
|
+
if (isPathRef(expr)) {
|
|
48
|
+
collectRef(expr, uris);
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
if ('seq' in expr) {
|
|
52
|
+
for (const e of expr.seq)
|
|
53
|
+
walkPathExpr(e, uris);
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
if ('alt' in expr) {
|
|
57
|
+
for (const e of expr.alt)
|
|
58
|
+
walkPathExpr(e, uris);
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
if ('inv' in expr) {
|
|
62
|
+
walkPathExpr(expr.inv, uris);
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
if ('zeroOrMore' in expr) {
|
|
66
|
+
walkPathExpr(expr.zeroOrMore, uris);
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
if ('oneOrMore' in expr) {
|
|
70
|
+
walkPathExpr(expr.oneOrMore, uris);
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
if ('zeroOrOne' in expr) {
|
|
74
|
+
walkPathExpr(expr.zeroOrOne, uris);
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
if ('negatedPropertySet' in expr) {
|
|
78
|
+
for (const item of expr.negatedPropertySet) {
|
|
79
|
+
if (typeof item === 'string' || (typeof item === 'object' && 'id' in item && !('inv' in item))) {
|
|
80
|
+
collectRef(item, uris);
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
collectRef(item.inv, uris);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Render a PathExpr to SPARQL property path syntax.
|
|
90
|
+
* Handles all forms including negatedPropertySet.
|
|
91
|
+
* Adds parentheses only when needed for correct precedence.
|
|
92
|
+
*/
|
|
93
|
+
export function pathExprToSparql(expr) {
|
|
94
|
+
return renderExpr(expr, 0);
|
|
95
|
+
}
|
|
96
|
+
function renderExpr(expr, parentPrec) {
|
|
97
|
+
if (isPathRef(expr)) {
|
|
98
|
+
return refToSparql(expr);
|
|
99
|
+
}
|
|
100
|
+
if ('seq' in expr) {
|
|
101
|
+
const inner = expr.seq.map((e) => renderExpr(e, PREC_SEQ)).join('/');
|
|
102
|
+
return parentPrec > PREC_SEQ ? `(${inner})` : inner;
|
|
103
|
+
}
|
|
104
|
+
if ('alt' in expr) {
|
|
105
|
+
const inner = expr.alt.map((e) => renderExpr(e, PREC_ALT)).join('|');
|
|
106
|
+
return parentPrec > PREC_ALT ? `(${inner})` : inner;
|
|
107
|
+
}
|
|
108
|
+
if ('inv' in expr) {
|
|
109
|
+
return `^${renderExpr(expr.inv, PREC_UNARY)}`;
|
|
110
|
+
}
|
|
111
|
+
if ('zeroOrMore' in expr) {
|
|
112
|
+
return `${renderExpr(expr.zeroOrMore, PREC_PRIMARY)}*`;
|
|
113
|
+
}
|
|
114
|
+
if ('oneOrMore' in expr) {
|
|
115
|
+
return `${renderExpr(expr.oneOrMore, PREC_PRIMARY)}+`;
|
|
116
|
+
}
|
|
117
|
+
if ('zeroOrOne' in expr) {
|
|
118
|
+
return `${renderExpr(expr.zeroOrOne, PREC_PRIMARY)}?`;
|
|
119
|
+
}
|
|
120
|
+
if ('negatedPropertySet' in expr) {
|
|
121
|
+
const items = expr.negatedPropertySet.map((item) => {
|
|
122
|
+
if (typeof item === 'string' || (typeof item === 'object' && 'id' in item && !('inv' in item))) {
|
|
123
|
+
return refToSparql(item);
|
|
124
|
+
}
|
|
125
|
+
const invItem = item;
|
|
126
|
+
return `^${refToSparql(invItem.inv)}`;
|
|
127
|
+
});
|
|
128
|
+
return items.length === 1 ? `!${items[0]}` : `!(${items.join('|')})`;
|
|
129
|
+
}
|
|
130
|
+
throw new Error(`Unknown PathExpr shape: ${JSON.stringify(expr)}`);
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=pathExprToSparql.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pathExprToSparql.js","sourceRoot":"","sources":["../../../src/paths/pathExprToSparql.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { PathExpr } from './PropertyPathExpr.js';
|
|
2
|
+
export type SHACLTriple = {
|
|
3
|
+
subject: string;
|
|
4
|
+
predicate: string;
|
|
5
|
+
object: string;
|
|
6
|
+
};
|
|
7
|
+
export type SHACLPathResult = {
|
|
8
|
+
/** The root node of the serialized path (IRI or blank node id). */
|
|
9
|
+
root: string;
|
|
10
|
+
/** Additional triples needed to describe the path structure. */
|
|
11
|
+
triples: SHACLTriple[];
|
|
12
|
+
};
|
|
13
|
+
/** Reset blank node counter (for deterministic testing). */
|
|
14
|
+
export declare function resetBlankNodeCounter(): void;
|
|
15
|
+
/**
|
|
16
|
+
* Serialize a PathExpr to SHACL RDF triples.
|
|
17
|
+
*
|
|
18
|
+
* - Simple PathRef → direct IRI (no extra triples)
|
|
19
|
+
* - Complex paths → blank nodes with SHACL path vocabulary
|
|
20
|
+
* - negatedPropertySet → throws (not supported by SHACL)
|
|
21
|
+
*/
|
|
22
|
+
export declare function serializePathToSHACL(expr: PathExpr): SHACLPathResult;
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
3
|
+
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
4
|
+
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
5
|
+
*/
|
|
6
|
+
import { isPathRef } from './PropertyPathExpr.js';
|
|
7
|
+
// ---------------------------------------------------------------------------
|
|
8
|
+
// Constants
|
|
9
|
+
// ---------------------------------------------------------------------------
|
|
10
|
+
const SH = 'http://www.w3.org/ns/shacl#';
|
|
11
|
+
const RDF = 'http://www.w3.org/1999/02/22-rdf-syntax-ns#';
|
|
12
|
+
const SH_ALTERNATIVE_PATH = `${SH}alternativePath`;
|
|
13
|
+
const SH_INVERSE_PATH = `${SH}inversePath`;
|
|
14
|
+
const SH_ZERO_OR_MORE_PATH = `${SH}zeroOrMorePath`;
|
|
15
|
+
const SH_ONE_OR_MORE_PATH = `${SH}oneOrMorePath`;
|
|
16
|
+
const SH_ZERO_OR_ONE_PATH = `${SH}zeroOrOnePath`;
|
|
17
|
+
const RDF_FIRST = `${RDF}first`;
|
|
18
|
+
const RDF_REST = `${RDF}rest`;
|
|
19
|
+
const RDF_NIL = `${RDF}nil`;
|
|
20
|
+
// ---------------------------------------------------------------------------
|
|
21
|
+
// Serializer
|
|
22
|
+
// ---------------------------------------------------------------------------
|
|
23
|
+
let blankNodeCounter = 0;
|
|
24
|
+
/** Reset blank node counter (for deterministic testing). */
|
|
25
|
+
export function resetBlankNodeCounter() {
|
|
26
|
+
blankNodeCounter = 0;
|
|
27
|
+
}
|
|
28
|
+
function freshBlankNode() {
|
|
29
|
+
return `_:b${blankNodeCounter++}`;
|
|
30
|
+
}
|
|
31
|
+
function refToIri(ref) {
|
|
32
|
+
if (typeof ref === 'string')
|
|
33
|
+
return ref;
|
|
34
|
+
return ref.id;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Serialize a PathExpr to SHACL RDF triples.
|
|
38
|
+
*
|
|
39
|
+
* - Simple PathRef → direct IRI (no extra triples)
|
|
40
|
+
* - Complex paths → blank nodes with SHACL path vocabulary
|
|
41
|
+
* - negatedPropertySet → throws (not supported by SHACL)
|
|
42
|
+
*/
|
|
43
|
+
export function serializePathToSHACL(expr) {
|
|
44
|
+
const triples = [];
|
|
45
|
+
const serialize = (e) => {
|
|
46
|
+
// Simple ref → IRI directly
|
|
47
|
+
if (isPathRef(e)) {
|
|
48
|
+
return refToIri(e);
|
|
49
|
+
}
|
|
50
|
+
// Sequence → RDF list
|
|
51
|
+
if ('seq' in e) {
|
|
52
|
+
return buildRdfList(e.seq, triples);
|
|
53
|
+
}
|
|
54
|
+
// Alternative → sh:alternativePath with RDF list
|
|
55
|
+
if ('alt' in e) {
|
|
56
|
+
const bnode = freshBlankNode();
|
|
57
|
+
const listRoot = buildRdfList(e.alt, triples);
|
|
58
|
+
triples.push({ subject: bnode, predicate: SH_ALTERNATIVE_PATH, object: listRoot });
|
|
59
|
+
return bnode;
|
|
60
|
+
}
|
|
61
|
+
// Inverse → sh:inversePath
|
|
62
|
+
if ('inv' in e) {
|
|
63
|
+
const bnode = freshBlankNode();
|
|
64
|
+
const inner = serialize(e.inv);
|
|
65
|
+
triples.push({ subject: bnode, predicate: SH_INVERSE_PATH, object: inner });
|
|
66
|
+
return bnode;
|
|
67
|
+
}
|
|
68
|
+
// zeroOrMore → sh:zeroOrMorePath
|
|
69
|
+
if ('zeroOrMore' in e) {
|
|
70
|
+
const bnode = freshBlankNode();
|
|
71
|
+
const inner = serialize(e.zeroOrMore);
|
|
72
|
+
triples.push({ subject: bnode, predicate: SH_ZERO_OR_MORE_PATH, object: inner });
|
|
73
|
+
return bnode;
|
|
74
|
+
}
|
|
75
|
+
// oneOrMore → sh:oneOrMorePath
|
|
76
|
+
if ('oneOrMore' in e) {
|
|
77
|
+
const bnode = freshBlankNode();
|
|
78
|
+
const inner = serialize(e.oneOrMore);
|
|
79
|
+
triples.push({ subject: bnode, predicate: SH_ONE_OR_MORE_PATH, object: inner });
|
|
80
|
+
return bnode;
|
|
81
|
+
}
|
|
82
|
+
// zeroOrOne → sh:zeroOrOnePath
|
|
83
|
+
if ('zeroOrOne' in e) {
|
|
84
|
+
const bnode = freshBlankNode();
|
|
85
|
+
const inner = serialize(e.zeroOrOne);
|
|
86
|
+
triples.push({ subject: bnode, predicate: SH_ZERO_OR_ONE_PATH, object: inner });
|
|
87
|
+
return bnode;
|
|
88
|
+
}
|
|
89
|
+
// negatedPropertySet → not supported in SHACL
|
|
90
|
+
if ('negatedPropertySet' in e) {
|
|
91
|
+
throw new Error('negatedPropertySet cannot be serialized to SHACL sh:path. ' +
|
|
92
|
+
'This path form is valid in SPARQL but has no SHACL representation.');
|
|
93
|
+
}
|
|
94
|
+
throw new Error(`Unknown PathExpr shape: ${JSON.stringify(e)}`);
|
|
95
|
+
};
|
|
96
|
+
/**
|
|
97
|
+
* Build an RDF list from an array of PathExpr elements.
|
|
98
|
+
* Returns the root blank node of the list.
|
|
99
|
+
*/
|
|
100
|
+
function buildRdfList(items, out) {
|
|
101
|
+
if (items.length === 0)
|
|
102
|
+
return RDF_NIL;
|
|
103
|
+
let current = freshBlankNode();
|
|
104
|
+
const root = current;
|
|
105
|
+
for (let i = 0; i < items.length; i++) {
|
|
106
|
+
const itemNode = serialize(items[i]);
|
|
107
|
+
out.push({ subject: current, predicate: RDF_FIRST, object: itemNode });
|
|
108
|
+
if (i === items.length - 1) {
|
|
109
|
+
out.push({ subject: current, predicate: RDF_REST, object: RDF_NIL });
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
const next = freshBlankNode();
|
|
113
|
+
out.push({ subject: current, predicate: RDF_REST, object: next });
|
|
114
|
+
current = next;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
return root;
|
|
118
|
+
}
|
|
119
|
+
const root = serialize(expr);
|
|
120
|
+
return { root, triples };
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=serializePathToSHACL.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serializePathToSHACL.js","sourceRoot":"","sources":["../../../src/paths/serializePathToSHACL.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,6 +2,7 @@ import { JSNonNullPrimitive, SortByPath, WhereMethods, WherePath } from './Selec
|
|
|
2
2
|
import { NodeReferenceValue, ShapeReferenceValue } from './QueryFactory.js';
|
|
3
3
|
import type { FieldSetEntry } from './FieldSet.js';
|
|
4
4
|
import { ExpressionNode } from '../expressions/ExpressionNode.js';
|
|
5
|
+
import type { PathExpr } from '../paths/PropertyPathExpr.js';
|
|
5
6
|
/**
|
|
6
7
|
* Pipeline input type — accepts FieldSet entries directly.
|
|
7
8
|
*/
|
|
@@ -35,6 +36,7 @@ export type RawSelectInput = {
|
|
|
35
36
|
export type DesugaredPropertyStep = {
|
|
36
37
|
kind: 'property_step';
|
|
37
38
|
propertyShapeId: string;
|
|
39
|
+
pathExpr?: PathExpr;
|
|
38
40
|
where?: DesugaredWhere;
|
|
39
41
|
};
|
|
40
42
|
export type DesugaredCountStep = {
|
|
@@ -1,13 +1,20 @@
|
|
|
1
1
|
import { isWhereEvaluationPath, } from './SelectQuery.js';
|
|
2
|
+
import { isComplexPathExpr } from '../paths/PropertyPathExpr.js';
|
|
2
3
|
const isShapeRef = (value) => !!value && typeof value === 'object' && 'id' in value && 'shape' in value;
|
|
3
4
|
const isNodeRef = (value) => typeof value === 'object' && value !== null && 'id' in value;
|
|
4
5
|
/**
|
|
5
6
|
* Convert PropertyShape segments to DesugaredPropertyStep[].
|
|
6
7
|
*/
|
|
7
|
-
const segmentsToSteps = (segments) => segments.map((seg) =>
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
8
|
+
const segmentsToSteps = (segments) => segments.map((seg) => {
|
|
9
|
+
const step = {
|
|
10
|
+
kind: 'property_step',
|
|
11
|
+
propertyShapeId: seg.id,
|
|
12
|
+
};
|
|
13
|
+
if (seg.path && isComplexPathExpr(seg.path)) {
|
|
14
|
+
step.pathExpr = seg.path;
|
|
15
|
+
}
|
|
16
|
+
return step;
|
|
17
|
+
});
|
|
11
18
|
/**
|
|
12
19
|
* Convert a FieldSetEntry directly to a DesugaredSelection.
|
|
13
20
|
*/
|
|
@@ -54,6 +61,9 @@ const desugarEntry = (entry) => {
|
|
|
54
61
|
kind: 'property_step',
|
|
55
62
|
propertyShapeId: segment.id,
|
|
56
63
|
};
|
|
64
|
+
if (segment.path && isComplexPathExpr(segment.path)) {
|
|
65
|
+
step.pathExpr = segment.path;
|
|
66
|
+
}
|
|
57
67
|
if (entry.scopedFilter && i === segments.length - 1) {
|
|
58
68
|
step.where = toWhere(entry.scopedFilter);
|
|
59
69
|
}
|
|
@@ -222,10 +232,16 @@ const toSortBy = (query) => {
|
|
|
222
232
|
direction: query.sortBy.direction,
|
|
223
233
|
paths: query.sortBy.paths.map((path) => ({
|
|
224
234
|
kind: 'selection_path',
|
|
225
|
-
steps: path.segments.map((seg) =>
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
235
|
+
steps: path.segments.map((seg) => {
|
|
236
|
+
const step = {
|
|
237
|
+
kind: 'property_step',
|
|
238
|
+
propertyShapeId: seg.id,
|
|
239
|
+
};
|
|
240
|
+
if (seg.path && isComplexPathExpr(seg.path)) {
|
|
241
|
+
step.pathExpr = seg.path;
|
|
242
|
+
}
|
|
243
|
+
return step;
|
|
244
|
+
}),
|
|
229
245
|
})),
|
|
230
246
|
};
|
|
231
247
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IRDesugar.js","sourceRoot":"","sources":["../../../src/queries/IRDesugar.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,qBAAqB,GAUtB,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"IRDesugar.js","sourceRoot":"","sources":["../../../src/queries/IRDesugar.ts"],"names":[],"mappings":"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"}
|
|
@@ -32,18 +32,22 @@ class LoweringContext {
|
|
|
32
32
|
nextAlias() {
|
|
33
33
|
return `a${this.counter++}`;
|
|
34
34
|
}
|
|
35
|
-
getOrCreateTraversal(fromAlias, propertyShapeId) {
|
|
35
|
+
getOrCreateTraversal(fromAlias, propertyShapeId, pathExpr) {
|
|
36
36
|
const key = `${fromAlias}:${propertyShapeId}`;
|
|
37
37
|
const existing = this.traverseMap.get(key);
|
|
38
38
|
if (existing)
|
|
39
39
|
return existing;
|
|
40
40
|
const toAlias = this.nextAlias();
|
|
41
|
-
|
|
41
|
+
const pattern = {
|
|
42
42
|
kind: 'traverse',
|
|
43
43
|
from: fromAlias,
|
|
44
44
|
to: toAlias,
|
|
45
45
|
property: propertyShapeId,
|
|
46
|
-
}
|
|
46
|
+
};
|
|
47
|
+
if (pathExpr) {
|
|
48
|
+
pattern.pathExpr = pathExpr;
|
|
49
|
+
}
|
|
50
|
+
this.patterns.push(pattern);
|
|
47
51
|
this.traverseMap.set(key, toAlias);
|
|
48
52
|
return toAlias;
|
|
49
53
|
}
|
|
@@ -173,7 +177,7 @@ export const lowerSelectQuery = (canonical) => {
|
|
|
173
177
|
const ctx = new LoweringContext();
|
|
174
178
|
const pathOptions = {
|
|
175
179
|
rootAlias: ctx.rootAlias,
|
|
176
|
-
resolveTraversal: (fromAlias, propertyShapeId) => ctx.getOrCreateTraversal(fromAlias, propertyShapeId),
|
|
180
|
+
resolveTraversal: (fromAlias, propertyShapeId, pathExpr) => ctx.getOrCreateTraversal(fromAlias, propertyShapeId, pathExpr),
|
|
177
181
|
};
|
|
178
182
|
const root = {
|
|
179
183
|
kind: 'shape_scan',
|
|
@@ -184,7 +188,7 @@ export const lowerSelectQuery = (canonical) => {
|
|
|
184
188
|
let currentAlias = pathOptions.rootAlias;
|
|
185
189
|
for (const step of steps) {
|
|
186
190
|
if (step.kind === 'property_step') {
|
|
187
|
-
currentAlias = pathOptions.resolveTraversal(currentAlias, step.propertyShapeId);
|
|
191
|
+
currentAlias = pathOptions.resolveTraversal(currentAlias, step.propertyShapeId, step.pathExpr);
|
|
188
192
|
}
|
|
189
193
|
}
|
|
190
194
|
return currentAlias;
|