@_linked/core 2.31.0 → 2.33.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.
Files changed (43) hide show
  1. package/CHANGELOG.md +38 -0
  2. package/README.md +61 -61
  3. package/lib/esm/index.d.ts +1 -0
  4. package/lib/esm/index.js.map +1 -1
  5. package/lib/esm/ontologies/linked-core.d.ts +1 -0
  6. package/lib/esm/ontologies/linked-core.js +8 -2
  7. package/lib/esm/ontologies/linked-core.js.map +1 -1
  8. package/lib/esm/ontologies/shacl.d.ts +3 -0
  9. package/lib/esm/ontologies/shacl.js +6 -0
  10. package/lib/esm/ontologies/shacl.js.map +1 -1
  11. package/lib/esm/shapes/List.class.d.ts +3 -3
  12. package/lib/esm/shapes/List.class.js +3 -3
  13. package/lib/esm/shapes/List.class.js.map +1 -1
  14. package/lib/esm/shapes/PathList.d.ts +5 -8
  15. package/lib/esm/shapes/PathList.js +6 -9
  16. package/lib/esm/shapes/PathList.js.map +1 -1
  17. package/lib/esm/shapes/PathNode.d.ts +1 -3
  18. package/lib/esm/shapes/PathNode.js +6 -8
  19. package/lib/esm/shapes/PathNode.js.map +1 -1
  20. package/lib/esm/shapes/SHACL.d.ts +15 -13
  21. package/lib/esm/shapes/SHACL.js +8 -0
  22. package/lib/esm/shapes/SHACL.js.map +1 -1
  23. package/lib/esm/shapes/nodeShapeData.d.ts +4 -1
  24. package/lib/esm/shapes/nodeShapeData.js.map +1 -1
  25. package/lib/esm/shapes/singleOwnerConstraint.d.ts +5 -7
  26. package/lib/esm/shapes/singleOwnerConstraint.js +65 -21
  27. package/lib/esm/shapes/singleOwnerConstraint.js.map +1 -1
  28. package/lib/esm/shapes/syncShapes.d.ts +54 -3
  29. package/lib/esm/shapes/syncShapes.js +141 -13
  30. package/lib/esm/shapes/syncShapes.js.map +1 -1
  31. package/lib/esm/sparql/irToAlgebra.d.ts +15 -38
  32. package/lib/esm/sparql/irToAlgebra.js +406 -391
  33. package/lib/esm/sparql/irToAlgebra.js.map +1 -1
  34. package/lib/esm/sparql/ownedLinkCheck.d.ts +6 -10
  35. package/lib/esm/sparql/ownedLinkCheck.js +10 -11
  36. package/lib/esm/sparql/ownedLinkCheck.js.map +1 -1
  37. package/lib/esm/utils/Package.d.ts +3 -2
  38. package/lib/esm/utils/Package.js +21 -8
  39. package/lib/esm/utils/Package.js.map +1 -1
  40. package/lib/esm/utils/sha256.d.ts +8 -0
  41. package/lib/esm/utils/sha256.js +80 -0
  42. package/lib/esm/utils/sha256.js.map +1 -0
  43. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"irToAlgebra.js","sourceRoot":"","sources":["../../../src/sparql/irToAlgebra.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n IRSelectQuery,\n IRAskQuery,\n IRCountQuery,\n IRCreateMutation,\n IRUpdateMutation,\n IRUpsertMutation,\n IRDeleteMutation,\n IRDeleteAllMutation,\n IRDeleteWhereMutation,\n IRUpdateWhereMutation,\n IRGraphPattern,\n IRExpression,\n IRFieldValue,\n IRNodeData,\n IRSetModificationValue,\n IRTraversePattern,\n} from '../queries/IntermediateRepresentation.js';\nimport {findPropertyShapeById, getPropertyShapes} from '../shapes/nodeShapeData.js';\nimport type {PropertyShapeData} from '../shapes/nodeShapeData.js';\nimport type {NodeReferenceValue} from '../utils/NodeReference.js';\nimport {pathExprToSparql, collectPathUris} from '../paths/pathExprToSparql.js';\nimport type {PathExpr} from '../paths/PropertyPathExpr.js';\nimport type {\n SparqlSelectPlan,\n SparqlAskPlan,\n SparqlInsertDataPlan,\n SparqlDeleteInsertPlan,\n SparqlAlgebraNode,\n SparqlBGP,\n SparqlTriple,\n SparqlTerm,\n SparqlExpression,\n SparqlProjectionItem,\n SparqlOrderCondition,\n SparqlAggregateBinding,\n SparqlAggregateExpr,\n SparqlLeftJoin,\n SparqlFilter,\n} from './SparqlAlgebra.js';\nimport {type SparqlOptions, generateEntityUri} from './sparqlUtils.js';\nimport {\n selectPlanToSparql,\n askPlanToSparql,\n insertDataPlanToSparql,\n deleteInsertPlanToSparql,\n} from './algebraToString.js';\nimport {rdf} from '../ontologies/rdf.js';\nimport {shacl} from '../ontologies/shacl.js';\nimport {xsd} from '../ontologies/xsd.js';\nimport {getSimplePathId} from '../paths/normalizePropertyPath.js';\nimport {\n getAllNodeShapes,\n getNodeShape,\n getRegistryVersion,\n getShapeClass,\n getSubShapes,\n getTargetClassId,\n} from '../utils/ShapeClass.js';\nimport {UnresolvedContextError} from '../queries/QueryContext.js';\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst RDF_TYPE = rdf.type.id;\nconst XSD_DATETIME = xsd.dateTime.id;\nconst XSD_DATE = xsd.date.id;\nconst XSD_TIME = xsd.time.id;\nconst XSD_BOOLEAN = xsd.boolean.id;\nconst XSD_INTEGER = xsd.integer.id;\nconst XSD_DOUBLE = xsd.double.id;\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/**\n * The IRI terms of triples (subjects, objects, ids of mutations and `.for()` targets) are built\n * here, so this is where a blank-node label used as an id is refused: `_:b0` is SPARQL /\n * N-Triples blank-node syntax, never an IRI (an IRI scheme starts with a letter). Filter\n * expressions build their IRIs separately (`iri_expr`) and are not checked.\n */\nfunction iriTerm(value: string): SparqlTerm {\n if (typeof value === 'string' && value.startsWith('_:')) {\n throw new Error(\n `${JSON.stringify(value)} is a blank-node label, not an IRI. A blank node has no id to ` +\n `address it by: it cannot be linked, updated with update().for() or deleted by id. ` +\n `Change it through the property that holds it (replace or unset that property, or ` +\n `delete its owner).`,\n );\n }\n return {kind: 'iri', value};\n}\n\nfunction varTerm(name: string): SparqlTerm {\n return {kind: 'variable', name};\n}\n\nfunction literalTerm(value: string, datatype?: string): SparqlTerm {\n if (datatype) {\n return {kind: 'literal', value, datatype};\n }\n return {kind: 'literal', value};\n}\n\nfunction tripleOf(\n subject: SparqlTerm,\n predicate: SparqlTerm,\n object: SparqlTerm,\n): SparqlTriple {\n return {subject, predicate, object};\n}\n\n/**\n * Resolve the shape a query scans to the IRI written and matched as its `rdf:type`.\n *\n * That IRI is the shape's declared `targetClass` — a node in its own right, which in\n * a real dataset carries `rdf:type rdfs:Class`. `targetClass` is read off the shape\n * *class*, so JavaScript static inheritance already walks the superclass chain: a\n * subclass that declares none inherits its parent's.\n *\n * A temporary (`linked://tmp/`) targetClass is honoured like any other. It is a real,\n * separate node — just one whose IRI has not been finalised — and it round-trips\n * consistently through both the scan and the create side.\n *\n * **A shape with no targetClass anywhere in its chain throws.** It used to fall back\n * to the shape's *own* IRI, which typed instances as the shape that describes them —\n * conflating a class with its description, and silently disagreeing with the declared\n * `targetClass` whenever that was still temporary.\n */\nfunction resolveShapeScanIri(shapeId: string): string {\n // `getTargetClassId` reads the METAMODEL registry as well as the class registry, and\n // walks `extends` for a data-only shape — reading only `getShapeClass(...)` here made\n // `SelectBuilder.from(dataOnlyIri)` resolve, build an IR, and then die at this line.\n const targetClassId = getTargetClassId(shapeId);\n if (!targetClassId) {\n throw new Error(\n `Cannot resolve an rdf:type for shape \"${shapeId}\": no targetClass is declared ` +\n 'on it or on any shape it extends. Declare one — `static targetClass = ' +\n \"{id: 'https://example.org/Person'}` — pointing at the class node instances are \" +\n 'typed with. The shape\\'s own IRI is not a substitute: it identifies the ' +\n 'description, not the class being described.',\n );\n }\n return targetClassId;\n}\n\n/**\n * Resolve a SHACL property-shape id to the predicate term used in a triple.\n *\n * - Simple single-IRI path → `{kind:'iri'}` (byte-for-byte unchanged behaviour).\n * - Structured path (sequence / inverse / alternative / …) → `{kind:'path'}` built from the property\n * shape's `sh:path`, reusing the same `pathExprToSparql` / `collectPathUris` machinery as the\n * inline-`pathExpr` branches. Without this, structured named-property paths collapsed to a shadow IRI\n * that matched nothing.\n * - No matching property shape at all → `{kind:'iri'}` of the id as given (nothing\n * better is knowable; the caller passed an id no registered shape declares).\n */\n// Memoizes resolved predicate terms across the many call sites that resolve the\n// same property. Guarded by the shape-registry size so it self-invalidates when\n// new shapes register (e.g. across test-file module instances). Only successful\n// resolutions are cached — a not-found fallback is never stored, so a predicate\n// resolved before its shape registers can still resolve correctly afterwards.\nconst predicateTermCache = new Map<string, SparqlTerm>();\nlet predicateTermCacheSize = -1;\n\n/**\n * The `sh:datatype` declared for a property, if any. Lets the serializer emit the\n * term the shape asks for rather than one inferred from the JavaScript value: a\n * numeric property gets the numeric type it declares, and an `xsd:date` /\n * `xsd:time` property its own lexical form instead of a full timestamp.\n */\nfunction resolvePropertyDatatype(propertyId: string): string | undefined {\n return findPropertyShapeById(propertyId)?.datatype?.id;\n}\n\nfunction resolvePropertyPredicateTerm(propertyId: string): SparqlTerm {\n const version = getRegistryVersion();\n if (version !== predicateTermCacheSize) {\n predicateTermCache.clear();\n predicateTermCacheSize = version;\n }\n const cached = predicateTermCache.get(propertyId);\n if (cached) return cached;\n\n const propertyShape = findPropertyShapeById(propertyId);\n if (propertyShape) {\n const simplePathId = getSimplePathId(propertyShape.path);\n let term: SparqlTerm;\n if (simplePathId !== null) {\n // Simple single-IRI path: the declared `sh:path` IS the predicate. There is\n // no fallback to the property shape's own IRI — that identifies the\n // *description* of the property, not the property itself.\n term = iriTerm(simplePathId);\n } else {\n // Structured sh:path — emit a property-path predicate instead of a shadow IRI.\n term = {\n kind: 'path',\n value: pathExprToSparql(propertyShape.path),\n uris: collectPathUris(propertyShape.path),\n };\n }\n predicateTermCache.set(propertyId, term);\n return term;\n }\n return iriTerm(propertyId);\n}\n\n/**\n * Resolve the predicate term for a traversal/property node: a structured\n * property-path when an explicit `pathExpr` is present, otherwise the\n * registry-resolved predicate for `property`. Centralizes the invariant that\n * these two branches stay in lockstep across every triple-building site.\n */\nfunction buildPredicateTerm(spec: {pathExpr?: PathExpr; property: string}): SparqlTerm {\n return spec.pathExpr\n ? {\n kind: 'path',\n value: pathExprToSparql(spec.pathExpr),\n uris: collectPathUris(spec.pathExpr),\n }\n : resolvePropertyPredicateTerm(spec.property);\n}\n\n/** Produce variable name suffix from the last segment of a property URI. */\nfunction propertySuffix(propertyUri: string): string {\n const hashIdx = propertyUri.lastIndexOf('#');\n if (hashIdx >= 0) return propertyUri.substring(hashIdx + 1);\n const slashIdx = propertyUri.lastIndexOf('/');\n return slashIdx >= 0 ? propertyUri.substring(slashIdx + 1) : propertyUri;\n}\n\n/**\n * Sanitize a string so it's valid in a SPARQL variable name.\n * Replaces any non-alphanumeric/underscore characters with underscores.\n */\nfunction sanitizeVarName(name: string): string {\n return name.replace(/[^A-Za-z0-9_]/g, '_');\n}\n\nconst IR_EXPRESSION_KINDS = new Set([\n 'literal_expr', 'property_expr', 'binary_expr', 'logical_expr',\n 'not_expr', 'function_expr', 'aggregate_expr', 'reference_expr',\n 'alias_expr', 'context_property_expr', 'exists_expr', 'in_expr',\n]);\n\nfunction isIRExpression(value: unknown): value is IRExpression {\n return !!value && typeof value === 'object' && 'kind' in value &&\n typeof (value as {kind: unknown}).kind === 'string' &&\n IR_EXPRESSION_KINDS.has((value as {kind: string}).kind);\n}\n\n/**\n * Wrap a single node in a LeftJoin, making `right` optional relative to `left`.\n */\nfunction wrapOptional(\n left: SparqlAlgebraNode,\n right: SparqlAlgebraNode,\n): SparqlLeftJoin {\n return {type: 'left_join', left, right};\n}\n\n/**\n * Join two algebra nodes. If left is null, returns right.\n */\nfunction joinNodes(\n left: SparqlAlgebraNode | null,\n right: SparqlAlgebraNode,\n): SparqlAlgebraNode {\n if (!left) return right;\n return {type: 'join', left, right};\n}\n\nfunction bindingKey(alias: string, property: string): string {\n return `${alias}::${property}`;\n}\n\nfunction contextAliasKey(contextIri: string): string {\n return `__ctx__${contextIri}`;\n}\n\n/**\n * Defense-in-depth: a `reference_expr`/`context_property_expr` must arrive here with its\n * IRI already resolved (lowering's `resolveContextRefs` fills it from `contextName`). If it\n * didn't — an unresolved `{@ctx}` reaching the algebra through some path that bypassed\n * resolution — fail with a clear `UnresolvedContextError` instead of an opaque\n * `undefined.substring` crash deeper in URI formatting.\n */\nfunction resolvedContextIri(iri: string | undefined, contextName?: string): string {\n if (iri === undefined) {\n throw new UnresolvedContextError(contextName ?? '<unknown>');\n }\n return iri;\n}\n\nfunction mergeKeySets(...sets: ReadonlySet<string>[]): Set<string> {\n const merged = new Set<string>();\n for (const set of sets) {\n for (const key of set) {\n merged.add(key);\n }\n }\n return merged;\n}\n\nfunction intersectKeySets(sets: ReadonlySet<string>[]): Set<string> {\n if (sets.length === 0) {\n return new Set<string>();\n }\n\n const [first, ...rest] = sets;\n const intersection = new Set(first);\n for (const value of intersection) {\n if (!rest.every((set) => set.has(value))) {\n intersection.delete(value);\n }\n }\n return intersection;\n}\n\n// ---------------------------------------------------------------------------\n// Pattern helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Recursively collects all traversal alias target variables from IR patterns.\n * Used to ensure traversal aliases appear in the SELECT projection for result grouping.\n */\nfunction collectTraversalAliases(patterns: IRGraphPattern[]): string[] {\n const aliases: string[] = [];\n for (const p of patterns) {\n if (p.kind === 'traverse') {\n aliases.push(p.to);\n } else if (p.kind === 'join') {\n aliases.push(...collectTraversalAliases(p.patterns));\n } else if (p.kind === 'optional') {\n aliases.push(...collectTraversalAliases([p.pattern]));\n } else if (p.kind === 'union') {\n for (const branch of p.branches) {\n aliases.push(...collectTraversalAliases([branch]));\n }\n }\n }\n return aliases;\n}\n\nfunction buildTraverseTriple(pattern: IRTraversePattern): SparqlTriple {\n const predicate = buildPredicateTerm(pattern);\n return tripleOf(\n varTerm(pattern.from),\n predicate,\n varTerm(pattern.to),\n );\n}\n\nfunction collectTraversePatternsInOrder(\n patterns: IRGraphPattern[],\n out: IRTraversePattern[] = [],\n): IRTraversePattern[] {\n for (const pattern of patterns) {\n switch (pattern.kind) {\n case 'traverse':\n out.push(pattern);\n break;\n case 'join':\n collectTraversePatternsInOrder(pattern.patterns, out);\n break;\n case 'optional':\n case 'exists':\n collectTraversePatternsInOrder([pattern.pattern], out);\n break;\n case 'union':\n for (const branch of pattern.branches) {\n collectTraversePatternsInOrder([branch], out);\n }\n break;\n case 'shape_scan':\n case 'minus':\n break;\n }\n }\n return out;\n}\n\nfunction collectDirectProjectionAliases(\n query: IRSelectQuery,\n rootAlias: string,\n): Set<string> {\n const aliases = new Set<string>();\n for (const item of query.projection) {\n if (item.expression.kind === 'property_expr') {\n if (item.expression.sourceAlias !== rootAlias) {\n aliases.add(item.expression.sourceAlias);\n }\n } else if (item.expression.kind === 'alias_expr') {\n if (item.expression.alias !== rootAlias) {\n aliases.add(item.expression.alias);\n }\n }\n }\n return aliases;\n}\n\nfunction collectExpressionAliases(\n expr: IRExpression,\n aliases: Set<string>,\n): void {\n switch (expr.kind) {\n case 'property_expr':\n aliases.add(expr.sourceAlias);\n break;\n case 'alias_expr':\n aliases.add(expr.alias);\n break;\n case 'binary_expr':\n collectExpressionAliases(expr.left, aliases);\n collectExpressionAliases(expr.right, aliases);\n break;\n case 'in_expr':\n collectExpressionAliases(expr.value, aliases);\n for (const el of expr.source.list) collectExpressionAliases(el, aliases);\n break;\n case 'logical_expr':\n for (const sub of expr.expressions) {\n collectExpressionAliases(sub, aliases);\n }\n break;\n case 'not_expr':\n collectExpressionAliases(expr.expression, aliases);\n break;\n case 'function_expr':\n case 'aggregate_expr':\n for (const arg of expr.args) {\n collectExpressionAliases(arg, aliases);\n }\n break;\n case 'exists_expr':\n if (expr.filter) {\n collectExpressionAliases(expr.filter, aliases);\n }\n break;\n case 'literal_expr':\n case 'reference_expr':\n case 'context_property_expr':\n break;\n }\n}\n\nfunction markAliasAndAncestors(\n alias: string,\n traversePatternMap: ReadonlyMap<string, IRTraversePattern>,\n target: Set<string>,\n): void {\n let currentAlias: string | undefined = alias;\n while (currentAlias && traversePatternMap.has(currentAlias)) {\n if (target.has(currentAlias)) {\n return;\n }\n target.add(currentAlias);\n currentAlias = traversePatternMap.get(currentAlias)?.from;\n }\n}\n\nfunction collectRequiredTraversalAliases(\n query: IRSelectQuery,\n traversePatternMap: ReadonlyMap<string, IRTraversePattern>,\n): Set<string> {\n const directAliases = new Set<string>();\n\n if (query.where) {\n collectExpressionAliases(query.where, directAliases);\n }\n\n if (query.orderBy) {\n for (const item of query.orderBy) {\n collectExpressionAliases(item.expression, directAliases);\n }\n }\n\n for (const pattern of traversePatternMap.values()) {\n if (pattern.filter) {\n directAliases.add(pattern.to);\n }\n }\n\n const requiredAliases = new Set<string>();\n for (const alias of directAliases) {\n markAliasAndAncestors(alias, traversePatternMap, requiredAliases);\n }\n return requiredAliases;\n}\n\nfunction buildOptionalTraversalSubtree(\n alias: string,\n traversePatternMap: ReadonlyMap<string, IRTraversePattern>,\n childOptionalAliasesByParent: ReadonlyMap<string, string[]>,\n propertyTriplesByAlias: ReadonlyMap<string, SparqlTriple[]>,\n): SparqlAlgebraNode {\n const pattern = traversePatternMap.get(alias);\n if (!pattern) {\n throw new Error(`Missing traverse pattern for alias \"${alias}\"`);\n }\n\n let subtree: SparqlAlgebraNode = {\n type: 'bgp',\n triples: [buildTraverseTriple(pattern)],\n };\n\n for (const propTriple of propertyTriplesByAlias.get(alias) ?? []) {\n subtree = wrapOptional(subtree, {\n type: 'bgp',\n triples: [propTriple],\n });\n }\n\n for (const childAlias of childOptionalAliasesByParent.get(alias) ?? []) {\n subtree = wrapOptional(\n subtree,\n buildOptionalTraversalSubtree(\n childAlias,\n traversePatternMap,\n childOptionalAliasesByParent,\n propertyTriplesByAlias,\n ),\n );\n }\n\n return subtree;\n}\n\n// ---------------------------------------------------------------------------\n// Variable Registry\n// ---------------------------------------------------------------------------\n\n/**\n * Maps (alias, property) → SPARQL variable name.\n * Used to deduplicate variables across traverse and property_expr nodes.\n */\nclass VariableRegistry {\n private map = new Map<string, string>();\n private usedVarNames = new Set<string>();\n\n private key(alias: string, property: string): string {\n return bindingKey(alias, property);\n }\n\n has(alias: string, property: string): boolean {\n return this.map.has(this.key(alias, property));\n }\n\n get(alias: string, property: string): string | undefined {\n return this.map.get(this.key(alias, property));\n }\n\n set(alias: string, property: string, variable: string): void {\n this.map.set(this.key(alias, property), variable);\n this.usedVarNames.add(variable);\n }\n\n getOrCreate(alias: string, property: string): string {\n const existing = this.get(alias, property);\n if (existing) return existing;\n const suffix = propertySuffix(property);\n let varName = `${sanitizeVarName(alias)}_${suffix}`;\n // Deduplicate: if varName is already used by a different (alias, property),\n // append a counter to ensure unique SPARQL variable names\n let counter = 2;\n while (this.usedVarNames.has(varName)) {\n varName = `${sanitizeVarName(alias)}_${suffix}_${counter}`;\n counter++;\n }\n this.set(alias, property, varName);\n return varName;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Aggregate detection\n// ---------------------------------------------------------------------------\n\n/**\n * Checks whether a SparqlExpression tree contains an aggregate sub-expression.\n * Used to route aggregate-containing filters to HAVING instead of FILTER.\n */\nfunction containsAggregate(expr: SparqlExpression): boolean {\n switch (expr.kind) {\n case 'aggregate_expr':\n return true;\n case 'in_expr':\n return containsAggregate(expr.value) || expr.list.some(containsAggregate);\n case 'binary_expr':\n return containsAggregate(expr.left) || containsAggregate(expr.right);\n case 'logical_expr':\n return expr.exprs.some(containsAggregate);\n case 'not_expr':\n return containsAggregate(expr.inner);\n case 'function_expr':\n return expr.args.some(containsAggregate);\n default:\n return false;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Select conversion\n// ---------------------------------------------------------------------------\n\n/**\n * Converts an IRSelectQuery to a SparqlSelectPlan.\n */\nexport function selectToAlgebra(\n query: IRSelectQuery,\n _options?: SparqlOptions,\n): SparqlSelectPlan {\n const registry = new VariableRegistry();\n\n // Promote bindings only when the top-level WHERE would reject rows without\n // them. This keeps human-like SPARQL for null-rejecting filters without\n // over-constraining OR cases that can still match through other branches.\n const requiredPropertyKeys = query.where\n ? collectRequiredBindingKeys(query.where)\n : new Set<string>();\n\n const requiredPropertyTriples: SparqlTriple[] = [];\n // Track property triples that need to be added as OPTIONAL\n const optionalPropertyTriples: SparqlTriple[] = [];\n\n // Track filtered traversals (inline where) — these get their own OPTIONAL blocks\n const filteredTraverseBlocks: Array<{\n traverseTriple: SparqlTriple;\n filter: IRExpression;\n toAlias: string;\n }> = [];\n\n // 1. Root shape scan → BGP with type triple\n if (!query?.root) {\n throw new Error(\n 'selectToAlgebra: query.root is undefined. The query IR is missing its root shape scan. ' +\n 'This usually means the query was built with a null/undefined subject (e.g. getQueryContext returned null).',\n );\n }\n const rootAlias = query.root.alias;\n const shapeUri = query.root.shape;\n const typeTriple = tripleOf(\n varTerm(rootAlias),\n iriTerm(RDF_TYPE),\n iriTerm(resolveShapeScanIri(shapeUri)),\n );\n const requiredTriples: SparqlTriple[] = [typeTriple];\n\n // Track traverse triples (required pattern)\n const traverseTriples: SparqlTriple[] = [];\n const traversePatternsInOrder = collectTraversePatternsInOrder(query.patterns);\n const traversePatternMap = new Map(\n traversePatternsInOrder.map((pattern) => [pattern.to, pattern] as const),\n );\n\n // ── Nested-select inner LIMIT/OFFSET (Option A: single-subject only) ──────\n // A nested select on a related collection may carry an inner LIMIT/OFFSET.\n // A plain SPARQL sub-SELECT is uncorrelated, so its LIMIT bounds GLOBALLY.\n // That only equals per-parent windowing when the outer query targets exactly\n // ONE root subject — then we inline that subject into the sub-SELECT.\n const paginatedTraversePatterns = traversePatternsInOrder.filter(\n (p) =>\n typeof p.innerLimit === 'number' ||\n typeof p.innerOffset === 'number' ||\n (p.innerOrderBy && p.innerOrderBy.length > 0),\n );\n const singleSubjectIri: string | undefined =\n query.subjectId ??\n (query.subjectIds && query.subjectIds.length === 1\n ? query.subjectIds[0]\n : undefined);\n if (paginatedTraversePatterns.length > 0 && !singleSubjectIri) {\n throw new Error(\n 'Inner LIMIT/OFFSET on a nested select is only supported when the outer ' +\n 'query targets a single subject; multi-parent per-group pagination is not ' +\n 'yet implemented.',\n );\n }\n // Only root→child traversals can be inlined against the single subject.\n // A paginated traversal deeper than root→child has a parent collection that is\n // itself multi-valued (effectively multi-parent), so a sub-SELECT LIMIT there\n // would bound globally, not per-parent. Reject it loudly rather than silently\n // dropping the inner limit.\n const deepPaginated = paginatedTraversePatterns.filter((p) => p.from !== rootAlias);\n if (deepPaginated.length > 0) {\n throw new Error(\n 'Inner LIMIT/OFFSET on a nested select is only supported on a direct nested ' +\n 'select of the single root subject; pagination on a deeper (grandchild) ' +\n 'collection is multi-parent and not yet implemented.',\n );\n }\n const subSelectAliases = new Set<string>(\n paginatedTraversePatterns.map((p) => p.to),\n );\n\n // 2. Process patterns → traverse triples, populate variable registry.\n // Skip sub-SELECT-wrapped traversals here — they are emitted separately\n // (their child variable is still registered so projection/optionals work).\n for (const pattern of query.patterns) {\n processPattern(\n pattern,\n registry,\n traverseTriples,\n optionalPropertyTriples,\n filteredTraverseBlocks,\n subSelectAliases,\n );\n }\n\n // 3. Pre-register filter property references BEFORE processing projections.\n // This ensures that property triples needed by inline where filters are\n // co-located inside the filtered OPTIONAL block, not in separate OPTIONALs.\n const filterPropertyTriplesMap = new Map<number, SparqlTriple[]>();\n filteredTraverseBlocks.forEach((block, idx) => {\n const filterPropertyTriples: SparqlTriple[] = [];\n processExpressionForProperties(block.filter, registry, filterPropertyTriples);\n filterPropertyTriplesMap.set(idx, filterPropertyTriples);\n });\n\n // 4. Process projection expressions, where clause, orderBy expressions\n // to discover any additional property_expr references.\n // Properties already registered by inline filters (above) will be skipped.\n for (const item of query.projection) {\n processExpressionForProperties(\n item.expression,\n registry,\n optionalPropertyTriples,\n requiredPropertyTriples,\n requiredPropertyKeys,\n );\n }\n\n if (query.where) {\n processExpressionForProperties(\n query.where,\n registry,\n optionalPropertyTriples,\n requiredPropertyTriples,\n requiredPropertyKeys,\n );\n }\n\n if (query.orderBy) {\n for (const orderItem of query.orderBy) {\n processExpressionForProperties(\n orderItem.expression,\n registry,\n optionalPropertyTriples,\n requiredPropertyTriples,\n requiredPropertyKeys,\n );\n }\n }\n\n const projectedTraversalAliases = new Set<string>();\n const directProjectionAliases = collectDirectProjectionAliases(query, rootAlias);\n for (const alias of directProjectionAliases) {\n markAliasAndAncestors(alias, traversePatternMap, projectedTraversalAliases);\n }\n\n const requiredTraversalAliases = collectRequiredTraversalAliases(\n query,\n traversePatternMap,\n );\n\n const optionalTraversalAliases = new Set(\n [...projectedTraversalAliases].filter((alias) => {\n const pattern = traversePatternMap.get(alias);\n // Lower projection-only traversals into OPTIONAL subtrees regardless of\n // cardinality, so a parent with an empty relationship is preserved (with\n // an empty array / null child) instead of being inner-joined away. The\n // result grouper already collects multiple child bindings into an array.\n //\n // Excluded:\n // - filtered traversals (`.where(...)`) — the filter makes the child required\n // - aliases otherwise required by the query (e.g. used in a top-level filter)\n // - paginated traversals — emitted separately as a sub-SELECT (section 5a),\n // so lowering them here too would double-emit the traverse triple\n return !!pattern &&\n !pattern.filter &&\n !subSelectAliases.has(alias) &&\n !requiredTraversalAliases.has(alias);\n }),\n );\n\n const requiredTraverseTriples = traverseTriples.filter((triple) =>\n !(triple.object.kind === 'variable' &&\n optionalTraversalAliases.has(triple.object.name))\n );\n\n const nestedOptionalPropertyTriplesByAlias = new Map<string, SparqlTriple[]>();\n const topLevelOptionalPropertyTriples: SparqlTriple[] = [];\n // Property triples whose subject is a sub-SELECT child alias must be nested\n // INSIDE the sub-SELECT's OPTIONAL block (keyed by alias), so that ?childVar\n // stays scoped — otherwise an empty window leaves ?childVar unbound and the\n // outer property OPTIONAL leaks across the whole graph.\n const subSelectChildPropertyTriplesByAlias = new Map<string, SparqlTriple[]>();\n // Same scoping rule for filtered traversals (`.where(...)`): anything anchored\n // on the filtered alias must live inside its filtered OPTIONAL block — when\n // the filter matches nothing, the alias is unbound and a top-level OPTIONAL\n // would range over the whole graph.\n const filteredTraverseAliases = new Set(filteredTraverseBlocks.map((b) => b.toAlias));\n const filteredChildPropertyTriplesByAlias = new Map<string, SparqlTriple[]>();\n for (const propTriple of optionalPropertyTriples) {\n if (propTriple.subject.kind === 'variable' &&\n subSelectAliases.has(propTriple.subject.name)) {\n const triples = subSelectChildPropertyTriplesByAlias.get(propTriple.subject.name) ?? [];\n triples.push(propTriple);\n subSelectChildPropertyTriplesByAlias.set(propTriple.subject.name, triples);\n } else if (propTriple.subject.kind === 'variable' &&\n filteredTraverseAliases.has(propTriple.subject.name)) {\n const triples = filteredChildPropertyTriplesByAlias.get(propTriple.subject.name) ?? [];\n triples.push(propTriple);\n filteredChildPropertyTriplesByAlias.set(propTriple.subject.name, triples);\n } else if (propTriple.subject.kind === 'variable' &&\n optionalTraversalAliases.has(propTriple.subject.name)) {\n const triples = nestedOptionalPropertyTriplesByAlias.get(propTriple.subject.name) ?? [];\n triples.push(propTriple);\n nestedOptionalPropertyTriplesByAlias.set(propTriple.subject.name, triples);\n } else {\n topLevelOptionalPropertyTriples.push(propTriple);\n }\n }\n\n const childOptionalAliasesByParent = new Map<string, string[]>();\n for (const pattern of traversePatternsInOrder) {\n if (!optionalTraversalAliases.has(pattern.to)) continue;\n const siblings = childOptionalAliasesByParent.get(pattern.from) ?? [];\n siblings.push(pattern.to);\n childOptionalAliasesByParent.set(pattern.from, siblings);\n }\n\n const rootOptionalTraversalAliases = traversePatternsInOrder\n .filter((pattern) =>\n optionalTraversalAliases.has(pattern.to) &&\n !optionalTraversalAliases.has(pattern.from) &&\n // Children of a filtered traversal nest inside its filtered block (5b)\n !filteredTraverseAliases.has(pattern.from),\n )\n .map((pattern) => pattern.to);\n\n // 5. Build the algebra tree\n // - Start with the required BGP (type triple + traverse triples)\n // - Wrap each optional property triple in a LeftJoin\n const requiredBgp: SparqlBGP = {\n type: 'bgp',\n triples: [...requiredTriples, ...requiredTraverseTriples, ...requiredPropertyTriples],\n };\n\n let algebra: SparqlAlgebraNode = requiredBgp;\n\n // 5a. Nested-select inner LIMIT/OFFSET → sub-SELECT (single-subject only).\n // Wrap each root→child paginated traversal in a sub-SELECT that inlines\n // the single subject, projecting only the child variable. The child's own\n // property triples stay OUTSIDE (as OPTIONALs), joined on the child var —\n // so the flat-row structure and result mapping are unchanged.\n // Every pattern here is a root→child paginated traversal (the deep-pagination\n // guard above rejected anything else), so each maps 1:1 to a sub-SELECT.\n for (const pattern of paginatedTraversePatterns) {\n const predicate = buildPredicateTerm(pattern);\n const innerTriple = tripleOf(\n iriTerm(singleSubjectIri!),\n predicate,\n varTerm(pattern.to),\n );\n // Default ORDER BY ?childVar for a deterministic window, unless the nested\n // select supplied its own ordering. When it did, each ordered property must\n // also be bound inside the sub-SELECT so the ORDER BY variable resolves.\n let orderBy: SparqlOrderCondition[];\n let innerNode: SparqlAlgebraNode = {type: 'bgp', triples: [innerTriple]};\n if (pattern.innerOrderBy && pattern.innerOrderBy.length > 0) {\n orderBy = pattern.innerOrderBy.map((o) => {\n const orderVar = registry.getOrCreate(pattern.to, o.property);\n innerNode = joinNodes(innerNode, {\n type: 'bgp',\n triples: [tripleOf(varTerm(pattern.to), resolvePropertyPredicateTerm(o.property), varTerm(orderVar))],\n });\n return {\n expression: {kind: 'variable_expr' as const, name: orderVar},\n direction: o.direction,\n };\n });\n } else {\n orderBy = [{\n expression: {kind: 'variable_expr', name: pattern.to},\n direction: 'ASC',\n }];\n }\n const subSelect: SparqlAlgebraNode = {\n type: 'subselect',\n projection: [pattern.to],\n inner: innerNode,\n orderBy,\n ...(typeof pattern.innerLimit === 'number' ? {limit: pattern.innerLimit} : {}),\n ...(typeof pattern.innerOffset === 'number' ? {offset: pattern.innerOffset} : {}),\n };\n // Nest the child's own property triples (e.g. ?a1 <name> ?a1_name) INSIDE\n // this block, each as its own OPTIONAL, so they only bind when the window\n // produced a ?childVar. This keeps the flat-row projection unchanged.\n let childBlock: SparqlAlgebraNode = subSelect;\n for (const propTriple of subSelectChildPropertyTriplesByAlias.get(pattern.to) ?? []) {\n childBlock = wrapOptional(childBlock, {type: 'bgp', triples: [propTriple]});\n }\n // OPTIONAL so a parent with an empty (or fully-windowed-out) child set is\n // still returned — the sub-SELECT yields no ?a1 binding, but the parent row\n // survives (mirrors the plain nested-traverse OPTIONAL behaviour).\n algebra = wrapOptional(algebra, childBlock);\n }\n\n // 5b. Build filtered OPTIONAL blocks for inline where traversals.\n // Each block contains: traverse triple + OPTIONAL property triples + FILTER.\n // Filter property triples are nested as OPTIONALs so that OR filters work\n // even when some entities lack certain properties.\n // First pass: build each filtered block's inner group and filter expression.\n const filteredBlockInners: SparqlAlgebraNode[] = [];\n const filteredBlockExprs: SparqlExpression[] = [];\n const filteredBlockIdxByAlias = new Map<string, number>(\n filteredTraverseBlocks.map((block, i) => [block.toAlias, i]),\n );\n for (let i = 0; i < filteredTraverseBlocks.length; i++) {\n const block = filteredTraverseBlocks[i];\n const filterPropertyTriples = filterPropertyTriplesMap.get(i) || [];\n const filterExpr = convertExpression(block.filter, registry, filterPropertyTriples);\n // Start with the traverse triple as the required BGP\n let blockInner: SparqlAlgebraNode = {type: 'bgp', triples: [block.traverseTriple]};\n // Wrap each filter property triple in its own nested OPTIONAL\n for (const propTriple of filterPropertyTriples) {\n blockInner = wrapOptional(blockInner, {type: 'bgp', triples: [propTriple]});\n }\n // Projected property triples on the filtered alias that aren't part of the\n // filter (e.g. `.where(name=...).select(pp => [pp.hobby])`)\n for (const propTriple of filteredChildPropertyTriplesByAlias.get(block.toAlias) ?? []) {\n blockInner = wrapOptional(blockInner, {type: 'bgp', triples: [propTriple]});\n }\n // Optional child traversal subtrees (nested sub-selects below the filtered\n // alias) — kept inside the block so an empty filter match leaves them unbound\n for (const childAlias of childOptionalAliasesByParent.get(block.toAlias) ?? []) {\n blockInner = wrapOptional(\n blockInner,\n buildOptionalTraversalSubtree(\n childAlias,\n traversePatternMap,\n childOptionalAliasesByParent,\n nestedOptionalPropertyTriplesByAlias,\n ),\n );\n }\n filteredBlockInners.push(blockInner);\n filteredBlockExprs.push(filterExpr);\n }\n // Second pass, children first (blocks are created parent-before-child):\n // finish each block and either nest it inside its parent's filtered block —\n // a filtered sub-select inside another filtered sub-select must stay scoped\n // to the parent alias, or an empty parent match leaves the alias unbound and\n // the block cross-products over the whole graph — or attach it at top level.\n const rootFilteredBlocks: SparqlAlgebraNode[] = [];\n for (let i = filteredTraverseBlocks.length - 1; i >= 0; i--) {\n const block = filteredTraverseBlocks[i];\n const finished: SparqlFilter = {\n type: 'filter',\n expression: filteredBlockExprs[i],\n inner: filteredBlockInners[i],\n };\n const subject = block.traverseTriple.subject;\n const parentIdx = subject.kind === 'variable'\n ? filteredBlockIdxByAlias.get(subject.name)\n : undefined;\n if (parentIdx !== undefined && parentIdx !== i) {\n filteredBlockInners[parentIdx] = wrapOptional(filteredBlockInners[parentIdx], finished);\n } else {\n rootFilteredBlocks.unshift(finished);\n }\n }\n for (const filteredBlock of rootFilteredBlocks) {\n algebra = wrapOptional(algebra, filteredBlock);\n }\n\n for (const alias of rootOptionalTraversalAliases) {\n algebra = wrapOptional(\n algebra,\n buildOptionalTraversalSubtree(\n alias,\n traversePatternMap,\n childOptionalAliasesByParent,\n nestedOptionalPropertyTriplesByAlias,\n ),\n );\n }\n\n // Wrap each optional property triple in its own OPTIONAL (LeftJoin)\n for (const propTriple of topLevelOptionalPropertyTriples) {\n algebra = wrapOptional(algebra, {\n type: 'bgp',\n triples: [propTriple],\n });\n }\n\n // 5. Where clause → Filter wrapping (or HAVING if aggregate-containing)\n let havingExpr: SparqlExpression | undefined;\n if (query.where) {\n const filterExpr = convertExpression(query.where, registry, optionalPropertyTriples);\n if (containsAggregate(filterExpr)) {\n havingExpr = filterExpr;\n } else {\n algebra = {\n type: 'filter',\n expression: filterExpr,\n inner: algebra,\n };\n }\n }\n\n // 5b. MINUS patterns — wrap algebra in SparqlMinus for each minus pattern\n for (const pattern of query.patterns) {\n if (pattern.kind === 'minus') {\n let minusAlgebra = convertExistsPattern(pattern.pattern, registry);\n if (pattern.filter) {\n const minusPropertyTriples: SparqlTriple[] = [];\n processExpressionForProperties(pattern.filter, registry, minusPropertyTriples);\n // Add property triples into the MINUS block\n if (minusPropertyTriples.length > 0) {\n minusAlgebra = joinNodes(minusAlgebra, {type: 'bgp', triples: minusPropertyTriples});\n }\n const filterExpr = convertExpression(pattern.filter, registry, minusPropertyTriples);\n minusAlgebra = {type: 'filter', expression: filterExpr, inner: minusAlgebra};\n }\n algebra = {type: 'minus', left: algebra, right: minusAlgebra};\n }\n }\n\n // 6. SubjectId → Filter / SubjectIds → VALUES\n if (query.subjectIds && query.subjectIds.length > 0) {\n // Multiple subjects: use VALUES clause for efficient filtering\n algebra = joinNodes(\n {type: 'values', variable: rootAlias, iris: query.subjectIds},\n algebra,\n );\n } else if (query.subjectId) {\n const subjectFilter: SparqlExpression = {\n kind: 'binary_expr',\n op: '=',\n left: {kind: 'variable_expr', name: rootAlias},\n right: {kind: 'iri_expr', value: query.subjectId},\n };\n algebra = {\n type: 'filter',\n expression: subjectFilter,\n inner: algebra,\n };\n }\n\n // 7. Build projection\n const projection: SparqlProjectionItem[] = [];\n const aggregates: SparqlAggregateBinding[] = [];\n let hasAggregates = false;\n\n // Always include root alias as first projection variable\n projection.push({kind: 'variable', name: rootAlias});\n\n // Collect traversal aliases upfront to detect aggregate alias collisions\n const traversalAliasSet = new Set(collectTraversalAliases(query.patterns));\n // Track traversal aliases consumed by aggregate renames (should not be\n // re-projected as plain variables, which would alter GROUP BY semantics)\n const aggregateRenamedAliases = new Set<string>();\n\n for (const item of query.projection) {\n const sparqlExpr = convertExpression(item.expression, registry, optionalPropertyTriples);\n\n if (sparqlExpr.kind === 'aggregate_expr') {\n hasAggregates = true;\n // Avoid collision: if aggregate alias matches a traversal alias,\n // rename it so SPARQL doesn't produce duplicate variable bindings\n let aggAlias = item.alias;\n if (traversalAliasSet.has(aggAlias)) {\n aggregateRenamedAliases.add(aggAlias);\n aggAlias = `${aggAlias}_agg`;\n // Update resultMap so result mapping uses the renamed alias\n for (const rm of query.resultMap) {\n if (rm.alias === item.alias) rm.alias = aggAlias;\n }\n }\n projection.push({\n kind: 'aggregate',\n expression: sparqlExpr,\n alias: aggAlias,\n });\n aggregates.push({\n variable: aggAlias,\n aggregate: sparqlExpr,\n });\n } else {\n // For property_expr, the variable is the resolved name from registry\n const varName = resolveExpressionVariable(item.expression, registry);\n if (varName && varName !== rootAlias) {\n projection.push({kind: 'variable', name: varName});\n } else if (!varName) {\n // Non-variable expression (binary_expr, function_expr, etc.)\n // → project as (expr AS ?alias)\n let exprAlias = item.alias;\n if (traversalAliasSet.has(exprAlias)) {\n // The output alias collides with a traversal target variable — e.g. a\n // computed expression over a traversed path lowers to\n // (UCASE(?a1_name) AS ?a1), and ?a1 is already bound by the traverse\n // triple. Rename the output so SPARQL doesn't reuse an in-scope var.\n exprAlias = `${exprAlias}_expr`;\n for (const rm of query.resultMap) {\n if (rm.alias === item.alias) rm.alias = exprAlias;\n }\n }\n projection.push({kind: 'expression', expression: sparqlExpr, alias: exprAlias});\n }\n }\n }\n\n // 7b. Include traversal aliases needed for result grouping\n // When nested results are projected (e.g. p.friends.name), the result\n // mapping needs the traversal alias variable (?a1) in the bindings to\n // group nested rows by entity. Without this, mapNestedRows() can't\n // identify which nested fields belong to which traversed entity.\n const projectedNames = new Set<string>();\n for (const p of projection) {\n if (p.kind === 'variable') projectedNames.add(p.name);\n else if (p.kind === 'aggregate' || p.kind === 'expression') projectedNames.add(p.alias);\n }\n for (const alias of collectTraversalAliases(query.patterns)) {\n if (!projectedNames.has(alias) && !aggregateRenamedAliases.has(alias)) {\n projection.push({kind: 'variable', name: alias});\n projectedNames.add(alias);\n }\n }\n\n // 8. GROUP BY inference\n let groupBy: string[] | undefined;\n if (havingExpr) {\n hasAggregates = true;\n }\n if (hasAggregates) {\n // All non-aggregate projected variables become GROUP BY targets\n groupBy = projection\n .filter((p): p is {kind: 'variable'; name: string} => p.kind === 'variable')\n .map((p) => p.name);\n }\n\n // 9. OrderBy\n let orderBy: SparqlOrderCondition[] | undefined;\n if (query.orderBy) {\n orderBy = query.orderBy.map((item) => ({\n expression: convertExpression(item.expression, registry, optionalPropertyTriples),\n direction: item.direction,\n }));\n }\n\n // `.one()` lowers to limit=1 + singleResult, but LIMIT bounds ROWS, not\n // entities. When the query yields multiple rows per root entity (traversals\n // or plural properties), a row-level LIMIT would truncate the entity's own\n // nested data — omit it and let the result mapper pick the single entity.\n const multiRowPerEntity =\n query.patterns.some((p) => p.kind === 'traverse') ||\n query.projection.some(\n (item) =>\n item.expression.kind === 'property_expr' &&\n !(typeof item.expression.maxCount === 'number' && item.expression.maxCount <= 1),\n );\n const limit =\n query.singleResult && query.limit === 1 && multiRowPerEntity\n ? undefined\n : query.limit;\n\n return {\n type: 'select',\n algebra,\n projection,\n distinct: !hasAggregates ? true : undefined,\n orderBy,\n limit,\n offset: query.offset,\n groupBy,\n having: havingExpr,\n aggregates: aggregates.length > 0 ? aggregates : undefined,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Pattern processing\n// ---------------------------------------------------------------------------\n\nfunction processPattern(\n pattern: IRGraphPattern,\n registry: VariableRegistry,\n traverseTriples: SparqlTriple[],\n optionalPropertyTriples: SparqlTriple[],\n filteredTraverseBlocks?: Array<{traverseTriple: SparqlTriple; filter: IRExpression; toAlias: string}>,\n subSelectAliases?: ReadonlySet<string>,\n): void {\n switch (pattern.kind) {\n case 'shape_scan':\n // Additional shape scans (non-root) are handled as type triples\n // but this case is rare — root is handled separately\n break;\n\n case 'traverse': {\n // Register the traverse variable: (from, property) → to\n registry.set(pattern.from, pattern.property, pattern.to);\n // Traversals wrapped in a sub-SELECT (inner LIMIT/OFFSET) are emitted\n // separately — don't add their triple to the required BGP here.\n if (subSelectAliases?.has(pattern.to)) {\n break;\n }\n // Add traverse triple to required pattern (or filtered block if inline where)\n const triple = buildTraverseTriple(pattern);\n if (pattern.filter && filteredTraverseBlocks) {\n filteredTraverseBlocks.push({\n traverseTriple: triple,\n filter: pattern.filter,\n toAlias: pattern.to,\n });\n } else {\n traverseTriples.push(triple);\n }\n break;\n }\n\n case 'join': {\n for (const sub of pattern.patterns) {\n processPattern(sub, registry, traverseTriples, optionalPropertyTriples, filteredTraverseBlocks, subSelectAliases);\n }\n break;\n }\n\n case 'optional': {\n // Optional patterns — process inner patterns but keep them optional\n processPattern(pattern.pattern, registry, traverseTriples, optionalPropertyTriples, filteredTraverseBlocks, subSelectAliases);\n break;\n }\n\n case 'union': {\n for (const branch of pattern.branches) {\n processPattern(branch, registry, traverseTriples, optionalPropertyTriples, filteredTraverseBlocks, subSelectAliases);\n }\n break;\n }\n\n case 'exists': {\n processPattern(pattern.pattern, registry, traverseTriples, optionalPropertyTriples, filteredTraverseBlocks, subSelectAliases);\n break;\n }\n\n case 'minus': {\n // MINUS patterns are handled separately in selectToAlgebra — skip in processPattern.\n break;\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Expression processing — discover property_expr references\n// ---------------------------------------------------------------------------\n\nfunction processExpressionForProperties(\n expr: IRExpression,\n registry: VariableRegistry,\n optionalPropertyTriples: SparqlTriple[],\n requiredPropertyTriples: SparqlTriple[] = [],\n requiredPropertyKeys = new Set<string>(),\n): void {\n switch (expr.kind) {\n case 'property_expr': {\n if (!registry.has(expr.sourceAlias, expr.property)) {\n const varName = registry.getOrCreate(expr.sourceAlias, expr.property);\n const predicate = buildPredicateTerm(expr);\n const triple = tripleOf(\n varTerm(expr.sourceAlias),\n predicate,\n varTerm(varName),\n );\n const triples = requiredPropertyKeys.has(bindingKey(expr.sourceAlias, expr.property))\n ? requiredPropertyTriples\n : optionalPropertyTriples;\n triples.push(triple);\n }\n break;\n }\n case 'binary_expr':\n processExpressionForProperties(\n expr.left,\n registry,\n optionalPropertyTriples,\n requiredPropertyTriples,\n requiredPropertyKeys,\n );\n processExpressionForProperties(\n expr.right,\n registry,\n optionalPropertyTriples,\n requiredPropertyTriples,\n requiredPropertyKeys,\n );\n break;\n case 'in_expr':\n // The tested value binds a property; list elements are constants.\n processExpressionForProperties(\n expr.value,\n registry,\n optionalPropertyTriples,\n requiredPropertyTriples,\n requiredPropertyKeys,\n );\n break;\n case 'logical_expr':\n for (const sub of expr.expressions) {\n processExpressionForProperties(\n sub,\n registry,\n optionalPropertyTriples,\n requiredPropertyTriples,\n requiredPropertyKeys,\n );\n }\n break;\n case 'not_expr':\n processExpressionForProperties(\n expr.expression,\n registry,\n optionalPropertyTriples,\n requiredPropertyTriples,\n requiredPropertyKeys,\n );\n break;\n case 'function_expr':\n for (const arg of expr.args) {\n processExpressionForProperties(\n arg,\n registry,\n optionalPropertyTriples,\n requiredPropertyTriples,\n requiredPropertyKeys,\n );\n }\n break;\n case 'aggregate_expr':\n for (const arg of expr.args) {\n processExpressionForProperties(\n arg,\n registry,\n optionalPropertyTriples,\n requiredPropertyTriples,\n requiredPropertyKeys,\n );\n }\n break;\n case 'exists_expr':\n // exists_expr filter properties belong INSIDE the EXISTS block, not in\n // the outer scope. Do NOT register them here — convertExpression's\n // exists_expr handler will collect and emit them locally.\n break;\n case 'context_property_expr': {\n // Context entity property — emit a triple with fixed IRI as subject.\n // Use raw IRI as registry key to avoid collision between IRIs that\n // sanitize to the same string (e.g. ctx-1 vs ctx_1).\n const contextIri = resolvedContextIri(expr.contextIri, expr.contextName);\n const ctxKey = contextAliasKey(contextIri);\n if (!registry.has(ctxKey, expr.property)) {\n const varName = registry.getOrCreate(ctxKey, expr.property);\n const triple = tripleOf(\n iriTerm(contextIri),\n resolvePropertyPredicateTerm(expr.property),\n varTerm(varName),\n );\n const triples = requiredPropertyKeys.has(bindingKey(ctxKey, expr.property))\n ? requiredPropertyTriples\n : optionalPropertyTriples;\n triples.push(triple);\n }\n break;\n }\n case 'literal_expr':\n case 'reference_expr':\n case 'alias_expr':\n // No property references to discover\n break;\n }\n}\n\n/**\n * Compute which bindings are mandatory for a top-level FILTER to keep a row.\n * AND makes either side required; OR only keeps bindings required by every branch.\n */\nfunction collectRequiredBindingKeys(expr: IRExpression): Set<string> {\n switch (expr.kind) {\n case 'property_expr':\n return new Set([bindingKey(expr.sourceAlias, expr.property)]);\n case 'context_property_expr':\n return new Set([bindingKey(contextAliasKey(resolvedContextIri(expr.contextIri, expr.contextName)), expr.property)]);\n case 'in_expr':\n // The tested value must be bound; list elements are constants.\n return collectRequiredBindingKeys(expr.value);\n case 'binary_expr':\n return mergeKeySets(\n collectRequiredBindingKeys(expr.left),\n collectRequiredBindingKeys(expr.right),\n );\n case 'function_expr': {\n const fn = expr.name.toUpperCase();\n // BOUND explicitly tests boundness — forcing its argument into a\n // required (inner-join) pattern would make !BOUND unsatisfiable.\n // COALESCE is unbound-tolerant by design — requiring its arguments\n // would make the fallback unreachable.\n if (fn === 'BOUND' || fn === 'COALESCE') {\n return new Set<string>();\n }\n // IF: an unbound variable in the condition errors the row out either\n // way, so the condition may keep its requirements — but the then/else\n // branches must stay optional (the untaken branch may reference a\n // property the entity doesn't have).\n if (fn === 'IF') {\n return expr.args.length > 0\n ? collectRequiredBindingKeys(expr.args[0])\n : new Set<string>();\n }\n return mergeKeySets(...expr.args.map((arg) => collectRequiredBindingKeys(arg)));\n }\n case 'not_expr':\n return collectRequiredBindingKeys(expr.expression);\n case 'logical_expr': {\n const childSets = expr.expressions.map((sub) => collectRequiredBindingKeys(sub));\n if (expr.operator === 'and') {\n return mergeKeySets(...childSets);\n }\n return intersectKeySets(childSets);\n }\n case 'aggregate_expr':\n case 'exists_expr':\n case 'literal_expr':\n case 'reference_expr':\n case 'alias_expr':\n return new Set<string>();\n }\n}\n\n// ---------------------------------------------------------------------------\n// Expression conversion\n// ---------------------------------------------------------------------------\n\n/**\n * The `sh:datatype` of the property a literal is being compared AGAINST, when the\n * comparison has one. Only temporal values use it (see the `literal_expr` case):\n * it is what tells an `xsd:date` property's filter to render `\"2020-01-01\"^^xsd:date`\n * rather than a full timestamp that can never equal the stored term.\n */\nfunction siblingDatatype(expr: IRExpression | undefined): string | undefined {\n if (!expr) return undefined;\n if (expr.kind === 'property_expr' || expr.kind === 'context_property_expr') {\n return resolvePropertyDatatype(expr.property);\n }\n return undefined;\n}\n\nfunction convertExpression(\n expr: IRExpression,\n registry: VariableRegistry,\n optionalPropertyTriples: SparqlTriple[],\n datatypeHint?: string,\n): SparqlExpression {\n switch (expr.kind) {\n case 'literal_expr': {\n const value = expr.value;\n if (value === null || value === undefined) {\n return {kind: 'literal_expr', value: ''};\n }\n // A temporal literal must carry its datatype. SPARQL's `=` on a plain literal\n // and an `^^xsd:dateTime` one is a type error, so the row is dropped: an\n // untyped date filter matched NOTHING against data core itself wrote. The\n // lexical form follows the compared property's declared datatype, the same\n // rule `dateToTerm` applies on the mutation side.\n if (value instanceof Date) {\n const term = dateToTerm(value, datatypeHint);\n return {\n kind: 'literal_expr',\n value: term.kind === 'literal' ? term.value : String(value),\n datatype: term.kind === 'literal' ? term.datatype : XSD_DATETIME,\n };\n }\n if (typeof value === 'boolean') {\n return {\n kind: 'literal_expr',\n value: String(value),\n datatype: XSD_BOOLEAN,\n };\n }\n if (typeof value === 'number') {\n if (Number.isInteger(value)) {\n return {\n kind: 'literal_expr',\n value: String(value),\n datatype: XSD_INTEGER,\n };\n }\n return {\n kind: 'literal_expr',\n value: String(value),\n datatype: XSD_DOUBLE,\n };\n }\n return {kind: 'literal_expr', value: String(value)};\n }\n\n case 'reference_expr':\n return {kind: 'iri_expr', value: resolvedContextIri(expr.value, expr.contextName)};\n\n case 'alias_expr':\n return {kind: 'variable_expr', name: expr.alias};\n\n case 'context_property_expr': {\n const ctxKey = `__ctx__${resolvedContextIri(expr.contextIri, expr.contextName)}`;\n const ctxVarName = registry.getOrCreate(ctxKey, expr.property);\n return {kind: 'variable_expr', name: ctxVarName};\n }\n\n case 'property_expr': {\n const varName = registry.getOrCreate(expr.sourceAlias, expr.property);\n return {kind: 'variable_expr', name: varName};\n }\n\n case 'in_expr': {\n const listHint = siblingDatatype(expr.value);\n return {\n kind: 'in_expr',\n negated: expr.negated,\n value: convertExpression(expr.value, registry, optionalPropertyTriples),\n list: expr.source.list.map((e) =>\n convertExpression(e, registry, optionalPropertyTriples, listHint),\n ),\n };\n }\n\n case 'binary_expr':\n return {\n kind: 'binary_expr',\n op: expr.operator,\n left: convertExpression(\n expr.left, registry, optionalPropertyTriples, siblingDatatype(expr.right),\n ),\n right: convertExpression(\n expr.right, registry, optionalPropertyTriples, siblingDatatype(expr.left),\n ),\n };\n\n case 'logical_expr':\n return {\n kind: 'logical_expr',\n op: expr.operator,\n exprs: expr.expressions.map((e) =>\n convertExpression(e, registry, optionalPropertyTriples),\n ),\n };\n\n case 'not_expr':\n return {\n kind: 'not_expr',\n inner: convertExpression(expr.expression, registry, optionalPropertyTriples),\n };\n\n case 'function_expr':\n return {\n kind: 'function_expr',\n name: expr.name,\n args: expr.args.map((a) =>\n convertExpression(a, registry, optionalPropertyTriples),\n ),\n };\n\n case 'aggregate_expr':\n return {\n kind: 'aggregate_expr',\n name: expr.name,\n args: expr.args.map((a) =>\n convertExpression(a, registry, optionalPropertyTriples),\n ),\n };\n\n case 'exists_expr': {\n // Convert exists expression with inner pattern + filter.\n // Filter property triples must live INSIDE the EXISTS block\n // (not in the outer scope), so we collect them locally.\n let innerAlgebra = convertExistsPattern(\n expr.pattern,\n registry,\n );\n\n if (expr.filter) {\n // First, discover and register filter property references,\n // collecting their triples into a local array (NOT the outer scope).\n const existsPropertyTriples: SparqlTriple[] = [];\n processExpressionForProperties(expr.filter, registry, existsPropertyTriples);\n\n // Now convert the filter expression (variables are registered above).\n const filterExpr = convertExpression(\n expr.filter,\n registry,\n existsPropertyTriples, // unused — properties already registered\n );\n // Add filter property triples inside the EXISTS\n for (const propTriple of existsPropertyTriples) {\n innerAlgebra = joinNodes(innerAlgebra, {type: 'bgp', triples: [propTriple]})!;\n }\n // Wrap the inner pattern with a filter\n const filteredInner: SparqlFilter = {\n type: 'filter',\n expression: filterExpr,\n inner: innerAlgebra,\n };\n return {\n kind: 'exists_expr',\n pattern: filteredInner,\n negated: false,\n };\n }\n\n return {\n kind: 'exists_expr',\n pattern: innerAlgebra,\n negated: false,\n };\n }\n\n default:\n throw new Error(`Unknown IR expression kind: ${(expr as never as {kind: string}).kind}`);\n }\n}\n\n/**\n * Convert an exists pattern (from exists_expr) into an algebra node.\n * Recursively handles all IR graph pattern kinds.\n */\nfunction convertExistsPattern(\n pattern: IRGraphPattern,\n registry: VariableRegistry,\n): SparqlAlgebraNode {\n switch (pattern.kind) {\n case 'traverse': {\n const existsPredicate = buildPredicateTerm(pattern);\n const triple = tripleOf(\n varTerm(pattern.from),\n existsPredicate,\n varTerm(pattern.to),\n );\n return {type: 'bgp', triples: [triple]};\n }\n\n case 'join': {\n let result: SparqlAlgebraNode | null = null;\n for (const sub of pattern.patterns) {\n const subNode = convertExistsPattern(sub, registry);\n result = result ? joinNodes(result, subNode) : subNode;\n }\n return result || {type: 'bgp', triples: []};\n }\n\n case 'shape_scan': {\n return {\n type: 'bgp',\n triples: [\n tripleOf(\n varTerm(pattern.alias),\n iriTerm(RDF_TYPE),\n iriTerm(resolveShapeScanIri(pattern.shape)),\n ),\n ],\n };\n }\n\n case 'optional': {\n const inner = convertExistsPattern(pattern.pattern, registry);\n return wrapOptional({type: 'bgp', triples: []}, inner);\n }\n\n case 'union': {\n let result: SparqlAlgebraNode | null = null;\n for (const branch of pattern.branches) {\n const branchNode = convertExistsPattern(branch, registry);\n if (!result) {\n result = branchNode;\n } else {\n result = {type: 'union', left: result, right: branchNode};\n }\n }\n return result || {type: 'bgp', triples: []};\n }\n\n case 'exists': {\n return convertExistsPattern(pattern.pattern, registry);\n }\n\n case 'minus': {\n return convertExistsPattern(pattern.pattern, registry);\n }\n\n default:\n throw new Error(`Unsupported pattern kind in EXISTS: ${(pattern as never as {kind: string}).kind}`);\n }\n}\n\n/**\n * Resolve what variable name an IR expression ultimately refers to.\n */\nfunction resolveExpressionVariable(\n expr: IRExpression,\n registry: VariableRegistry,\n): string | null {\n switch (expr.kind) {\n case 'alias_expr':\n return expr.alias;\n case 'property_expr':\n return registry.getOrCreate(expr.sourceAlias, expr.property);\n default:\n return null;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Mutation conversions\n// ---------------------------------------------------------------------------\n\n/** The numeric datatypes a shape may declare, and the DSL accepts a number for. */\nconst NUMERIC_DATATYPES = new Set([\n XSD_INTEGER,\n XSD_DOUBLE,\n xsd.long.id,\n xsd.decimal.id,\n xsd.float.id,\n]);\n\n/**\n * The datatype to write a number as: the one its property declares, falling back\n * to the shape of the value itself. Without the declared datatype a property\n * typed `xsd:long` stored `xsd:integer` and one typed `xsd:decimal` stored\n * `xsd:double` — a value the store round-trips as a different term than the\n * shape says it holds.\n */\nfunction numericDatatype(value: number, datatype?: string): string {\n if (datatype && NUMERIC_DATATYPES.has(datatype)) return datatype;\n return Number.isInteger(value) ? XSD_INTEGER : XSD_DOUBLE;\n}\n\n/**\n * A `Date` in the lexical form its property asks for. `xsd:date` and `xsd:dateTime` take a `Date`\n * and only a `Date`, so the declared `sh:datatype` is what decides whether that instant is\n * written as a date or a full timestamp. With no declared datatype the term stays `xsd:dateTime`.\n *\n * `xsd:time` takes a STRING instead (see `STRING_LEXICAL_DATATYPES`): a `Date` cannot represent a\n * time of day without inventing a date alongside it, which then has to be discarded here and\n * makes two identical clock times on different days compare unequal. The `XSD_TIME` branch below\n * remains for a `Date` that reaches an `xsd:time` property some other way.\n */\nfunction dateToTerm(value: Date, datatype?: string): SparqlTerm {\n const iso = value.toISOString();\n if (datatype === XSD_DATE) return literalTerm(iso.slice(0, 10), XSD_DATE);\n if (datatype === XSD_TIME) return literalTerm(iso.slice(11), XSD_TIME);\n return literalTerm(iso, XSD_DATETIME);\n}\n\n/**\n * Datatypes whose lexical form IS a string, so a plain string value must be typed from the\n * DECLARED datatype rather than written as a plain literal.\n *\n * A deliberate allow-list rather than \"type every string from whatever is declared\". A string\n * reaching a numeric or boolean property is a mistake that `assertValid` rejects; typing it here\n * would instead write a well-formed-looking `\"abc\"^^xsd:integer` and hide the error in the data.\n * Only datatypes a string is a VALID lexical form for belong here.\n */\nconst STRING_LEXICAL_DATATYPES = new Set<string>([XSD_TIME]);\n\n/**\n * Convert a field value to one or more SparqlTerm objects for triple objects.\n *\n * `datatype` is the property's declared `sh:datatype`. It decides the term type for temporal\n * values and for the string-lexical datatypes above; every other literal is still typed from the\n * JavaScript value, because that is what makes a wrong JS type a visible failure rather than a\n * silently mistyped triple.\n */\nfunction fieldValueToTerms(\n value: IRFieldValue,\n options?: SparqlOptions,\n datatype?: string,\n): SparqlTerm[] {\n if (value === null || value === undefined) {\n return [];\n }\n\n if (typeof value === 'string') {\n // A plain literal is `xsd:string` in RDF 1.1, so a string for an `xsd:string` property needs\n // no explicit datatype. Anything else in the allow-list must carry one, or it is written\n // untyped and stops matching the property it was meant to fill.\n if (datatype && STRING_LEXICAL_DATATYPES.has(datatype)) {\n return [literalTerm(value, datatype)];\n }\n return [literalTerm(value)];\n }\n\n if (typeof value === 'number') {\n return [literalTerm(String(value), numericDatatype(value, datatype))];\n }\n\n if (typeof value === 'boolean') {\n return [literalTerm(String(value), XSD_BOOLEAN)];\n }\n\n if (value instanceof Date) {\n return [dateToTerm(value, datatype)];\n }\n\n // Computed/expression value in create: create lowers to INSERT DATA (ground\n // triples, no WHERE), so an expression can't be evaluated here. Fail loudly\n // instead of silently emitting no triple (report 021 §3, G4).\n if (\n value &&\n typeof value === 'object' &&\n (isIRExpression(value) || 'ir' in (value as object))\n ) {\n throw new Error(\n 'Computed/expression values are not supported in create (INSERT DATA has no WHERE clause to evaluate them). Use a literal value, or use update.',\n );\n }\n\n // NodeReferenceValue\n if (typeof value === 'object' && 'id' in value && !('shape' in value) && !('fields' in value)) {\n return [iriTerm((value as NodeReferenceValue).id)];\n }\n\n // IRNodeData — should not produce a term directly (handled by nested create)\n if (typeof value === 'object' && 'shape' in value && 'fields' in value) {\n return []; // Handled separately\n }\n\n // Array\n if (Array.isArray(value)) {\n const terms: SparqlTerm[] = [];\n for (const item of value) {\n terms.push(...fieldValueToTerms(item, options, datatype));\n }\n return terms;\n }\n\n return [];\n}\n\n/**\n * Mints the labels of the blank nodes of one INSERT DATA. Only a create passes one: blank\n * nodes in a `DELETE/INSERT … WHERE` template are minted once per WHERE solution, and the\n * update's cleanup UNION yields several, so the structure would be written several times.\n */\ntype BlankNodeMinter = {next: number};\n\n/** How a nested create is written: an IRI-named, typed node, or an untyped blank node. */\ntype NestedNodeKind = 'iri' | 'blank';\n\n/**\n * True when the property's `sh:nodeKind` allows blank-node values (`sh:BlankNode`,\n * `sh:BlankNodeOrIRI`, `sh:BlankNodeOrLiteral`). A nested create under such a property may be\n * minted as a blank node, and a delete / replace through it removes its blank value.\n */\nfunction isBlankCapable(ps: {nodeKind?: {id?: string}} | undefined): boolean {\n const nk = ps?.nodeKind?.id;\n return nk === shacl.BlankNode.id || nk === shacl.BlankNodeOrIRI.id || nk === shacl.BlankNodeOrLiteral.id;\n}\n\n/** `label` (shape) of a property shape, for error messages. */\nfunction describeProperty(propertyId: string): string {\n const ps = findPropertyShapeById(propertyId);\n return ps?.label ? `'${ps.label}' (${propertyId})` : propertyId;\n}\n\n/**\n * How a nested create under `propertyId` is written, from the property's `sh:nodeKind`:\n *\n * | nodeKind | without id | with id |\n * |---|---|---|\n * | unset, `sh:IRI`, `sh:IRIOrLiteral` | IRI (minted) | IRI |\n * | `sh:BlankNode` | blank node | error: a blank node has no id |\n * | `sh:BlankNodeOrIRI` | blank node | IRI |\n * | `sh:BlankNodeOrLiteral` | blank node | error: an IRI is not allowed |\n * | `sh:Literal` | error | error |\n *\n * The rule is read from the receiving side's registry, so nothing about it travels on the wire.\n */\nfunction nestedNodeKind(propertyId: string, data: IRNodeData): NestedNodeKind {\n const nk = findPropertyShapeById(propertyId)?.nodeKind?.id;\n switch (nk) {\n case shacl.BlankNodeOrIRI.id:\n return data.id ? 'iri' : 'blank';\n case shacl.BlankNode.id:\n case shacl.BlankNodeOrLiteral.id:\n if (data.id) {\n throw new Error(\n `Property ${describeProperty(propertyId)} is ${nk === shacl.BlankNode.id ? 'sh:BlankNode' : 'sh:BlankNodeOrLiteral'}: ` +\n `its nested value is written as a blank node, which has no id, but the value carries ` +\n `the id ${data.id}.`,\n );\n }\n return 'blank';\n case shacl.Literal.id:\n throw new Error(\n `Property ${describeProperty(propertyId)} is sh:Literal and cannot hold a nested node.`,\n );\n default:\n return 'iri';\n }\n}\n\n/**\n * The triples of a nested create held by `subjectTerm` through `propertyId`: the edge, then the\n * nested node's own triples. `blanks` is the create's label minter; without one (the update\n * paths) a value that would be minted blank throws, see `generateNodeDataTriples`.\n */\nfunction nestedCreateTriples(\n subjectTerm: SparqlTerm,\n propertyId: string,\n propertyTerm: SparqlTerm,\n data: IRNodeData,\n options?: SparqlOptions,\n blanks?: BlankNodeMinter,\n): SparqlTriple[] {\n const kind = nestedNodeKind(propertyId, data);\n if (kind === 'blank' && !blanks) {\n throw new Error(\n `Cannot write a blank node in an update: property ${describeProperty(propertyId)} allows ` +\n `blank nodes and its nested value has no id. An update writes its INSERT once per WHERE ` +\n `solution, which would duplicate the blank node. Write the value with the create of its ` +\n `parent${findPropertyShapeById(propertyId)?.nodeKind?.id === shacl.BlankNodeOrIRI.id ? ', or give it an id to write it as an IRI' : ''}.`,\n );\n }\n const nested = generateNodeDataTriples(data, options, blanks, kind);\n return [tripleOf(subjectTerm, propertyTerm, nested.term), ...nested.triples];\n}\n\n/**\n * Recursively generate triples for an IRNodeData (used in create and nested creates).\n * Returns the term used for this node and all generated triples.\n *\n * `kind` is decided by the caller from the property that holds the node (`nestedNodeKind`);\n * the root of a create is always an IRI. A blank node gets a fresh label and only its field\n * triples, no `rdf:type`: its shape is known from the property, and a SHACL path operator, the\n * case blank nodes exist for here, must be the subject of exactly one triple.\n */\nfunction generateNodeDataTriples(\n data: IRNodeData,\n options?: SparqlOptions,\n blanks?: BlankNodeMinter,\n kind: NestedNodeKind = 'iri',\n): {term: SparqlTerm; triples: SparqlTriple[]} {\n const triples: SparqlTriple[] = [];\n let subjectTerm: SparqlTerm;\n if (kind === 'blank') {\n // Callers only pass 'blank' with a minter (`nestedCreateTriples` checks).\n subjectTerm = {kind: 'blank', label: `b${blanks!.next++}`};\n } else {\n subjectTerm = iriTerm(data.id || generateEntityUri(data.shape, options));\n // Type triple — resolve the SHACL NodeShapeData id in the IR to the ontology\n // targetClass URI (sibling of PR #77's SELECT-side resolveShapeScanIri).\n // Mutations were not covered by #77; see mutation-uri-fidelity.test.ts.\n triples.push(tripleOf(subjectTerm, iriTerm(RDF_TYPE), iriTerm(resolveShapeScanIri(data.shape))));\n }\n\n // Field triples\n for (const field of data.fields) {\n const propertyTerm = resolvePropertyPredicateTerm(field.property);\n\n // Skip undefined/null values in create\n if (field.value === undefined || field.value === null) {\n continue;\n }\n\n // Handle arrays (multi-value fields)\n if (Array.isArray(field.value)) {\n for (const item of field.value) {\n if (item && typeof item === 'object' && 'shape' in item && 'fields' in item) {\n triples.push(\n ...nestedCreateTriples(subjectTerm, field.property, propertyTerm, item as IRNodeData, options, blanks),\n );\n } else {\n const terms = fieldValueToTerms(item, options, resolvePropertyDatatype(field.property));\n for (const term of terms) {\n triples.push(tripleOf(subjectTerm, propertyTerm, term));\n }\n }\n }\n continue;\n }\n\n // Handle nested IRNodeData\n if (typeof field.value === 'object' && 'shape' in field.value && 'fields' in field.value) {\n triples.push(\n ...nestedCreateTriples(subjectTerm, field.property, propertyTerm, field.value as IRNodeData, options, blanks),\n );\n continue;\n }\n\n // Simple value\n const terms = fieldValueToTerms(field.value, options, resolvePropertyDatatype(field.property));\n for (const term of terms) {\n triples.push(tripleOf(subjectTerm, propertyTerm, term));\n }\n }\n\n return {term: subjectTerm, triples};\n}\n\n/**\n * Converts an IRCreateMutation to a SparqlInsertDataPlan.\n */\nexport function createToAlgebra(\n query: IRCreateMutation,\n options?: SparqlOptions,\n): SparqlInsertDataPlan {\n const {triples} = generateNodeDataTriples(query.data, options, {next: 0});\n return {\n type: 'insert_data',\n triples,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Shared update field processing\n// ---------------------------------------------------------------------------\n\n/** A bare `{id}` reference: a link to an existing node, not a nested create. */\nexport function isBareNodeReference(value: unknown): value is NodeReferenceValue {\n return (\n !!value &&\n typeof value === 'object' &&\n !Array.isArray(value) &&\n !(value instanceof Date) &&\n typeof (value as {id?: unknown}).id === 'string' &&\n !('shape' in value) &&\n !('fields' in value)\n );\n}\n\n/**\n * The values a `contains` replace keeps: the bare `{id}`s of the new single value or of\n * the overwrite array. A nested create that carries an id is not kept — it rewrites that\n * node completely, as it always has.\n */\nfunction keptReferences(value: IRFieldValue): SparqlTerm[] {\n const items = Array.isArray(value) ? value : [value];\n return items.filter(isBareNodeReference).map((ref) => iriTerm(ref.id));\n}\n\n/**\n * Processes IRNodeData fields into DELETE/INSERT/WHERE triples.\n * Shared between updateToAlgebra (IRI subject) and updateWhereToAlgebra (variable subject).\n */\nfunction processUpdateFields(\n data: IRNodeData,\n subjectTerm: SparqlTerm,\n options?: SparqlOptions,\n): {\n deletePatterns: SparqlTriple[];\n insertPatterns: SparqlTriple[];\n oldValueTriples: SparqlTriple[];\n extends: Array<{variable: string; expression: SparqlExpression}>;\n cascadeOptionals: SparqlAlgebraNode[];\n} {\n const deletePatterns: SparqlTriple[] = [];\n const insertPatterns: SparqlTriple[] = [];\n const oldValueTriples: SparqlTriple[] = [];\n const extends_: Array<{variable: string; expression: SparqlExpression}> = [];\n // Owned cleanup on `contains` replace/remove: dropping a `contains` edge must delete\n // the old object itself (its own triples) AND its owned subtree, not just unlink the\n // one-hop edge — otherwise the old node orphans (backlog 032).\n const {containsPreds: updContainsPreds} = collectContainment();\n const containsOldVars: Array<{\n oldVar: string;\n propertyTerm: SparqlTerm;\n keep: SparqlTerm[];\n hasValueShape: boolean;\n valueShapeId?: string;\n }> = [];\n const cascadeOptionals: SparqlAlgebraNode[] = [];\n\n for (const field of data.fields) {\n const propertyTerm = resolvePropertyPredicateTerm(field.property);\n const suffix = propertySuffix(field.property);\n const isContainsField =\n propertyTerm.kind === 'iri' && updContainsPreds.includes(propertyTerm.value);\n // Only a `contains` property that declares a value shape deletes the old value's own\n // triples. Without one (a polymorphic slot like `sh:path`) the value may be a shared\n // IRI, so it is left to the cascade, which deletes it only when it is dependent-typed.\n const valueShapeId = isContainsField ? findPropertyShapeById(field.property)?.valueShape?.id : undefined;\n const hasValueShape = !!valueShapeId;\n\n // Check for set modification ({add, remove})\n if (\n field.value &&\n typeof field.value === 'object' &&\n !Array.isArray(field.value) &&\n !(field.value instanceof Date) &&\n !('id' in field.value) &&\n !('shape' in field.value) &&\n ('add' in field.value || 'remove' in field.value)\n ) {\n const setMod = field.value as IRSetModificationValue;\n\n if (setMod.remove) {\n // A value that is removed and added back in the same modification stays: its edge\n // is deleted and re-inserted (a no-op), and the node itself is not touched.\n const readdedIds = new Set(\n (setMod.add ?? []).filter(isBareNodeReference).map((ref) => ref.id),\n );\n setMod.remove.forEach((removeItem, ri) => {\n const removeId = (removeItem as NodeReferenceValue).id;\n const removeTerm = iriTerm(removeId);\n const edge = tripleOf(subjectTerm, propertyTerm, removeTerm);\n deletePatterns.push(edge);\n oldValueTriples.push(edge);\n // For a `contains` set, removing a value deletes the removed node itself\n // (its own triples) and its owned subtree — exclusive ownership via the edge.\n if (isContainsField && !readdedIds.has(removeId)) {\n if (hasValueShape) {\n const self = buildOwnedSelfDelete(\n subjectTerm,\n propertyTerm,\n removeTerm,\n `ucr_${suffix}_${ri}_`,\n );\n deletePatterns.push(...self.deletePatterns);\n cascadeOptionals.push(...self.whereOptionals);\n const blank = valueShapeId\n ? subjectBlankCascade(valueShapeId, removeTerm, [edge], `ucr_${suffix}_${ri}_vb_`)\n : null;\n if (blank) {\n deletePatterns.push(...blank.deletePatterns);\n cascadeOptionals.push(blank.whereBlock);\n }\n }\n // The edge leads the cascade too: with a zero-or-more path the removed node is\n // itself a match, and it may only be deleted while it is still owned here.\n const cascade = buildOwnedCascade(removeTerm, `ucr_${suffix}_${ri}_`, edge);\n deletePatterns.push(...cascade.deletePatterns);\n cascadeOptionals.push(...cascade.whereOptionals);\n }\n });\n }\n\n if (setMod.add) {\n for (const addItem of setMod.add) {\n if (addItem && typeof addItem === 'object' && 'shape' in addItem && 'fields' in addItem) {\n insertPatterns.push(\n ...nestedCreateTriples(subjectTerm, field.property, propertyTerm, addItem as IRNodeData, options),\n );\n } else {\n const terms = fieldValueToTerms(addItem, options, resolvePropertyDatatype(field.property));\n for (const term of terms) {\n insertPatterns.push(tripleOf(subjectTerm, propertyTerm, term));\n }\n }\n }\n }\n\n continue;\n }\n\n // Replace / unset / overwrite of a blank-capable property: its old blank value and the\n // blank nodes below it go (the branch binds `old_${suffix}` through the edge itself).\n const fieldShape = findPropertyShapeById(field.property);\n if (isBlankCapable(fieldShape)) {\n const blank = buildBlankCascade(\n [tripleOf(subjectTerm, propertyTerm, varTerm(`old_${suffix}`))],\n varTerm(`old_${suffix}`),\n null,\n blankWalkPredicates([fieldShape!]),\n `ub_${suffix}_`,\n );\n if (blank) {\n deletePatterns.push(...blank.deletePatterns);\n cascadeOptionals.push(blank.whereBlock);\n }\n }\n\n // Non-set-modification replace of a `contains` property: cascade the old value's\n // subtree (every branch below binds `old_${suffix}` in the WHERE).\n if (isContainsField) {\n containsOldVars.push({\n oldVar: `old_${suffix}`,\n propertyTerm,\n keep: keptReferences(field.value),\n hasValueShape,\n valueShapeId,\n });\n }\n\n // Unset (undefined/null) — delete only\n if (field.value === undefined || field.value === null) {\n const oldVar = varTerm(`old_${suffix}`);\n deletePatterns.push(tripleOf(subjectTerm, propertyTerm, oldVar));\n oldValueTriples.push(tripleOf(subjectTerm, propertyTerm, oldVar));\n continue;\n }\n\n // Array overwrite — delete old values + insert new ones\n if (Array.isArray(field.value)) {\n const oldVar = varTerm(`old_${suffix}`);\n deletePatterns.push(tripleOf(subjectTerm, propertyTerm, oldVar));\n oldValueTriples.push(tripleOf(subjectTerm, propertyTerm, oldVar));\n\n for (const item of field.value) {\n if (item && typeof item === 'object' && 'shape' in item && 'fields' in item) {\n insertPatterns.push(\n ...nestedCreateTriples(subjectTerm, field.property, propertyTerm, item as IRNodeData, options),\n );\n } else {\n const terms = fieldValueToTerms(item, options, resolvePropertyDatatype(field.property));\n for (const term of terms) {\n insertPatterns.push(tripleOf(subjectTerm, propertyTerm, term));\n }\n }\n }\n continue;\n }\n\n // Nested create (single object field)\n if (typeof field.value === 'object' && 'shape' in field.value && 'fields' in field.value) {\n const oldVar = varTerm(`old_${suffix}`);\n deletePatterns.push(tripleOf(subjectTerm, propertyTerm, oldVar));\n oldValueTriples.push(tripleOf(subjectTerm, propertyTerm, oldVar));\n\n insertPatterns.push(\n ...nestedCreateTriples(subjectTerm, field.property, propertyTerm, field.value as IRNodeData, options),\n );\n continue;\n }\n\n // IRExpression — computed value update (e.g. p.age.plus(1))\n if (isIRExpression(field.value)) {\n const expr = field.value as IRExpression;\n const oldVar = varTerm(`old_${suffix}`);\n const computedVarName = `computed_${suffix}`;\n const computedVar = varTerm(computedVarName);\n\n // DELETE old value\n deletePatterns.push(tripleOf(subjectTerm, propertyTerm, oldVar));\n\n // WHERE: OPTIONAL for old value\n oldValueTriples.push(tripleOf(subjectTerm, propertyTerm, oldVar));\n\n // Discover additional property references in the expression and add OPTIONAL triples\n const registry = new VariableRegistry();\n const mutationSubjectAlias = '__mutation_subject__';\n // Pre-register the subject variable mapping for the field being updated\n registry.set(mutationSubjectAlias, field.property, `old_${suffix}`);\n\n const additionalOptionals: SparqlTriple[] = [];\n processExpressionForProperties(expr, registry, additionalOptionals);\n\n // Add any additional property OPTIONAL triples (for refs to other properties)\n for (const triple of additionalOptionals) {\n // Rewrite the subject from the placeholder variable to the actual subject term\n if (triple.subject.kind === 'variable' && triple.subject.name === mutationSubjectAlias) {\n oldValueTriples.push(tripleOf(subjectTerm, triple.predicate, triple.object));\n } else {\n oldValueTriples.push(triple);\n }\n }\n\n // Convert IRExpression to SparqlExpression\n const sparqlExpr = convertExpression(expr, registry, additionalOptionals);\n\n // BIND computed expression\n extends_.push({variable: computedVarName, expression: sparqlExpr});\n\n // INSERT computed value\n insertPatterns.push(tripleOf(subjectTerm, propertyTerm, computedVar));\n continue;\n }\n\n // Simple value update — delete old + insert new\n const oldVar = varTerm(`old_${suffix}`);\n deletePatterns.push(tripleOf(subjectTerm, propertyTerm, oldVar));\n oldValueTriples.push(tripleOf(subjectTerm, propertyTerm, oldVar));\n\n const terms = fieldValueToTerms(field.value, options, resolvePropertyDatatype(field.property));\n for (const term of terms) {\n insertPatterns.push(tripleOf(subjectTerm, propertyTerm, term));\n }\n }\n\n // For each replaced `contains` property: delete the old value's own triples\n // (exclusive ownership via the edge — backlog 032) then cascade any owned descendants.\n // Values re-sent as a bare `{id}` are kept: their blocks are filtered, so re-sending the\n // current value is a no-op (the edge is deleted and re-inserted).\n containsOldVars.forEach(({oldVar, propertyTerm, keep, hasValueShape, valueShapeId}, n) => {\n const oldTerm = varTerm(oldVar);\n if (hasValueShape) {\n const self = buildOwnedSelfDelete(subjectTerm, propertyTerm, oldTerm, `uc${n}_`, keep);\n deletePatterns.push(...self.deletePatterns);\n cascadeOptionals.push(...self.whereOptionals);\n // The old value's own blank values go with it.\n const blank = valueShapeId\n ? subjectBlankCascade(valueShapeId, oldTerm, [tripleOf(subjectTerm, propertyTerm, oldTerm)], `uc${n}_vb_`)\n : null;\n if (blank) {\n deletePatterns.push(...blank.deletePatterns);\n cascadeOptionals.push(keepFilter(blank.whereBlock, oldTerm, keep));\n }\n }\n // Every cascade block binds `?old` itself through the owning edge, like the\n // self-delete block does. Without it an absent old value leaves `?old` unbound and\n // the block matches the owned subtree of EVERY node in the graph.\n const cascade = buildOwnedCascade(\n oldTerm,\n `uc${n}_`,\n tripleOf(subjectTerm, propertyTerm, oldTerm),\n keep,\n );\n deletePatterns.push(...cascade.deletePatterns);\n cascadeOptionals.push(...cascade.whereOptionals);\n });\n\n return {\n deletePatterns,\n insertPatterns,\n oldValueTriples,\n extends: extends_,\n cascadeOptionals,\n };\n}\n\n/**\n * Wraps old-value triples in OPTIONAL (LEFT JOIN) so UPDATE succeeds\n * even when the old value doesn't exist.\n */\nfunction wrapOldValueOptionals(\n base: SparqlAlgebraNode,\n oldValueTriples: SparqlTriple[],\n): SparqlAlgebraNode {\n let algebra = base;\n if (oldValueTriples.length === 0) {\n return algebra;\n }\n for (const triple of oldValueTriples) {\n algebra = {\n type: 'left_join',\n left: algebra,\n right: {type: 'bgp', triples: [triple]},\n };\n }\n return algebra;\n}\n\n/**\n * Converts an IRUpdateMutation to a SparqlDeleteInsertPlan.\n */\nexport function updateToAlgebra(\n query: IRUpdateMutation,\n options?: SparqlOptions,\n): SparqlDeleteInsertPlan {\n return buildDeleteInsertPlan(query, options);\n}\n\n/**\n * Converts an IRUpsertMutation to a SparqlDeleteInsertPlan.\n *\n * The same plan `update` produces, plus `<id> a <targetClass>` in the INSERT. Nothing else\n * differs: `update`'s WHERE is already a bare OPTIONAL, so it matches — and therefore\n * inserts — whether or not the node exists. The type triple is what turns that into a\n * create. Re-asserting it on an existing node is a no-op, RDF graphs being sets, so it\n * needs no guard.\n */\nexport function upsertToAlgebra(\n query: IRUpsertMutation,\n options?: SparqlOptions,\n): SparqlDeleteInsertPlan {\n return buildDeleteInsertPlan(query, options, {\n // Must match the IRI `create` asserts and `select` scans for; the raw shape id is\n // not the same thing, and a node typed with it would be invisible to queries.\n ensureType: resolveShapeScanIri(query.shape),\n });\n}\n\n/**\n * Shared body of the id-targeted DELETE/INSERT/WHERE plans. `ensureType` is the only\n * difference between `update` and `upsert`; when absent the output is exactly what the\n * update path has always emitted.\n */\nfunction buildDeleteInsertPlan(\n query: IRUpdateMutation | IRUpsertMutation,\n options?: SparqlOptions,\n opts?: {ensureType?: string},\n): SparqlDeleteInsertPlan {\n const subjectTerm = iriTerm(query.id);\n const result = processUpdateFields(query.data, subjectTerm, options);\n\n const whereAlgebra = buildUpdateWhere(\n {type: 'bgp', triples: []},\n result,\n query.traversalPatterns,\n subjectTerm,\n );\n\n // The type triple leads the INSERT, mirroring `create`'s triple order.\n const insertPatterns = opts?.ensureType\n ? [\n tripleOf(subjectTerm, iriTerm(RDF_TYPE), iriTerm(opts.ensureType)),\n ...result.insertPatterns,\n ]\n : result.insertPatterns;\n\n return {\n type: 'delete_insert',\n deletePatterns: result.deletePatterns,\n insertPatterns,\n whereAlgebra,\n };\n}\n\n/** Left-nested UNION of `blocks` (at least one). */\nfunction unionOf(blocks: SparqlAlgebraNode[]): SparqlAlgebraNode {\n let union = blocks[0];\n for (let i = 1; i < blocks.length; i++) {\n union = {type: 'union', left: union, right: blocks[i]};\n }\n return union;\n}\n\n/** Every variable name an expression mentions, including inside EXISTS patterns. */\nfunction collectVariableNames(value: unknown, into: Set<string>): Set<string> {\n if (Array.isArray(value)) {\n for (const item of value) collectVariableNames(item, into);\n } else if (value && typeof value === 'object') {\n const node = value as {kind?: string; name?: unknown; variable?: unknown};\n if ((node.kind === 'variable_expr' || node.kind === 'variable') && typeof node.name === 'string') {\n into.add(node.name);\n }\n if (node.kind === 'bound_expr' && typeof node.variable === 'string') {\n into.add(node.variable);\n }\n for (const child of Object.values(value)) collectVariableNames(child, into);\n }\n return into;\n}\n\n/**\n * The WHERE shared by `update`, `upsert` and `updateWhere`, on top of `base` (empty for\n * an id-targeted update; the type guard and filter for an update-where).\n *\n * The old values and owned-cleanup blocks are independent of each other, so they are\n * joined as ONE OPTIONAL over a UNION, never as a chain of OPTIONALs. A chain is a join:\n * the old values of two multi-valued properties, or an owned node's own triples and its\n * owned subtree, multiply into one solution per combination. A UNION yields each block's\n * matches once, so the solutions add up, and the DELETE removes exactly the same triples\n * (a template triple a solution leaves unbound is skipped). The OPTIONAL keeps one\n * solution when nothing matches, so the INSERT still happens.\n *\n * Old values that a computed field's BIND reads stay in `base` as before, together with\n * the traversals they need, because the BIND needs them bound in the same solution. With\n * a single independent block the output is the one OPTIONAL it always was.\n */\nfunction buildUpdateWhere(\n base: SparqlAlgebraNode,\n result: ReturnType<typeof processUpdateFields>,\n traversalPatterns: IRUpdateMutation['traversalPatterns'],\n subjectTerm: SparqlTerm,\n): SparqlAlgebraNode {\n // Partition old-value/optional triples into subject-anchored ones and those\n // anchored on a traversal target variable (e.g. `?a1 <name> ?a1_name` from a\n // `p.bestFriend.name.ucase()` expression). Traversal-anchored triples MUST be\n // nested inside the same OPTIONAL group as their traversal edge — otherwise,\n // when the subject has no such edge, the leaf variable is unbound and the\n // property triple matches every entity in the graph (data-corruption bug).\n const travTos = new Set((traversalPatterns ?? []).map((t) => t.to));\n const travAnchoredByTo = new Map<string, SparqlTriple[]>();\n const subjectAnchored: SparqlTriple[] = [];\n for (const triple of result.oldValueTriples) {\n if (triple.subject.kind === 'variable' && travTos.has(triple.subject.name)) {\n const list = travAnchoredByTo.get(triple.subject.name) ?? [];\n list.push(triple);\n travAnchoredByTo.set(triple.subject.name, list);\n } else {\n subjectAnchored.push(triple);\n }\n }\n\n // Old values a BIND reads must share its solution; the rest are independent blocks.\n const readByBinds = new Set<string>();\n for (const ext of result.extends) collectVariableNames(ext.expression, readByBinds);\n const correlated: SparqlTriple[] = [];\n const independent: SparqlAlgebraNode[] = [];\n for (const triple of subjectAnchored) {\n const vars = collectVariableNames([triple.subject, triple.predicate, triple.object], new Set());\n if ([...vars].some((v) => readByBinds.has(v))) {\n correlated.push(triple);\n } else {\n independent.push({type: 'bgp', triples: [triple]});\n }\n }\n\n let whereAlgebra = wrapOldValueOptionals(base, correlated);\n\n // Add traversal OPTIONAL patterns (for multi-segment expression refs). The\n // traversal edge and its dependent leaf property triples share one OPTIONAL\n // group so the leaf variable is scoped to the traversal target. These come\n // BEFORE expression BINDs since the BINDs reference the traversal variables.\n for (const trav of traversalPatterns ?? []) {\n const fromTerm =\n trav.from === '__mutation_subject__' ? subjectTerm : varTerm(trav.from);\n const traversalTriple = tripleOf(\n fromTerm,\n // The declared `sh:path`, like every other predicate — not the property\n // shape's own IRI, which identifies the description of the property.\n resolvePropertyPredicateTerm(trav.property),\n varTerm(trav.to),\n );\n // The traversal edge binds the target var; each dependent leaf property is\n // a nested OPTIONAL *within* that scope, so a missing optional property\n // (e.g. a bestFriend with no hobby) doesn't drop the whole group, while an\n // absent edge still leaves every leaf var unbound (no cross-entity match).\n let travNode: SparqlAlgebraNode = {type: 'bgp', triples: [traversalTriple]};\n for (const leaf of travAnchoredByTo.get(trav.to) ?? []) {\n travNode = {\n type: 'left_join',\n left: travNode,\n right: {type: 'bgp', triples: [leaf]},\n };\n }\n whereAlgebra = {type: 'left_join', left: whereAlgebra, right: travNode};\n }\n\n // Independent old values + owned-subtree cleanup for `contains` replace/remove.\n const blocks = [...independent, ...result.cascadeOptionals];\n if (blocks.length > 0) {\n whereAlgebra = {type: 'left_join', left: whereAlgebra, right: unionOf(blocks)};\n }\n\n // Add BIND expressions for computed fields\n for (const ext of result.extends) {\n whereAlgebra = {\n type: 'extend',\n inner: whereAlgebra,\n variable: ext.variable,\n expression: ext.expression,\n };\n }\n return whereAlgebra;\n}\n\n// ---------------------------------------------------------------------------\n// Owned-subtree cascade\n//\n// Composition cleanup driven by two declarative flags:\n// - a property marked `contains` → the cascade FOLLOWS that edge,\n// - a shape marked `dependent` → its instances may be DELETED when reached.\n// Both are read from the live registry, so no vocabulary is hardcoded. From a root\n// node we follow `(c1|c2|…)*` over all contains predicates (zero hops included, so a\n// dependent-typed root is itself a match) and, for each dependent targetClass,\n// wildcard-delete the reached typed nodes. Requiring an asserted `?owned a <dependentType>`\n// naturally excludes shared predicate IRIs (e.g. a simple `sh:path`) and `rdf:nil` (never\n// typed), so only owned structural nodes are removed.\n//\n// Whether a field owns its value is decided per predicate across the registry\n// (`collectContainment`): the replace and set-remove deletes, and the class check in\n// `ownedLinkCheck.ts`, apply that same rule. The subject deletes (by id and bulk) use the\n// deleted shape's own `contains` properties with a value shape for the immediate children.\n// ---------------------------------------------------------------------------\n\n/**\n * The simple-path predicates of the shape's own and inherited `contains` properties that\n * declare a value shape, deduplicated in declaration order. These are the properties\n * whose immediate values a subject delete removes.\n */\nfunction ownedValueShapePredicates(shapeId: string): string[] {\n const nodeShape = getShapeClass(shapeId)?.shape ?? getNodeShape(shapeId);\n if (!nodeShape) return [];\n const predicates = new Set<string>();\n for (const ps of getPropertyShapes(nodeShape, true)) {\n if (!ps.contains || !ps.valueShape) continue;\n const predicate = getSimplePathId(ps.path);\n if (predicate) predicates.add(predicate);\n }\n return [...predicates];\n}\n\n/**\n * The blank-node cascade of the immediately-owned children of `shapeId` on `predicate` (see\n * `ownedValueShapePredicates`): the blank values of every value shape its `contains` properties\n * on that predicate declare. `ownerTriples` bind the child.\n */\nfunction ownedChildBlankCascade(\n shapeId: string,\n predicate: string,\n childTerm: SparqlTerm,\n ownerTriples: SparqlTriple[],\n varPrefix: string,\n): {deletePatterns: SparqlTriple[]; whereBlock: SparqlAlgebraNode}[] {\n const nodeShape = getShapeClass(shapeId)?.shape ?? getNodeShape(shapeId);\n if (!nodeShape) return [];\n const valueShapes = new Set<string>();\n for (const ps of getPropertyShapes(nodeShape, true)) {\n if (ps.contains && ps.valueShape?.id && getSimplePathId(ps.path) === predicate) {\n valueShapes.add(ps.valueShape.id);\n }\n }\n return [...valueShapes].flatMap((valueShapeId, i) => {\n const cascade = subjectBlankCascade(valueShapeId, childTerm, ownerTriples, `${varPrefix}${i}_`);\n return cascade ? [cascade] : [];\n });\n}\n\n/** True when the shape (or an ancestor) declares at least one `contains` property. */\nfunction shapeHasContainsProperty(shapeId: string): boolean {\n const nodeShape = getShapeClass(shapeId)?.shape ?? getNodeShape(shapeId);\n if (!nodeShape) return false;\n return getPropertyShapes(nodeShape, true)\n .some((ps) => (ps as {contains?: boolean}).contains);\n}\n\n// Memoized registry scan for cascade lowering — called once per update/delete and\n// again per owned-cascade item inside loops. Guarded by registry size (same rationale\n// as predicateTermCache). Callers treat the result as read-only.\ntype Containment = {\n containsPreds: string[];\n dependentTypes: string[];\n /** Per dependent targetClass: the blank-capable properties of the shapes targeting it. */\n dependentBlankProps: Map<string, PropertyShapeData[]>;\n};\nlet containmentCache: Containment | null = null;\nlet containmentCacheSize = -1;\n\n/** Gather contains-predicate IRIs and dependent targetClass IRIs from the registry. */\nexport function collectContainment(): Containment {\n const version = getRegistryVersion();\n if (containmentCache && version === containmentCacheSize) {\n return containmentCache;\n }\n const containsPreds = new Set<string>();\n const dependentTypes = new Set<string>();\n const dependentBlankProps = new Map<string, PropertyShapeData[]>();\n // Per targetClass, the predicates some shape targeting it declares NOT blank-capable.\n const plainPredsByType = new Map<string, Set<string>>();\n for (const nodeShape of getAllNodeShapes().values()) {\n if (!nodeShape) continue;\n if (nodeShape.targetClass?.id) {\n const typeId = nodeShape.targetClass.id;\n for (const ps of getPropertyShapes(nodeShape, true)) {\n const predicate = getSimplePathId(ps.path);\n if (!predicate || isBlankCapable(ps)) continue;\n if (!plainPredsByType.has(typeId)) plainPredsByType.set(typeId, new Set());\n plainPredsByType.get(typeId)!.add(predicate);\n }\n }\n if ((nodeShape as {dependent?: boolean}).dependent && nodeShape.targetClass?.id) {\n const typeId = nodeShape.targetClass.id;\n dependentTypes.add(typeId);\n const blank = getPropertyShapes(nodeShape, true).filter(isBlankCapable);\n if (blank.length > 0) {\n dependentBlankProps.set(typeId, [...(dependentBlankProps.get(typeId) ?? []), ...blank]);\n }\n }\n const propertyShapes = getPropertyShapes(nodeShape, false);\n for (const ps of propertyShapes) {\n if ((ps as {contains?: boolean}).contains) {\n const predId = getSimplePathId(ps.path);\n if (predId) containsPreds.add(predId);\n }\n }\n }\n // A typed node only says its class, not which of the shapes targeting it wrote it. When the\n // shapes disagree on a predicate (`PathList.first` is blank-capable, `List.first` is not, both\n // target `rdf:List`), the cascade does not follow it: a user list's blank `rdf:first` member\n // is content the list does not own.\n for (const [typeId, props] of dependentBlankProps) {\n const plain = plainPredsByType.get(typeId);\n if (!plain) continue;\n const kept = props.filter((ps) => {\n const predicate = getSimplePathId(ps.path);\n return !!predicate && !plain.has(predicate);\n });\n if (kept.length > 0) dependentBlankProps.set(typeId, kept);\n else dependentBlankProps.delete(typeId);\n }\n containmentCache = {containsPreds: [...containsPreds], dependentTypes: [...dependentTypes], dependentBlankProps};\n containmentCacheSize = version;\n return containmentCache;\n}\n\nlet reachableCache = new Map<string, string[]>();\nlet reachableCacheVersion = -1;\n\n/**\n * The dependent targetClasses a subject delete of `shapeId` can reach through `contains`\n * edges, in `collectContainment` order. A subject delete emits one cascade block per type it\n * returns, and each block is a property-path closure per subject, so a shape that owns only\n * non-dependent values (every `Thing.image` owner) pays for none.\n *\n * The walk starts at the shape and its registered sub-shapes and follows every flattened\n * property on a `contains` predicate (the registry-wide predicate rule the cascade path uses)\n * to its value shape and that shape's sub-shapes. A property on a `contains` predicate with no\n * value shape is polymorphic (`sh:path`) and may reach anything, so it yields every dependent\n * type; that keeps the shape-sync delete of a NodeShape exact.\n */\nfunction reachableDependentTypes(shapeId: string): string[] {\n const version = getRegistryVersion();\n if (version !== reachableCacheVersion) {\n reachableCache = new Map();\n reachableCacheVersion = version;\n }\n const cached = reachableCache.get(shapeId);\n if (cached) return cached;\n\n const {containsPreds, dependentTypes} = collectContainment();\n const shapeOf = (id: string) => getShapeClass(id)?.shape ?? getNodeShape(id);\n const reached = new Set<string>();\n // Shapes whose instances an owned edge can lead to. The start shapes join only when an\n // edge leads back to them (a dependent shape that owns its own kind, like a list cell).\n const owned = new Set<string>();\n const seen = new Set<string>();\n const queue: string[] = [];\n const visit = (id: string, viaEdge: boolean) => {\n for (const sid of [id, ...getSubShapes(id).map((sub) => sub.id)]) {\n if (viaEdge) owned.add(sid);\n if (seen.has(sid)) continue;\n seen.add(sid);\n queue.push(sid);\n }\n };\n visit(shapeId, false);\n let everything = false;\n while (queue.length > 0 && !everything) {\n const nodeShape = shapeOf(queue.shift()!);\n if (!nodeShape) continue;\n for (const ps of getPropertyShapes(nodeShape, true)) {\n const predicate = getSimplePathId(ps.path);\n if (!predicate || !containsPreds.includes(predicate)) continue;\n if (!ps.valueShape?.id) {\n everything = true;\n break;\n }\n visit(ps.valueShape.id, true);\n }\n }\n if (!everything) {\n for (const id of owned) {\n const nodeShape = shapeOf(id);\n const dependent = (nodeShape as {dependent?: boolean} | undefined)?.dependent;\n if (dependent && nodeShape?.targetClass?.id) {\n reached.add(nodeShape.targetClass.id);\n }\n }\n }\n const result = everything ? dependentTypes : dependentTypes.filter((t) => reached.has(t));\n reachableCache.set(shapeId, result);\n return result;\n}\n\n// ---------------------------------------------------------------------------\n// Blank-node cascade: blank values are deleted through the blank-capable properties\n// (`isBlankCapable`) that hold them, never through `contains`.\n// ---------------------------------------------------------------------------\n\nconst shapeById = (id: string) => getShapeClass(id)?.shape ?? getNodeShape(id);\n\n/** The blank-capable property shapes of a shape (own and inherited) and of its sub-shapes. */\nfunction blankCapableProperties(shapeId: string): PropertyShapeData[] {\n const out: PropertyShapeData[] = [];\n for (const sid of [shapeId, ...getSubShapes(shapeId).map((sub) => sub.id)]) {\n const nodeShape = shapeById(sid);\n if (!nodeShape) continue;\n for (const ps of getPropertyShapes(nodeShape, true)) {\n if (isBlankCapable(ps)) out.push(ps);\n }\n }\n return out;\n}\n\n/** The simple-path predicates of property shapes, deduplicated in order. */\nfunction simplePredicates(props: PropertyShapeData[]): string[] {\n const predicates = new Set<string>();\n for (const ps of props) {\n const predicate = getSimplePathId(ps.path);\n if (predicate) predicates.add(predicate);\n }\n return [...predicates];\n}\n\nlet blankWalkCache = new Map<string, string[]>();\nlet blankWalkCacheVersion = -1;\n\n/**\n * The predicates the blank-node cascade follows *below* a blank value held by one of `start`:\n * the blank-capable properties of every shape the value (and, transitively, its blank values)\n * can have — a property's value shape and its sub-shapes. A blank-capable property without a\n * value shape is polymorphic (`sh:path`, the `PathNode` slots, `PathList.first`) and may hold\n * any shape, so it yields every blank-capable predicate in the registry, the same rule\n * `reachableDependentTypes` applies to `contains`. Precision is not what keeps the walk safe:\n * `buildBlankCascade` refuses any node reached through an IRI.\n */\nfunction blankWalkPredicates(start: PropertyShapeData[]): string[] {\n const version = getRegistryVersion();\n if (version !== blankWalkCacheVersion) {\n blankWalkCache = new Map();\n blankWalkCacheVersion = version;\n }\n const key = start.map((ps) => ps.id).join('|');\n const cached = blankWalkCache.get(key);\n if (cached) return cached;\n\n let everything = false;\n const predicates: PropertyShapeData[] = [];\n const seen = new Set<string>();\n const queue: string[] = [];\n const follow = (ps: PropertyShapeData) => {\n if (!ps.valueShape?.id) {\n everything = true;\n return;\n }\n if (!seen.has(ps.valueShape.id)) {\n seen.add(ps.valueShape.id);\n queue.push(ps.valueShape.id);\n }\n };\n start.forEach(follow);\n while (queue.length > 0 && !everything) {\n for (const ps of blankCapableProperties(queue.shift()!)) {\n predicates.push(ps);\n follow(ps);\n }\n }\n if (everything) {\n predicates.length = 0;\n for (const nodeShape of getAllNodeShapes().values()) {\n if (!nodeShape) continue;\n for (const ps of getPropertyShapes(nodeShape, false)) {\n if (isBlankCapable(ps)) predicates.push(ps);\n }\n }\n }\n const result = simplePredicates(predicates);\n blankWalkCache.set(key, result);\n return result;\n}\n\n/** A SPARQL property-path term over `predicates`: `(p1|…|pn)`, then `*` / `+` when given. */\nfunction predicatePathTerm(predicates: string[], repeat?: 'zeroOrMore' | 'oneOrMore'): SparqlTerm {\n const step: PathExpr =\n predicates.length === 1 ? {id: predicates[0]} : {alt: predicates.map((id) => ({id}))};\n const expr: PathExpr = repeat === 'zeroOrMore' ? {zeroOrMore: step} : repeat === 'oneOrMore' ? {oneOrMore: step} : step;\n return {kind: 'path', value: pathExprToSparql(expr), uris: collectPathUris(expr)};\n}\n\nconst isBlankExpr = (name: string): SparqlExpression => ({\n kind: 'function_expr',\n name: 'isBlank',\n args: [{kind: 'variable_expr', name}],\n});\n\n/**\n * One UNION branch that deletes the blank values `owner` holds through `first`, and every blank\n * node below them through `inner`:\n *\n * ```sparql\n * DELETE { ?bn ?bnp ?bno }\n * WHERE {\n * …ownerTriples… <owner> (first…) ?bn0 . FILTER(isBlank(?bn0))\n * ?bn0 (inner…)* ?bn . ?bn ?bnp ?bno . FILTER(isBlank(?bn))\n * FILTER NOT EXISTS { ?bn0 (inner…)* ?mid . ?mid (inner…)+ ?bn . FILTER(!isBlank(?mid)) }\n * }\n * ```\n *\n * `first: null` means the owner term *is* the blank value (the old value of a replaced\n * blank-capable property, bound by `ownerTriples`). Every deleted node is a blank node, so no IRI\n * — a predicate such as `schema:image`, an entity a list merely lists — is ever deleted. The\n * `NOT EXISTS` refuses a blank node reached *through* an IRI: a property path cannot constrain\n * the nodes between its ends, and the walk may include every blank-capable predicate\n * (`blankWalkPredicates`), so without it a blank list's `rdf:first` could lead into a listed\n * entity and delete that entity's blank values. Blank structures core writes are trees, so the\n * guard removes nothing they own. Returns null when there is nothing to follow.\n */\nfunction buildBlankCascade(\n ownerTriples: SparqlTriple[],\n ownerTerm: SparqlTerm,\n first: string[] | null,\n inner: string[],\n varPrefix: string,\n): {deletePatterns: SparqlTriple[]; whereBlock: SparqlAlgebraNode} | null {\n if (first !== null && first.length === 0) return null;\n let bn0Name: string;\n const reach: SparqlTriple[] = [...ownerTriples];\n if (first === null) {\n if (ownerTerm.kind !== 'variable') return null;\n bn0Name = ownerTerm.name;\n } else {\n bn0Name = `${varPrefix}bn0`;\n reach.push(tripleOf(ownerTerm, predicatePathTerm(first), varTerm(bn0Name)));\n }\n const bn0 = varTerm(bn0Name);\n const reached: SparqlAlgebraNode = {\n type: 'filter',\n expression: isBlankExpr(bn0Name),\n inner: {type: 'bgp', triples: reach},\n };\n const bp = varTerm(`${varPrefix}bnp`);\n const bo = varTerm(`${varPrefix}bno`);\n if (inner.length === 0) {\n const own = tripleOf(bn0, bp, bo);\n return {\n deletePatterns: [own],\n whereBlock: {type: 'join', left: reached, right: {type: 'bgp', triples: [own]}},\n };\n }\n const bnName = `${varPrefix}bn`;\n const bn = varTerm(bnName);\n const mid = varTerm(`${varPrefix}bnm`);\n const own = tripleOf(bn, bp, bo);\n const throughIri: SparqlExpression = {\n kind: 'exists_expr',\n negated: true,\n pattern: {\n type: 'filter',\n expression: {kind: 'not_expr', inner: isBlankExpr(`${varPrefix}bnm`)},\n inner: {\n type: 'bgp',\n triples: [\n tripleOf(bn0, predicatePathTerm(inner, 'zeroOrMore'), mid),\n tripleOf(mid, predicatePathTerm(inner, 'oneOrMore'), bn),\n ],\n },\n },\n };\n return {\n deletePatterns: [own],\n whereBlock: {\n type: 'filter',\n expression: {kind: 'logical_expr', op: 'and', exprs: [isBlankExpr(bnName), throughIri]},\n inner: {\n type: 'join',\n // Filter the blank values before the inner walk runs from each of them.\n left: reached,\n right: {\n type: 'bgp',\n triples: [tripleOf(bn0, predicatePathTerm(inner, 'zeroOrMore'), bn), own],\n },\n },\n },\n };\n}\n\n/**\n * The blank-node cascade of a subject: its blank values through the blank-capable properties of\n * its shape, and their blank descendants. `ownerTriples` anchors a variable subject (the bulk\n * deletes pass its type triple).\n */\nfunction subjectBlankCascade(\n shapeId: string,\n subjectTerm: SparqlTerm,\n ownerTriples: SparqlTriple[],\n varPrefix: string,\n): {deletePatterns: SparqlTriple[]; whereBlock: SparqlAlgebraNode} | null {\n const props = blankCapableProperties(shapeId);\n if (props.length === 0) return null;\n return buildBlankCascade(ownerTriples, subjectTerm, simplePredicates(props), blankWalkPredicates(props), varPrefix);\n}\n\n/**\n * Build DELETE patterns + WHERE OPTIONAL blocks that cascade-delete the owned subtree\n * reachable from `rootTerm` via `contains` edges. `varPrefix` keeps generated variables\n * unique across multiple roots in one query. Returns empty when nothing is owned.\n *\n * `anchor`, when given, leads every block: the triple that binds a variable root, so\n * each block stays correct on its own (as a UNION branch) when no such root exists.\n * `onlyTypes`, when given, restricts the blocks to those dependent types (a subject delete\n * passes the types its shape can reach); by default every registered dependent type gets one.\n */\nexport function buildOwnedCascade(\n rootTerm: SparqlTerm,\n varPrefix: string,\n anchor?: SparqlTriple,\n keep?: SparqlTerm[],\n onlyTypes?: string[],\n): {deletePatterns: SparqlTriple[]; whereOptionals: SparqlAlgebraNode[]} {\n const containment = collectContainment();\n const {containsPreds} = containment;\n const dependentTypes = onlyTypes ?? containment.dependentTypes;\n if (containsPreds.length === 0 || dependentTypes.length === 0) {\n return {deletePatterns: [], whereOptionals: []};\n }\n // (c1|c2|…)* — zero or more contains edges, so the root itself is matched when it is\n // dependent-typed. That is what cleans up the value of a `contains` property that has\n // no value shape (a polymorphic slot like `sh:path`): it is deleted only when it is a\n // dependent node, never when it is a shared IRI. On a subject delete `*` also matches\n // the subject, which is being deleted anyway.\n const pathExpr: PathExpr =\n containsPreds.length === 1\n ? {zeroOrMore: {id: containsPreds[0]}}\n : {zeroOrMore: {alt: containsPreds.map((id) => ({id}))}};\n const pathTerm: SparqlTerm = {\n kind: 'path',\n value: pathExprToSparql(pathExpr),\n uris: collectPathUris(pathExpr),\n };\n\n const deletePatterns: SparqlTriple[] = [];\n const whereOptionals: SparqlAlgebraNode[] = [];\n dependentTypes.forEach((typeId, i) => {\n const owned = varTerm(`${varPrefix}own${i}`);\n const p = varTerm(`${varPrefix}op${i}`);\n const o = varTerm(`${varPrefix}ov${i}`);\n deletePatterns.push(tripleOf(owned, p, o));\n whereOptionals.push(\n keepFilter(\n {\n type: 'bgp',\n triples: [\n ...(anchor ? [anchor] : []),\n tripleOf(rootTerm, pathTerm, owned),\n tripleOf(owned, iriTerm(RDF_TYPE), iriTerm(typeId)),\n tripleOf(owned, p, o),\n ],\n },\n rootTerm,\n keep,\n ),\n );\n });\n\n // The blank values of every dependent node deleted above, through the blank-capable\n // properties of its type's shapes (a property shape's `sh:path`). Blank nodes carry no type,\n // so the typed blocks cannot see them; see `buildBlankCascade`.\n dependentTypes.forEach((typeId, i) => {\n const props = containment.dependentBlankProps.get(typeId);\n if (!props) return;\n const owner = varTerm(`${varPrefix}bo${i}`);\n const cascade = buildBlankCascade(\n [\n ...(anchor ? [anchor] : []),\n tripleOf(rootTerm, pathTerm, owner),\n tripleOf(owner, iriTerm(RDF_TYPE), iriTerm(typeId)),\n ],\n owner,\n simplePredicates(props),\n blankWalkPredicates(props),\n `${varPrefix}b${i}_`,\n );\n if (!cascade) return;\n deletePatterns.push(...cascade.deletePatterns);\n whereOptionals.push(keepFilter(cascade.whereBlock, rootTerm, keep));\n });\n return {deletePatterns, whereOptionals};\n}\n\n/**\n * Wrap an owned-cleanup block in `FILTER(?old NOT IN (<k1>, …))` so a value the mutation\n * keeps (re-sent as a bare `{id}`) is not deleted. The filter sits inside the block, next\n * to the edge triple that binds `?old`, so it only removes that block's matches; the\n * edge-only delete of the same value stays and is undone by the INSERT. With an IRI old\n * term, or nothing to keep, the block is returned unchanged.\n */\nfunction keepFilter(\n block: SparqlAlgebraNode,\n oldTerm: SparqlTerm,\n keep?: SparqlTerm[],\n): SparqlAlgebraNode {\n const kept = (keep ?? []).flatMap((term) =>\n term.kind === 'iri' ? [{kind: 'iri_expr' as const, value: term.value}] : [],\n );\n if (oldTerm.kind !== 'variable' || kept.length === 0) return block;\n return {\n type: 'filter',\n expression: {\n kind: 'in_expr',\n negated: true,\n value: {kind: 'variable_expr', name: oldTerm.name},\n list: kept,\n },\n inner: block,\n };\n}\n\n/**\n * Build DELETE + WHERE OPTIONAL that removes the *old node's own* one-hop triples when a\n * `contains` edge is replaced, unset, or set-removed. A `contains` edge asserts exclusive\n * ownership, so overwriting it must delete the previously owned child fully — not merely\n * unlink it — or the child orphans (backlog 032). This is `contains`-driven and deliberately\n * does NOT require the child shape to be `dependent`: ownership via the edge is sufficient.\n * Owned descendants *below* the old node are cascaded separately by `buildOwnedCascade`.\n *\n * Callers use it only for a property that declares a value shape. A shape-less `contains`\n * slot (like `sh:path`) may hold a shared IRI, so its old value is left to\n * `buildOwnedCascade`, which deletes it only when it is dependent-typed.\n *\n * The owning edge `<subject> <prop> ?old` is re-asserted INSIDE the WHERE group so `?old`\n * is bound there: when no old value exists the group matches nothing and the DELETE is a\n * no-op, rather than an unbound `?old` matching (and deleting) the whole graph. When\n * `oldTerm` is a concrete IRI (set-remove), the guard just confirms the link still holds.\n *\n * `keep` lists the bare `{id}`s the mutation writes again (a re-sent current value, the\n * retained ids of an array overwrite). With a variable `oldTerm` the block is wrapped in\n * `FILTER(?old NOT IN (…))`, so a kept value is not deleted; its edge is deleted and\n * re-inserted, a no-op. A nested create carrying an id is never kept: it rewrites that node.\n */\nexport function buildOwnedSelfDelete(\n subjectTerm: SparqlTerm,\n propertyTerm: SparqlTerm,\n oldTerm: SparqlTerm,\n varPrefix: string,\n keep?: SparqlTerm[],\n): {deletePatterns: SparqlTriple[]; whereOptionals: SparqlAlgebraNode[]} {\n const p = varTerm(`${varPrefix}sp`);\n const o = varTerm(`${varPrefix}so`);\n const wildcard = tripleOf(oldTerm, p, o);\n return {\n deletePatterns: [wildcard],\n whereOptionals: [\n keepFilter(\n {\n type: 'bgp',\n triples: [tripleOf(subjectTerm, propertyTerm, oldTerm), wildcard],\n },\n oldTerm,\n keep,\n ),\n ],\n };\n}\n\n/**\n * Converts an IRDeleteMutation to a SparqlDeleteInsertPlan (DELETE + WHERE).\n *\n * The WHERE is the type guard of every id, joined with ONE UNION of independent\n * blocks: per id its own triples, its incoming references and, for a shape that\n * owns something, one block per immediately-owned child (`<s> <p> ?dN . ?dN ?dN_p ?dN_o`,\n * for each of the shape's own and inherited `contains` properties with a value shape and\n * a simple path) and one block per dependent type its owned subtree can reach\n * (`reachableDependentTypes`; none for a shape that owns only non-dependent values). The\n * bulk deletes (`deleteAllToAlgebra`, `deleteWhereToAlgebra`) add the same owned blocks,\n * rooted at the subject variable (see `bulkDeleteUnion`).\n *\n * The blocks must not be chained as OPTIONALs. A chain of OPTIONALs is a join, so\n * the solutions multiply: own triples x incoming references x owned triples of each\n * dependent type. Deleting one shape description with the shape sync's cascade\n * produced ~27,000 solutions for ~130 triples and took over 30 seconds on Fuseki,\n * which re-evaluates the cascade property path for every left-hand row. A UNION\n * yields each block's matches once, so the solutions add up instead, and it deletes\n * exactly the same triples: a DELETE template triple whose variables a solution\n * leaves unbound is skipped, as it was for an OPTIONAL that did not match.\n *\n * The guards stay required for every id, as before: when any id is not of the\n * shape, the WHERE has no solution and nothing is deleted.\n */\nexport function deleteToAlgebra(\n query: IRDeleteMutation,\n _options?: SparqlOptions,\n): SparqlDeleteInsertPlan {\n const deletePatterns: SparqlTriple[] = [];\n const guards: SparqlTriple[] = [];\n const blocks: SparqlAlgebraNode[] = [];\n const hasContains = shapeHasContainsProperty(query.shape);\n const ownedChildPredicates = hasContains ? ownedValueShapePredicates(query.shape) : [];\n const cascadeTypes = hasContains ? reachableDependentTypes(query.shape) : [];\n\n for (let i = 0; i < query.ids.length; i++) {\n const subjectTerm = iriTerm(query.ids[i].id);\n const idx = query.ids.length > 1 ? `_${i}` : '';\n\n const subjWild = tripleOf(subjectTerm, varTerm(`p${idx}`), varTerm(`o${idx}`));\n const objWild = tripleOf(varTerm(`s${idx}`), varTerm(`p2${idx}`), subjectTerm);\n const typeGuard = tripleOf(subjectTerm, iriTerm(RDF_TYPE), iriTerm(resolveShapeScanIri(query.shape)));\n\n // DELETE block: all patterns (subject-wildcard, object-wildcard, type)\n deletePatterns.push(subjWild, objWild, typeGuard);\n\n // WHERE: the type guard is required; the subject's own triples and its\n // incoming references (the entity may have none) are separate UNION blocks.\n guards.push(typeGuard);\n blocks.push({type: 'bgp', triples: [subjWild]}, {type: 'bgp', triples: [objWild]});\n\n // The immediately-owned children: for every `contains` property with a value shape,\n // the child's own one-hop triples, as a replace or a set-remove deletes them. No type\n // guard and no reference check: the `contains` edge alone asserts ownership.\n ownedChildPredicates.forEach((predicate, n) => {\n const child = varTerm(`d${n}${idx}`);\n const childOwn = tripleOf(child, varTerm(`d${n}${idx}_p`), varTerm(`d${n}${idx}_o`));\n deletePatterns.push(childOwn);\n blocks.push({\n type: 'bgp',\n triples: [tripleOf(subjectTerm, iriTerm(predicate), child), childOwn],\n });\n // …and the child's own blank values.\n for (const blank of ownedChildBlankCascade(\n query.shape,\n predicate,\n child,\n [tripleOf(subjectTerm, iriTerm(predicate), child)],\n `d${n}${idx}_b`,\n )) {\n deletePatterns.push(...blank.deletePatterns);\n blocks.push(blank.whereBlock);\n }\n });\n\n // The subject's own blank values (through its blank-capable properties) and the blank\n // nodes below them.\n const blank = subjectBlankCascade(query.shape, subjectTerm, [], `b${idx}_`);\n if (blank) {\n deletePatterns.push(...blank.deletePatterns);\n blocks.push(blank.whereBlock);\n }\n\n // Cascade-delete the owned subtree — only for shapes that actually own something\n // (have a `contains` property); a plain entity delete is left untouched.\n if (hasContains && cascadeTypes.length > 0) {\n const cascade = buildOwnedCascade(\n subjectTerm,\n `c${idx}_`,\n undefined,\n undefined,\n cascadeTypes,\n );\n deletePatterns.push(...cascade.deletePatterns);\n blocks.push(...cascade.whereOptionals);\n }\n }\n\n const whereAlgebra: SparqlAlgebraNode = {\n type: 'join',\n left: {type: 'bgp', triples: guards},\n right: unionOf(blocks),\n };\n\n return {\n type: 'delete_insert',\n deletePatterns,\n insertPatterns: [],\n whereAlgebra,\n };\n}\n\n/**\n * The cleanup blocks of a bulk delete, already joined with the root's own triples as ONE\n * UNION so their matches add up instead of multiplying; `null` when there is nothing to\n * clean up (the root wildcard then stays in the required BGP).\n *\n * - The blank-node cascade of the shape's blank-capable properties (`subjectBlankCascade`).\n * - For a shape that owns something (a `contains` property), the same owned cleanup as a\n * delete by id: the immediately-owned children of every `contains` property with a value\n * shape, and the dependent cascade, rooted at the subject variable. Each owned block is led\n * by the subject's type triple. With a linear join it is redundant; it keeps a branch that\n * is evaluated on its own from running `?a0 (c…)* ?own` with both ends unbound, which\n * matches every node in the graph.\n */\nfunction bulkDeleteUnion(\n shapeId: string,\n subjectVar: string,\n rootWildcard: SparqlTriple,\n typeTriple: SparqlTriple,\n deletePatterns: SparqlTriple[],\n): SparqlAlgebraNode | null {\n const blocks: SparqlAlgebraNode[] = [];\n const blank = subjectBlankCascade(shapeId, varTerm(subjectVar), [typeTriple], 'b_');\n if (blank) {\n deletePatterns.push(...blank.deletePatterns);\n blocks.push(blank.whereBlock);\n }\n if (shapeHasContainsProperty(shapeId)) {\n const subject = varTerm(subjectVar);\n ownedValueShapePredicates(shapeId).forEach((predicate, n) => {\n const child = varTerm(`d${n}`);\n const childOwn = tripleOf(child, varTerm(`d${n}_p`), varTerm(`d${n}_o`));\n deletePatterns.push(childOwn);\n blocks.push({\n type: 'bgp',\n triples: [typeTriple, tripleOf(subject, iriTerm(predicate), child), childOwn],\n });\n for (const blank of ownedChildBlankCascade(\n shapeId,\n predicate,\n child,\n [typeTriple, tripleOf(subject, iriTerm(predicate), child)],\n `d${n}_b`,\n )) {\n deletePatterns.push(...blank.deletePatterns);\n blocks.push(blank.whereBlock);\n }\n });\n const cascadeTypes = reachableDependentTypes(shapeId);\n if (cascadeTypes.length > 0) {\n const cascade = buildOwnedCascade(subject, 'c_', typeTriple, undefined, cascadeTypes);\n deletePatterns.push(...cascade.deletePatterns);\n blocks.push(...cascade.whereOptionals);\n }\n }\n if (blocks.length === 0) return null;\n return unionOf([{type: 'bgp', triples: [rootWildcard]}, ...blocks]);\n}\n\n/**\n * Converts an IRDeleteAllMutation to a SparqlDeleteInsertPlan.\n *\n * Generates DELETE { ?a0 ?p ?o . [blank-node and owned-cleanup wildcards] }\n * WHERE { ?a0 a <Shape> . { ?a0 ?p ?o } UNION [one block per blank node,\n * owned child and dependent type] }\n * (see `bulkDeleteUnion`). Unlike a delete by id, incoming references are not deleted.\n */\nexport function deleteAllToAlgebra(\n query: IRDeleteAllMutation,\n _options?: SparqlOptions,\n): SparqlDeleteInsertPlan {\n const subjectVar = 'a0';\n\n // DELETE patterns: root wildcard\n const deletePatterns: SparqlTriple[] = [\n tripleOf(varTerm(subjectVar), varTerm('p'), varTerm('o')),\n ];\n\n // WHERE: type triple, then the root wildcard and the blank-node cleanup\n const typeTriple = tripleOf(varTerm(subjectVar), iriTerm(RDF_TYPE), iriTerm(resolveShapeScanIri(query.shape)));\n const rootWildcard = tripleOf(varTerm(subjectVar), varTerm('p'), varTerm('o'));\n const union = bulkDeleteUnion(query.shape, subjectVar, rootWildcard, typeTriple, deletePatterns);\n const whereAlgebra: SparqlAlgebraNode = union\n ? {type: 'join', left: {type: 'bgp', triples: [typeTriple]}, right: union}\n : {type: 'bgp', triples: [typeTriple, rootWildcard]};\n\n return {\n type: 'delete_insert',\n deletePatterns,\n insertPatterns: [],\n whereAlgebra,\n };\n}\n\n/**\n * Converts an IRDeleteWhereMutation to a SparqlDeleteInsertPlan.\n *\n * Like deleteAllToAlgebra but adds filter conditions from the where clause. The cleanup\n * UNION (blank nodes, owned children, dependent cascade) is joined with the filtered match,\n * so only the matched subjects' children are deleted.\n */\nexport function deleteWhereToAlgebra(\n query: IRDeleteWhereMutation,\n _options?: SparqlOptions,\n): SparqlDeleteInsertPlan {\n const subjectVar = 'a0';\n const registry = new VariableRegistry();\n\n // DELETE patterns: root wildcard\n const deletePatterns: SparqlTriple[] = [\n tripleOf(varTerm(subjectVar), varTerm('p'), varTerm('o')),\n ];\n\n // WHERE: type triple + the where clause; the root wildcard and blank-node cleanup follow\n const typeTriple = tripleOf(varTerm(subjectVar), iriTerm(RDF_TYPE), iriTerm(resolveShapeScanIri(query.shape)));\n const rootWildcard = tripleOf(varTerm(subjectVar), varTerm('p'), varTerm('o'));\n const union = bulkDeleteUnion(query.shape, subjectVar, rootWildcard, typeTriple, deletePatterns);\n let whereAlgebra: SparqlAlgebraNode = {\n type: 'bgp',\n triples: union ? [typeTriple] : [typeTriple, rootWildcard],\n };\n\n // Process where patterns (traversals from the where clause)\n const traverseTriples: SparqlTriple[] = [];\n const optionalPropertyTriples: SparqlTriple[] = [];\n for (const pattern of query.wherePatterns) {\n processPattern(pattern, registry, traverseTriples, optionalPropertyTriples);\n }\n\n // Add traverse triples to required BGP\n if (traverseTriples.length > 0) {\n whereAlgebra = joinNodes(whereAlgebra, {type: 'bgp', triples: traverseTriples});\n }\n\n // Process expression to discover property triples\n processExpressionForProperties(query.where, registry, optionalPropertyTriples);\n\n // Add optional property triples\n for (const triple of optionalPropertyTriples) {\n whereAlgebra = joinNodes(whereAlgebra, {type: 'bgp', triples: [triple]});\n }\n\n // Convert and add filter expression\n const filterExpr = convertExpression(query.where, registry, []);\n whereAlgebra = {type: 'filter', expression: filterExpr, inner: whereAlgebra};\n\n if (union) {\n whereAlgebra = {type: 'join', left: whereAlgebra, right: union};\n }\n\n return {\n type: 'delete_insert',\n deletePatterns,\n insertPatterns: [],\n whereAlgebra,\n };\n}\n\n/**\n * Converts an IRUpdateWhereMutation to a SparqlDeleteInsertPlan.\n *\n * Like updateToAlgebra but uses a variable subject (?a0) instead of a\n * hardcoded entity IRI, adds a type triple, and optionally includes\n * filter conditions from the where clause.\n */\nexport function updateWhereToAlgebra(\n query: IRUpdateWhereMutation,\n options?: SparqlOptions,\n): SparqlDeleteInsertPlan {\n const subjectTerm = varTerm('a0');\n const result = processUpdateFields(query.data, subjectTerm, options);\n\n // WHERE: type triple is always required\n const typeTriple = tripleOf(subjectTerm, iriTerm(RDF_TYPE), iriTerm(resolveShapeScanIri(query.data.shape)));\n let whereAlgebra: SparqlAlgebraNode = {type: 'bgp', triples: [typeTriple]};\n\n // Process where filter conditions (if any)\n if (query.where && query.wherePatterns) {\n const registry = new VariableRegistry();\n const traverseTriples: SparqlTriple[] = [];\n const optionalPropertyTriples: SparqlTriple[] = [];\n\n for (const pattern of query.wherePatterns) {\n processPattern(pattern, registry, traverseTriples, optionalPropertyTriples);\n }\n\n if (traverseTriples.length > 0) {\n whereAlgebra = joinNodes(whereAlgebra, {type: 'bgp', triples: traverseTriples});\n }\n\n processExpressionForProperties(query.where, registry, optionalPropertyTriples);\n\n for (const triple of optionalPropertyTriples) {\n whereAlgebra = joinNodes(whereAlgebra, {type: 'bgp', triples: [triple]});\n }\n\n const filterExpr = convertExpression(query.where, registry, []);\n whereAlgebra = {type: 'filter', expression: filterExpr, inner: whereAlgebra};\n }\n\n // Old-value triples anchored on a traversal *target* belong INSIDE that\n // traversal's OPTIONAL group, not beside it: beside it, the leaf's subject variable\n // is introduced by an OPTIONAL that shares no variable with anything to its left — a\n // cartesian product over every node carrying that predicate. `buildUpdateWhere` does\n // that split for both update paths.\n whereAlgebra = buildUpdateWhere(whereAlgebra, result, query.traversalPatterns, subjectTerm);\n\n return {\n type: 'delete_insert',\n deletePatterns: result.deletePatterns,\n insertPatterns: result.insertPatterns,\n whereAlgebra,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Ask conversion\n// ---------------------------------------------------------------------------\n\n/**\n * Converts an {@link IRAskQuery} to a {@link SparqlAskPlan}.\n *\n * Two cases:\n *\n * - **Rootless** (no shape scan) — a bare subject, emitted as `<iri> ?p ?o`. This\n * is \"does a node with this IRI exist at all\", with no `rdf:type` constraint.\n * - **Shaped** — the pattern is built by {@link selectToAlgebra}, so shape scans,\n * traversals, filters and `MINUS` have exactly one implementation. Only the\n * pattern is kept; the select plan's projection is discarded.\n *\n * `IRAskQuery` has no projection, `orderBy`, `limit` or `offset` to ignore or\n * reject — an `ASK` cannot express them, so the IR cannot carry them. The one\n * thing that *does* need guarding is an aggregate in the where clause, which\n * lowers to `GROUP BY` + `HAVING` rather than to a `FILTER`; see below.\n */\nexport function askToAlgebra(\n query: IRAskQuery,\n options?: SparqlOptions,\n): SparqlAskPlan {\n if (!query.root) {\n if (!query.subjectId) {\n throw new Error(\n 'askToAlgebra: a shapeless ask needs a subject — there is no shape to scan ' +\n 'and no subject to test, so the query matches every node in the store.',\n );\n }\n // ASK { <iri> ?p ?o } — existence of the node itself, under any type or none.\n const bgp: SparqlBGP = {\n type: 'bgp',\n triples: [\n tripleOf(iriTerm(query.subjectId), varTerm('p'), varTerm('o')),\n ],\n };\n return {type: 'ask', algebra: bgp};\n }\n const inner = selectToAlgebra(\n {\n kind: 'select',\n root: query.root,\n patterns: query.patterns,\n projection: [],\n where: query.where,\n subjectId: query.subjectId,\n subjectIds: query.subjectIds,\n },\n options,\n );\n if (inner.having) {\n // Same trap as in `countToAlgebra`: an aggregate in the WHERE clause (e.g.\n // `p.friends.size().gt(2)`) lowers to HAVING + GROUP BY on the select plan, and\n // only `algebra` is carried over here — so the HAVING would vanish and the ASK\n // would answer the UNFILTERED question, `true` for any store holding one\n // instance of the shape. A boolean of the right type for the wrong question is\n // worse than an error: nothing downstream can tell. Asking it properly needs\n // `ASK { SELECT ?a0 WHERE { … } GROUP BY ?a0 HAVING(…) }`, and `SparqlSubSelect`\n // carries no groupBy/having today. Refuse it rather than answer it wrongly.\n throw new Error(\n 'Cannot ask a query whose where clause contains an aggregate (e.g. ' +\n '`.where(p => p.friends.size().gt(2))`). That filter lowers to HAVING over a ' +\n 'per-subject group, and testing whether any group survives needs a nested ' +\n 'sub-SELECT that this layer does not emit yet. Filter without an aggregate, or ' +\n 'run the select and check for rows.',\n );\n }\n return {type: 'ask', algebra: inner.algebra};\n}\n\n/**\n * Converts an {@link IRCountQuery} to a {@link SparqlSelectPlan} shaped as a\n * root-level count:\n *\n * ```sparql\n * SELECT (COUNT(DISTINCT ?a0) AS ?count) WHERE { … }\n * ```\n *\n * The **pattern** is built by {@link selectToAlgebra}, so shape scans, traversals,\n * filters and `MINUS` have exactly one implementation; only the pattern is kept and\n * the select plan's projection is discarded. That discard is load-bearing:\n * `selectToAlgebra` unconditionally projects the root alias as a plain variable, and\n * then makes every plain projected variable a `GROUP BY` target once an aggregate is\n * present — so reusing its projection would yield `SELECT ?a0 (COUNT(…) AS ?count) …\n * GROUP BY ?a0`, one row per entity each counting 1.\n *\n * `DISTINCT` inside the aggregate is likewise load-bearing. A shape scan joined with\n * property triples yields one row per property-value combination (which is why the\n * plain select path emits `SELECT DISTINCT`), so `COUNT(?a0)` would count *rows* and\n * a filter on a multi-valued property would inflate the total. `COUNT(DISTINCT ?a0)`\n * counts subjects, which is what \"how many instances match\" means.\n *\n * There is no `groupBy`, `orderBy`, `limit` or `offset` on the returned plan — and\n * nothing to guard against, because {@link IRCountQuery} cannot carry them.\n */\nexport function countToAlgebra(\n query: IRCountQuery,\n options?: SparqlOptions,\n): SparqlSelectPlan {\n if (!query.root) {\n throw new Error(\n 'countToAlgebra: query.root is undefined. A count needs a shape to scan — a ' +\n 'shapeless count would count every node in the store.',\n );\n }\n const inner = selectToAlgebra(\n {\n kind: 'select',\n root: query.root,\n patterns: query.patterns,\n projection: [],\n where: query.where,\n subjectId: query.subjectId,\n subjectIds: query.subjectIds,\n },\n options,\n );\n if (inner.having) {\n // An aggregate in the WHERE clause (e.g. `p.friends.size().gt(2)`) lowers to\n // HAVING + GROUP BY on the select plan. Only `algebra` is carried over here, so\n // the HAVING would vanish and the count would be of the UNFILTERED match set —\n // a plausible-looking wrong number. Counting a HAVING-filtered group set needs\n // `SELECT (COUNT(DISTINCT ?a0) AS ?count) WHERE { SELECT ?a0 WHERE { … }\n // GROUP BY ?a0 HAVING(…) }`, and `SparqlSubSelect` carries no groupBy/having\n // today. Refuse it rather than answer it wrongly.\n throw new Error(\n 'Cannot count a query whose where clause contains an aggregate (e.g. ' +\n '`.where(p => p.friends.size().gt(2))`). That filter lowers to HAVING over a ' +\n 'per-subject group, and counting the surviving groups needs a nested ' +\n 'sub-SELECT that this layer does not emit yet. Filter without an aggregate, or ' +\n 'count the rows of the select.',\n );\n }\n const aggregate: SparqlAggregateExpr = {\n kind: 'aggregate_expr',\n name: 'count',\n args: [{kind: 'variable_expr', name: query.root.alias}],\n distinct: true,\n };\n return {\n type: 'select',\n algebra: inner.algebra,\n projection: [{kind: 'aggregate', expression: aggregate, alias: query.alias}],\n aggregates: [{variable: query.alias, aggregate}],\n };\n}\n\n// ---------------------------------------------------------------------------\n// Convenience wrappers: IR → algebra → SPARQL string in one call\n// ---------------------------------------------------------------------------\n\n/**\n * Converts an IRSelectQuery to a SPARQL string.\n */\nexport function selectToSparql(\n query: IRSelectQuery,\n options?: SparqlOptions,\n): string {\n const plan = selectToAlgebra(query, options);\n return selectPlanToSparql(plan, options);\n}\n\n/**\n * Converts an {@link IRAskQuery} to a SPARQL `ASK` string.\n */\nexport function askToSparql(\n query: IRAskQuery,\n options?: SparqlOptions,\n): string {\n const plan = askToAlgebra(query, options);\n return askPlanToSparql(plan, options);\n}\n\n/**\n * Converts an {@link IRCountQuery} to a SPARQL `SELECT (COUNT(DISTINCT …) AS …)`\n * string, through the same {@link selectPlanToSparql} every select uses.\n */\nexport function countToSparql(\n query: IRCountQuery,\n options?: SparqlOptions,\n): string {\n const plan = countToAlgebra(query, options);\n return selectPlanToSparql(plan, options);\n}\n\n/**\n * Converts an IRCreateMutation to a SPARQL string.\n * Stub: will be implemented when algebraToString is available.\n */\nexport function createToSparql(\n query: IRCreateMutation,\n options?: SparqlOptions,\n): string {\n const plan = createToAlgebra(query, options);\n return insertDataPlanToSparql(plan, options);\n}\n\n/**\n * Converts an IRUpdateMutation to a SPARQL string.\n * Stub: will be implemented when algebraToString is available.\n */\nexport function updateToSparql(\n query: IRUpdateMutation,\n options?: SparqlOptions,\n): string {\n const plan = updateToAlgebra(query, options);\n return deleteInsertPlanToSparql(plan, options);\n}\n\n/** Lowers an IRUpsertMutation all the way to a SPARQL update string. */\nexport function upsertToSparql(\n query: IRUpsertMutation,\n options?: SparqlOptions,\n): string {\n const plan = upsertToAlgebra(query, options);\n return deleteInsertPlanToSparql(plan, options);\n}\n\n/**\n * Converts an IRDeleteMutation to a SPARQL string.\n */\nexport function deleteToSparql(\n query: IRDeleteMutation,\n options?: SparqlOptions,\n): string {\n const plan = deleteToAlgebra(query, options);\n return deleteInsertPlanToSparql(plan, options);\n}\n\n/**\n * Converts an IRDeleteAllMutation to a SPARQL string.\n */\nexport function deleteAllToSparql(\n query: IRDeleteAllMutation,\n options?: SparqlOptions,\n): string {\n const plan = deleteAllToAlgebra(query, options);\n return deleteInsertPlanToSparql(plan, options);\n}\n\n/**\n * Converts an IRDeleteWhereMutation to a SPARQL string.\n */\nexport function deleteWhereToSparql(\n query: IRDeleteWhereMutation,\n options?: SparqlOptions,\n): string {\n const plan = deleteWhereToAlgebra(query, options);\n return deleteInsertPlanToSparql(plan, options);\n}\n\n/**\n * Converts an IRUpdateWhereMutation to a SPARQL string.\n */\nexport function updateWhereToSparql(\n query: IRUpdateWhereMutation,\n options?: SparqlOptions,\n): string {\n const plan = updateWhereToAlgebra(query, options);\n return deleteInsertPlanToSparql(plan, options);\n}\n"]}
1
+ {"version":3,"file":"irToAlgebra.js","sourceRoot":"","sources":["../../../src/sparql/irToAlgebra.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n IRSelectQuery,\n IRAskQuery,\n IRCountQuery,\n IRCreateMutation,\n IRUpdateMutation,\n IRUpsertMutation,\n IRDeleteMutation,\n IRDeleteAllMutation,\n IRDeleteWhereMutation,\n IRUpdateWhereMutation,\n IRGraphPattern,\n IRExpression,\n IRFieldValue,\n IRNodeData,\n IRSetModificationValue,\n IRTraversePattern,\n} from '../queries/IntermediateRepresentation.js';\nimport {findPropertyShapeById, getPropertyShapes} from '../shapes/nodeShapeData.js';\nimport type {NodeShapeData, PropertyShapeData} from '../shapes/nodeShapeData.js';\nimport type {NodeReferenceValue} from '../utils/NodeReference.js';\nimport {pathExprToSparql, collectPathUris} from '../paths/pathExprToSparql.js';\nimport type {PathExpr} from '../paths/PropertyPathExpr.js';\nimport type {\n SparqlSelectPlan,\n SparqlAskPlan,\n SparqlInsertDataPlan,\n SparqlDeleteInsertPlan,\n SparqlAlgebraNode,\n SparqlBGP,\n SparqlTriple,\n SparqlTerm,\n SparqlExpression,\n SparqlProjectionItem,\n SparqlOrderCondition,\n SparqlAggregateBinding,\n SparqlAggregateExpr,\n SparqlLeftJoin,\n SparqlFilter,\n} from './SparqlAlgebra.js';\nimport {type SparqlOptions, generateEntityUri} from './sparqlUtils.js';\nimport {\n selectPlanToSparql,\n askPlanToSparql,\n insertDataPlanToSparql,\n deleteInsertPlanToSparql,\n} from './algebraToString.js';\nimport {rdf} from '../ontologies/rdf.js';\nimport {shacl} from '../ontologies/shacl.js';\nimport {xsd} from '../ontologies/xsd.js';\nimport {getSimplePathId} from '../paths/normalizePropertyPath.js';\nimport {\n getAllNodeShapes,\n getNodeShape,\n getRegistryVersion,\n getShapeClass,\n getSubShapes,\n getTargetClassId,\n isSubShapeOf,\n} from '../utils/ShapeClass.js';\nimport {UnresolvedContextError} from '../queries/QueryContext.js';\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst RDF_TYPE = rdf.type.id;\nconst RDF_NIL = rdf.nil.id;\nconst XSD_DATETIME = xsd.dateTime.id;\nconst XSD_DATE = xsd.date.id;\nconst XSD_TIME = xsd.time.id;\nconst XSD_BOOLEAN = xsd.boolean.id;\nconst XSD_INTEGER = xsd.integer.id;\nconst XSD_DOUBLE = xsd.double.id;\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/**\n * The IRI terms of triples (subjects, objects, ids of mutations and `.for()` targets) are built\n * here, so this is where a blank-node label used as an id is refused: `_:b0` is SPARQL /\n * N-Triples blank-node syntax, never an IRI (an IRI scheme starts with a letter). Filter\n * expressions build their IRIs separately (`iri_expr`) and are not checked.\n */\nfunction iriTerm(value: string): SparqlTerm {\n if (typeof value === 'string' && value.startsWith('_:')) {\n throw new Error(\n `${JSON.stringify(value)} is a blank-node label, not an IRI. A blank node has no id to ` +\n `address it by: it cannot be linked, updated with update().for() or deleted by id. ` +\n `Change it through the property that holds it (replace or unset that property, or ` +\n `delete its owner).`,\n );\n }\n return {kind: 'iri', value};\n}\n\nfunction varTerm(name: string): SparqlTerm {\n return {kind: 'variable', name};\n}\n\nfunction literalTerm(value: string, datatype?: string): SparqlTerm {\n if (datatype) {\n return {kind: 'literal', value, datatype};\n }\n return {kind: 'literal', value};\n}\n\nfunction tripleOf(\n subject: SparqlTerm,\n predicate: SparqlTerm,\n object: SparqlTerm,\n): SparqlTriple {\n return {subject, predicate, object};\n}\n\n/**\n * Resolve the shape a query scans to the IRI written and matched as its `rdf:type`.\n *\n * That IRI is the shape's declared `targetClass` — a node in its own right, which in\n * a real dataset carries `rdf:type rdfs:Class`. `targetClass` is read off the shape\n * *class*, so JavaScript static inheritance already walks the superclass chain: a\n * subclass that declares none inherits its parent's.\n *\n * A temporary (`linked://tmp/`) targetClass is honoured like any other. It is a real,\n * separate node — just one whose IRI has not been finalised — and it round-trips\n * consistently through both the scan and the create side.\n *\n * **A shape with no targetClass anywhere in its chain throws.** It used to fall back\n * to the shape's *own* IRI, which typed instances as the shape that describes them —\n * conflating a class with its description, and silently disagreeing with the declared\n * `targetClass` whenever that was still temporary.\n */\nfunction resolveShapeScanIri(shapeId: string): string {\n // `getTargetClassId` reads the METAMODEL registry as well as the class registry, and\n // walks `extends` for a data-only shape — reading only `getShapeClass(...)` here made\n // `SelectBuilder.from(dataOnlyIri)` resolve, build an IR, and then die at this line.\n const targetClassId = getTargetClassId(shapeId);\n if (!targetClassId) {\n throw new Error(\n `Cannot resolve an rdf:type for shape \"${shapeId}\": no targetClass is declared ` +\n 'on it or on any shape it extends. Declare one — `static targetClass = ' +\n \"{id: 'https://example.org/Person'}` — pointing at the class node instances are \" +\n 'typed with. The shape\\'s own IRI is not a substitute: it identifies the ' +\n 'description, not the class being described.',\n );\n }\n return targetClassId;\n}\n\n/**\n * Resolve a SHACL property-shape id to the predicate term used in a triple.\n *\n * - Simple single-IRI path → `{kind:'iri'}` (byte-for-byte unchanged behaviour).\n * - Structured path (sequence / inverse / alternative / …) → `{kind:'path'}` built from the property\n * shape's `sh:path`, reusing the same `pathExprToSparql` / `collectPathUris` machinery as the\n * inline-`pathExpr` branches. Without this, structured named-property paths collapsed to a shadow IRI\n * that matched nothing.\n * - No matching property shape at all → `{kind:'iri'}` of the id as given (nothing\n * better is knowable; the caller passed an id no registered shape declares).\n */\n// Memoizes resolved predicate terms across the many call sites that resolve the\n// same property. Guarded by the shape-registry size so it self-invalidates when\n// new shapes register (e.g. across test-file module instances). Only successful\n// resolutions are cached — a not-found fallback is never stored, so a predicate\n// resolved before its shape registers can still resolve correctly afterwards.\nconst predicateTermCache = new Map<string, SparqlTerm>();\nlet predicateTermCacheSize = -1;\n\n/**\n * The `sh:datatype` declared for a property, if any. Lets the serializer emit the\n * term the shape asks for rather than one inferred from the JavaScript value: a\n * numeric property gets the numeric type it declares, and an `xsd:date` /\n * `xsd:time` property its own lexical form instead of a full timestamp.\n */\nfunction resolvePropertyDatatype(propertyId: string): string | undefined {\n return findPropertyShapeById(propertyId)?.datatype?.id;\n}\n\nfunction resolvePropertyPredicateTerm(propertyId: string): SparqlTerm {\n const version = getRegistryVersion();\n if (version !== predicateTermCacheSize) {\n predicateTermCache.clear();\n predicateTermCacheSize = version;\n }\n const cached = predicateTermCache.get(propertyId);\n if (cached) return cached;\n\n const propertyShape = findPropertyShapeById(propertyId);\n if (propertyShape) {\n const simplePathId = getSimplePathId(propertyShape.path);\n let term: SparqlTerm;\n if (simplePathId !== null) {\n // Simple single-IRI path: the declared `sh:path` IS the predicate. There is\n // no fallback to the property shape's own IRI — that identifies the\n // *description* of the property, not the property itself.\n term = iriTerm(simplePathId);\n } else {\n // Structured sh:path — emit a property-path predicate instead of a shadow IRI.\n term = {\n kind: 'path',\n value: pathExprToSparql(propertyShape.path),\n uris: collectPathUris(propertyShape.path),\n };\n }\n predicateTermCache.set(propertyId, term);\n return term;\n }\n return iriTerm(propertyId);\n}\n\n/**\n * Resolve the predicate term for a traversal/property node: a structured\n * property-path when an explicit `pathExpr` is present, otherwise the\n * registry-resolved predicate for `property`. Centralizes the invariant that\n * these two branches stay in lockstep across every triple-building site.\n */\nfunction buildPredicateTerm(spec: {pathExpr?: PathExpr; property: string}): SparqlTerm {\n return spec.pathExpr\n ? {\n kind: 'path',\n value: pathExprToSparql(spec.pathExpr),\n uris: collectPathUris(spec.pathExpr),\n }\n : resolvePropertyPredicateTerm(spec.property);\n}\n\n/** Produce variable name suffix from the last segment of a property URI. */\nfunction propertySuffix(propertyUri: string): string {\n const hashIdx = propertyUri.lastIndexOf('#');\n if (hashIdx >= 0) return propertyUri.substring(hashIdx + 1);\n const slashIdx = propertyUri.lastIndexOf('/');\n return slashIdx >= 0 ? propertyUri.substring(slashIdx + 1) : propertyUri;\n}\n\n/**\n * Sanitize a string so it's valid in a SPARQL variable name.\n * Replaces any non-alphanumeric/underscore characters with underscores.\n */\nfunction sanitizeVarName(name: string): string {\n return name.replace(/[^A-Za-z0-9_]/g, '_');\n}\n\nconst IR_EXPRESSION_KINDS = new Set([\n 'literal_expr', 'property_expr', 'binary_expr', 'logical_expr',\n 'not_expr', 'function_expr', 'aggregate_expr', 'reference_expr',\n 'alias_expr', 'context_property_expr', 'exists_expr', 'in_expr',\n]);\n\nfunction isIRExpression(value: unknown): value is IRExpression {\n return !!value && typeof value === 'object' && 'kind' in value &&\n typeof (value as {kind: unknown}).kind === 'string' &&\n IR_EXPRESSION_KINDS.has((value as {kind: string}).kind);\n}\n\n/**\n * Wrap a single node in a LeftJoin, making `right` optional relative to `left`.\n */\nfunction wrapOptional(\n left: SparqlAlgebraNode,\n right: SparqlAlgebraNode,\n): SparqlLeftJoin {\n return {type: 'left_join', left, right};\n}\n\n/**\n * Join two algebra nodes. If left is null, returns right.\n */\nfunction joinNodes(\n left: SparqlAlgebraNode | null,\n right: SparqlAlgebraNode,\n): SparqlAlgebraNode {\n if (!left) return right;\n return {type: 'join', left, right};\n}\n\nfunction bindingKey(alias: string, property: string): string {\n return `${alias}::${property}`;\n}\n\nfunction contextAliasKey(contextIri: string): string {\n return `__ctx__${contextIri}`;\n}\n\n/**\n * Defense-in-depth: a `reference_expr`/`context_property_expr` must arrive here with its\n * IRI already resolved (lowering's `resolveContextRefs` fills it from `contextName`). If it\n * didn't — an unresolved `{@ctx}` reaching the algebra through some path that bypassed\n * resolution — fail with a clear `UnresolvedContextError` instead of an opaque\n * `undefined.substring` crash deeper in URI formatting.\n */\nfunction resolvedContextIri(iri: string | undefined, contextName?: string): string {\n if (iri === undefined) {\n throw new UnresolvedContextError(contextName ?? '<unknown>');\n }\n return iri;\n}\n\nfunction mergeKeySets(...sets: ReadonlySet<string>[]): Set<string> {\n const merged = new Set<string>();\n for (const set of sets) {\n for (const key of set) {\n merged.add(key);\n }\n }\n return merged;\n}\n\nfunction intersectKeySets(sets: ReadonlySet<string>[]): Set<string> {\n if (sets.length === 0) {\n return new Set<string>();\n }\n\n const [first, ...rest] = sets;\n const intersection = new Set(first);\n for (const value of intersection) {\n if (!rest.every((set) => set.has(value))) {\n intersection.delete(value);\n }\n }\n return intersection;\n}\n\n// ---------------------------------------------------------------------------\n// Pattern helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Recursively collects all traversal alias target variables from IR patterns.\n * Used to ensure traversal aliases appear in the SELECT projection for result grouping.\n */\nfunction collectTraversalAliases(patterns: IRGraphPattern[]): string[] {\n const aliases: string[] = [];\n for (const p of patterns) {\n if (p.kind === 'traverse') {\n aliases.push(p.to);\n } else if (p.kind === 'join') {\n aliases.push(...collectTraversalAliases(p.patterns));\n } else if (p.kind === 'optional') {\n aliases.push(...collectTraversalAliases([p.pattern]));\n } else if (p.kind === 'union') {\n for (const branch of p.branches) {\n aliases.push(...collectTraversalAliases([branch]));\n }\n }\n }\n return aliases;\n}\n\nfunction buildTraverseTriple(pattern: IRTraversePattern): SparqlTriple {\n const predicate = buildPredicateTerm(pattern);\n return tripleOf(\n varTerm(pattern.from),\n predicate,\n varTerm(pattern.to),\n );\n}\n\nfunction collectTraversePatternsInOrder(\n patterns: IRGraphPattern[],\n out: IRTraversePattern[] = [],\n): IRTraversePattern[] {\n for (const pattern of patterns) {\n switch (pattern.kind) {\n case 'traverse':\n out.push(pattern);\n break;\n case 'join':\n collectTraversePatternsInOrder(pattern.patterns, out);\n break;\n case 'optional':\n case 'exists':\n collectTraversePatternsInOrder([pattern.pattern], out);\n break;\n case 'union':\n for (const branch of pattern.branches) {\n collectTraversePatternsInOrder([branch], out);\n }\n break;\n case 'shape_scan':\n case 'minus':\n break;\n }\n }\n return out;\n}\n\nfunction collectDirectProjectionAliases(\n query: IRSelectQuery,\n rootAlias: string,\n): Set<string> {\n const aliases = new Set<string>();\n for (const item of query.projection) {\n if (item.expression.kind === 'property_expr') {\n if (item.expression.sourceAlias !== rootAlias) {\n aliases.add(item.expression.sourceAlias);\n }\n } else if (item.expression.kind === 'alias_expr') {\n if (item.expression.alias !== rootAlias) {\n aliases.add(item.expression.alias);\n }\n }\n }\n return aliases;\n}\n\nfunction collectExpressionAliases(\n expr: IRExpression,\n aliases: Set<string>,\n): void {\n switch (expr.kind) {\n case 'property_expr':\n aliases.add(expr.sourceAlias);\n break;\n case 'alias_expr':\n aliases.add(expr.alias);\n break;\n case 'binary_expr':\n collectExpressionAliases(expr.left, aliases);\n collectExpressionAliases(expr.right, aliases);\n break;\n case 'in_expr':\n collectExpressionAliases(expr.value, aliases);\n for (const el of expr.source.list) collectExpressionAliases(el, aliases);\n break;\n case 'logical_expr':\n for (const sub of expr.expressions) {\n collectExpressionAliases(sub, aliases);\n }\n break;\n case 'not_expr':\n collectExpressionAliases(expr.expression, aliases);\n break;\n case 'function_expr':\n case 'aggregate_expr':\n for (const arg of expr.args) {\n collectExpressionAliases(arg, aliases);\n }\n break;\n case 'exists_expr':\n if (expr.filter) {\n collectExpressionAliases(expr.filter, aliases);\n }\n break;\n case 'literal_expr':\n case 'reference_expr':\n case 'context_property_expr':\n break;\n }\n}\n\nfunction markAliasAndAncestors(\n alias: string,\n traversePatternMap: ReadonlyMap<string, IRTraversePattern>,\n target: Set<string>,\n): void {\n let currentAlias: string | undefined = alias;\n while (currentAlias && traversePatternMap.has(currentAlias)) {\n if (target.has(currentAlias)) {\n return;\n }\n target.add(currentAlias);\n currentAlias = traversePatternMap.get(currentAlias)?.from;\n }\n}\n\nfunction collectRequiredTraversalAliases(\n query: IRSelectQuery,\n traversePatternMap: ReadonlyMap<string, IRTraversePattern>,\n): Set<string> {\n const directAliases = new Set<string>();\n\n if (query.where) {\n collectExpressionAliases(query.where, directAliases);\n }\n\n if (query.orderBy) {\n for (const item of query.orderBy) {\n collectExpressionAliases(item.expression, directAliases);\n }\n }\n\n for (const pattern of traversePatternMap.values()) {\n if (pattern.filter) {\n directAliases.add(pattern.to);\n }\n }\n\n const requiredAliases = new Set<string>();\n for (const alias of directAliases) {\n markAliasAndAncestors(alias, traversePatternMap, requiredAliases);\n }\n return requiredAliases;\n}\n\nfunction buildOptionalTraversalSubtree(\n alias: string,\n traversePatternMap: ReadonlyMap<string, IRTraversePattern>,\n childOptionalAliasesByParent: ReadonlyMap<string, string[]>,\n propertyTriplesByAlias: ReadonlyMap<string, SparqlTriple[]>,\n): SparqlAlgebraNode {\n const pattern = traversePatternMap.get(alias);\n if (!pattern) {\n throw new Error(`Missing traverse pattern for alias \"${alias}\"`);\n }\n\n let subtree: SparqlAlgebraNode = {\n type: 'bgp',\n triples: [buildTraverseTriple(pattern)],\n };\n\n for (const propTriple of propertyTriplesByAlias.get(alias) ?? []) {\n subtree = wrapOptional(subtree, {\n type: 'bgp',\n triples: [propTriple],\n });\n }\n\n for (const childAlias of childOptionalAliasesByParent.get(alias) ?? []) {\n subtree = wrapOptional(\n subtree,\n buildOptionalTraversalSubtree(\n childAlias,\n traversePatternMap,\n childOptionalAliasesByParent,\n propertyTriplesByAlias,\n ),\n );\n }\n\n return subtree;\n}\n\n// ---------------------------------------------------------------------------\n// Variable Registry\n// ---------------------------------------------------------------------------\n\n/**\n * Maps (alias, property) → SPARQL variable name.\n * Used to deduplicate variables across traverse and property_expr nodes.\n */\nclass VariableRegistry {\n private map = new Map<string, string>();\n private usedVarNames = new Set<string>();\n\n private key(alias: string, property: string): string {\n return bindingKey(alias, property);\n }\n\n has(alias: string, property: string): boolean {\n return this.map.has(this.key(alias, property));\n }\n\n get(alias: string, property: string): string | undefined {\n return this.map.get(this.key(alias, property));\n }\n\n set(alias: string, property: string, variable: string): void {\n this.map.set(this.key(alias, property), variable);\n this.usedVarNames.add(variable);\n }\n\n getOrCreate(alias: string, property: string): string {\n const existing = this.get(alias, property);\n if (existing) return existing;\n const suffix = propertySuffix(property);\n let varName = `${sanitizeVarName(alias)}_${suffix}`;\n // Deduplicate: if varName is already used by a different (alias, property),\n // append a counter to ensure unique SPARQL variable names\n let counter = 2;\n while (this.usedVarNames.has(varName)) {\n varName = `${sanitizeVarName(alias)}_${suffix}_${counter}`;\n counter++;\n }\n this.set(alias, property, varName);\n return varName;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Aggregate detection\n// ---------------------------------------------------------------------------\n\n/**\n * Checks whether a SparqlExpression tree contains an aggregate sub-expression.\n * Used to route aggregate-containing filters to HAVING instead of FILTER.\n */\nfunction containsAggregate(expr: SparqlExpression): boolean {\n switch (expr.kind) {\n case 'aggregate_expr':\n return true;\n case 'in_expr':\n return containsAggregate(expr.value) || expr.list.some(containsAggregate);\n case 'binary_expr':\n return containsAggregate(expr.left) || containsAggregate(expr.right);\n case 'logical_expr':\n return expr.exprs.some(containsAggregate);\n case 'not_expr':\n return containsAggregate(expr.inner);\n case 'function_expr':\n return expr.args.some(containsAggregate);\n default:\n return false;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Select conversion\n// ---------------------------------------------------------------------------\n\n/**\n * Converts an IRSelectQuery to a SparqlSelectPlan.\n */\nexport function selectToAlgebra(\n query: IRSelectQuery,\n _options?: SparqlOptions,\n): SparqlSelectPlan {\n const registry = new VariableRegistry();\n\n // Promote bindings only when the top-level WHERE would reject rows without\n // them. This keeps human-like SPARQL for null-rejecting filters without\n // over-constraining OR cases that can still match through other branches.\n const requiredPropertyKeys = query.where\n ? collectRequiredBindingKeys(query.where)\n : new Set<string>();\n\n const requiredPropertyTriples: SparqlTriple[] = [];\n // Track property triples that need to be added as OPTIONAL\n const optionalPropertyTriples: SparqlTriple[] = [];\n\n // Track filtered traversals (inline where) — these get their own OPTIONAL blocks\n const filteredTraverseBlocks: Array<{\n traverseTriple: SparqlTriple;\n filter: IRExpression;\n toAlias: string;\n }> = [];\n\n // 1. Root shape scan → BGP with type triple\n if (!query?.root) {\n throw new Error(\n 'selectToAlgebra: query.root is undefined. The query IR is missing its root shape scan. ' +\n 'This usually means the query was built with a null/undefined subject (e.g. getQueryContext returned null).',\n );\n }\n const rootAlias = query.root.alias;\n const shapeUri = query.root.shape;\n const typeTriple = tripleOf(\n varTerm(rootAlias),\n iriTerm(RDF_TYPE),\n iriTerm(resolveShapeScanIri(shapeUri)),\n );\n const requiredTriples: SparqlTriple[] = [typeTriple];\n\n // Track traverse triples (required pattern)\n const traverseTriples: SparqlTriple[] = [];\n const traversePatternsInOrder = collectTraversePatternsInOrder(query.patterns);\n const traversePatternMap = new Map(\n traversePatternsInOrder.map((pattern) => [pattern.to, pattern] as const),\n );\n\n // ── Nested-select inner LIMIT/OFFSET (Option A: single-subject only) ──────\n // A nested select on a related collection may carry an inner LIMIT/OFFSET.\n // A plain SPARQL sub-SELECT is uncorrelated, so its LIMIT bounds GLOBALLY.\n // That only equals per-parent windowing when the outer query targets exactly\n // ONE root subject — then we inline that subject into the sub-SELECT.\n const paginatedTraversePatterns = traversePatternsInOrder.filter(\n (p) =>\n typeof p.innerLimit === 'number' ||\n typeof p.innerOffset === 'number' ||\n (p.innerOrderBy && p.innerOrderBy.length > 0),\n );\n const singleSubjectIri: string | undefined =\n query.subjectId ??\n (query.subjectIds && query.subjectIds.length === 1\n ? query.subjectIds[0]\n : undefined);\n if (paginatedTraversePatterns.length > 0 && !singleSubjectIri) {\n throw new Error(\n 'Inner LIMIT/OFFSET on a nested select is only supported when the outer ' +\n 'query targets a single subject; multi-parent per-group pagination is not ' +\n 'yet implemented.',\n );\n }\n // Only root→child traversals can be inlined against the single subject.\n // A paginated traversal deeper than root→child has a parent collection that is\n // itself multi-valued (effectively multi-parent), so a sub-SELECT LIMIT there\n // would bound globally, not per-parent. Reject it loudly rather than silently\n // dropping the inner limit.\n const deepPaginated = paginatedTraversePatterns.filter((p) => p.from !== rootAlias);\n if (deepPaginated.length > 0) {\n throw new Error(\n 'Inner LIMIT/OFFSET on a nested select is only supported on a direct nested ' +\n 'select of the single root subject; pagination on a deeper (grandchild) ' +\n 'collection is multi-parent and not yet implemented.',\n );\n }\n const subSelectAliases = new Set<string>(\n paginatedTraversePatterns.map((p) => p.to),\n );\n\n // 2. Process patterns → traverse triples, populate variable registry.\n // Skip sub-SELECT-wrapped traversals here — they are emitted separately\n // (their child variable is still registered so projection/optionals work).\n for (const pattern of query.patterns) {\n processPattern(\n pattern,\n registry,\n traverseTriples,\n optionalPropertyTriples,\n filteredTraverseBlocks,\n subSelectAliases,\n );\n }\n\n // 3. Pre-register filter property references BEFORE processing projections.\n // This ensures that property triples needed by inline where filters are\n // co-located inside the filtered OPTIONAL block, not in separate OPTIONALs.\n const filterPropertyTriplesMap = new Map<number, SparqlTriple[]>();\n filteredTraverseBlocks.forEach((block, idx) => {\n const filterPropertyTriples: SparqlTriple[] = [];\n processExpressionForProperties(block.filter, registry, filterPropertyTriples);\n filterPropertyTriplesMap.set(idx, filterPropertyTriples);\n });\n\n // 4. Process projection expressions, where clause, orderBy expressions\n // to discover any additional property_expr references.\n // Properties already registered by inline filters (above) will be skipped.\n for (const item of query.projection) {\n processExpressionForProperties(\n item.expression,\n registry,\n optionalPropertyTriples,\n requiredPropertyTriples,\n requiredPropertyKeys,\n );\n }\n\n if (query.where) {\n processExpressionForProperties(\n query.where,\n registry,\n optionalPropertyTriples,\n requiredPropertyTriples,\n requiredPropertyKeys,\n );\n }\n\n if (query.orderBy) {\n for (const orderItem of query.orderBy) {\n processExpressionForProperties(\n orderItem.expression,\n registry,\n optionalPropertyTriples,\n requiredPropertyTriples,\n requiredPropertyKeys,\n );\n }\n }\n\n const projectedTraversalAliases = new Set<string>();\n const directProjectionAliases = collectDirectProjectionAliases(query, rootAlias);\n for (const alias of directProjectionAliases) {\n markAliasAndAncestors(alias, traversePatternMap, projectedTraversalAliases);\n }\n\n const requiredTraversalAliases = collectRequiredTraversalAliases(\n query,\n traversePatternMap,\n );\n\n const optionalTraversalAliases = new Set(\n [...projectedTraversalAliases].filter((alias) => {\n const pattern = traversePatternMap.get(alias);\n // Lower projection-only traversals into OPTIONAL subtrees regardless of\n // cardinality, so a parent with an empty relationship is preserved (with\n // an empty array / null child) instead of being inner-joined away. The\n // result grouper already collects multiple child bindings into an array.\n //\n // Excluded:\n // - filtered traversals (`.where(...)`) — the filter makes the child required\n // - aliases otherwise required by the query (e.g. used in a top-level filter)\n // - paginated traversals — emitted separately as a sub-SELECT (section 5a),\n // so lowering them here too would double-emit the traverse triple\n return !!pattern &&\n !pattern.filter &&\n !subSelectAliases.has(alias) &&\n !requiredTraversalAliases.has(alias);\n }),\n );\n\n const requiredTraverseTriples = traverseTriples.filter((triple) =>\n !(triple.object.kind === 'variable' &&\n optionalTraversalAliases.has(triple.object.name))\n );\n\n const nestedOptionalPropertyTriplesByAlias = new Map<string, SparqlTriple[]>();\n const topLevelOptionalPropertyTriples: SparqlTriple[] = [];\n // Property triples whose subject is a sub-SELECT child alias must be nested\n // INSIDE the sub-SELECT's OPTIONAL block (keyed by alias), so that ?childVar\n // stays scoped — otherwise an empty window leaves ?childVar unbound and the\n // outer property OPTIONAL leaks across the whole graph.\n const subSelectChildPropertyTriplesByAlias = new Map<string, SparqlTriple[]>();\n // Same scoping rule for filtered traversals (`.where(...)`): anything anchored\n // on the filtered alias must live inside its filtered OPTIONAL block — when\n // the filter matches nothing, the alias is unbound and a top-level OPTIONAL\n // would range over the whole graph.\n const filteredTraverseAliases = new Set(filteredTraverseBlocks.map((b) => b.toAlias));\n const filteredChildPropertyTriplesByAlias = new Map<string, SparqlTriple[]>();\n for (const propTriple of optionalPropertyTriples) {\n if (propTriple.subject.kind === 'variable' &&\n subSelectAliases.has(propTriple.subject.name)) {\n const triples = subSelectChildPropertyTriplesByAlias.get(propTriple.subject.name) ?? [];\n triples.push(propTriple);\n subSelectChildPropertyTriplesByAlias.set(propTriple.subject.name, triples);\n } else if (propTriple.subject.kind === 'variable' &&\n filteredTraverseAliases.has(propTriple.subject.name)) {\n const triples = filteredChildPropertyTriplesByAlias.get(propTriple.subject.name) ?? [];\n triples.push(propTriple);\n filteredChildPropertyTriplesByAlias.set(propTriple.subject.name, triples);\n } else if (propTriple.subject.kind === 'variable' &&\n optionalTraversalAliases.has(propTriple.subject.name)) {\n const triples = nestedOptionalPropertyTriplesByAlias.get(propTriple.subject.name) ?? [];\n triples.push(propTriple);\n nestedOptionalPropertyTriplesByAlias.set(propTriple.subject.name, triples);\n } else {\n topLevelOptionalPropertyTriples.push(propTriple);\n }\n }\n\n const childOptionalAliasesByParent = new Map<string, string[]>();\n for (const pattern of traversePatternsInOrder) {\n if (!optionalTraversalAliases.has(pattern.to)) continue;\n const siblings = childOptionalAliasesByParent.get(pattern.from) ?? [];\n siblings.push(pattern.to);\n childOptionalAliasesByParent.set(pattern.from, siblings);\n }\n\n const rootOptionalTraversalAliases = traversePatternsInOrder\n .filter((pattern) =>\n optionalTraversalAliases.has(pattern.to) &&\n !optionalTraversalAliases.has(pattern.from) &&\n // Children of a filtered traversal nest inside its filtered block (5b)\n !filteredTraverseAliases.has(pattern.from),\n )\n .map((pattern) => pattern.to);\n\n // 5. Build the algebra tree\n // - Start with the required BGP (type triple + traverse triples)\n // - Wrap each optional property triple in a LeftJoin\n const requiredBgp: SparqlBGP = {\n type: 'bgp',\n triples: [...requiredTriples, ...requiredTraverseTriples, ...requiredPropertyTriples],\n };\n\n let algebra: SparqlAlgebraNode = requiredBgp;\n\n // 5a. Nested-select inner LIMIT/OFFSET → sub-SELECT (single-subject only).\n // Wrap each root→child paginated traversal in a sub-SELECT that inlines\n // the single subject, projecting only the child variable. The child's own\n // property triples stay OUTSIDE (as OPTIONALs), joined on the child var —\n // so the flat-row structure and result mapping are unchanged.\n // Every pattern here is a root→child paginated traversal (the deep-pagination\n // guard above rejected anything else), so each maps 1:1 to a sub-SELECT.\n for (const pattern of paginatedTraversePatterns) {\n const predicate = buildPredicateTerm(pattern);\n const innerTriple = tripleOf(\n iriTerm(singleSubjectIri!),\n predicate,\n varTerm(pattern.to),\n );\n // Default ORDER BY ?childVar for a deterministic window, unless the nested\n // select supplied its own ordering. When it did, each ordered property must\n // also be bound inside the sub-SELECT so the ORDER BY variable resolves.\n let orderBy: SparqlOrderCondition[];\n let innerNode: SparqlAlgebraNode = {type: 'bgp', triples: [innerTriple]};\n if (pattern.innerOrderBy && pattern.innerOrderBy.length > 0) {\n orderBy = pattern.innerOrderBy.map((o) => {\n const orderVar = registry.getOrCreate(pattern.to, o.property);\n innerNode = joinNodes(innerNode, {\n type: 'bgp',\n triples: [tripleOf(varTerm(pattern.to), resolvePropertyPredicateTerm(o.property), varTerm(orderVar))],\n });\n return {\n expression: {kind: 'variable_expr' as const, name: orderVar},\n direction: o.direction,\n };\n });\n } else {\n orderBy = [{\n expression: {kind: 'variable_expr', name: pattern.to},\n direction: 'ASC',\n }];\n }\n const subSelect: SparqlAlgebraNode = {\n type: 'subselect',\n projection: [pattern.to],\n inner: innerNode,\n orderBy,\n ...(typeof pattern.innerLimit === 'number' ? {limit: pattern.innerLimit} : {}),\n ...(typeof pattern.innerOffset === 'number' ? {offset: pattern.innerOffset} : {}),\n };\n // Nest the child's own property triples (e.g. ?a1 <name> ?a1_name) INSIDE\n // this block, each as its own OPTIONAL, so they only bind when the window\n // produced a ?childVar. This keeps the flat-row projection unchanged.\n let childBlock: SparqlAlgebraNode = subSelect;\n for (const propTriple of subSelectChildPropertyTriplesByAlias.get(pattern.to) ?? []) {\n childBlock = wrapOptional(childBlock, {type: 'bgp', triples: [propTriple]});\n }\n // OPTIONAL so a parent with an empty (or fully-windowed-out) child set is\n // still returned — the sub-SELECT yields no ?a1 binding, but the parent row\n // survives (mirrors the plain nested-traverse OPTIONAL behaviour).\n algebra = wrapOptional(algebra, childBlock);\n }\n\n // 5b. Build filtered OPTIONAL blocks for inline where traversals.\n // Each block contains: traverse triple + OPTIONAL property triples + FILTER.\n // Filter property triples are nested as OPTIONALs so that OR filters work\n // even when some entities lack certain properties.\n // First pass: build each filtered block's inner group and filter expression.\n const filteredBlockInners: SparqlAlgebraNode[] = [];\n const filteredBlockExprs: SparqlExpression[] = [];\n const filteredBlockIdxByAlias = new Map<string, number>(\n filteredTraverseBlocks.map((block, i) => [block.toAlias, i]),\n );\n for (let i = 0; i < filteredTraverseBlocks.length; i++) {\n const block = filteredTraverseBlocks[i];\n const filterPropertyTriples = filterPropertyTriplesMap.get(i) || [];\n const filterExpr = convertExpression(block.filter, registry, filterPropertyTriples);\n // Start with the traverse triple as the required BGP\n let blockInner: SparqlAlgebraNode = {type: 'bgp', triples: [block.traverseTriple]};\n // Wrap each filter property triple in its own nested OPTIONAL\n for (const propTriple of filterPropertyTriples) {\n blockInner = wrapOptional(blockInner, {type: 'bgp', triples: [propTriple]});\n }\n // Projected property triples on the filtered alias that aren't part of the\n // filter (e.g. `.where(name=...).select(pp => [pp.hobby])`)\n for (const propTriple of filteredChildPropertyTriplesByAlias.get(block.toAlias) ?? []) {\n blockInner = wrapOptional(blockInner, {type: 'bgp', triples: [propTriple]});\n }\n // Optional child traversal subtrees (nested sub-selects below the filtered\n // alias) — kept inside the block so an empty filter match leaves them unbound\n for (const childAlias of childOptionalAliasesByParent.get(block.toAlias) ?? []) {\n blockInner = wrapOptional(\n blockInner,\n buildOptionalTraversalSubtree(\n childAlias,\n traversePatternMap,\n childOptionalAliasesByParent,\n nestedOptionalPropertyTriplesByAlias,\n ),\n );\n }\n filteredBlockInners.push(blockInner);\n filteredBlockExprs.push(filterExpr);\n }\n // Second pass, children first (blocks are created parent-before-child):\n // finish each block and either nest it inside its parent's filtered block —\n // a filtered sub-select inside another filtered sub-select must stay scoped\n // to the parent alias, or an empty parent match leaves the alias unbound and\n // the block cross-products over the whole graph — or attach it at top level.\n const rootFilteredBlocks: SparqlAlgebraNode[] = [];\n for (let i = filteredTraverseBlocks.length - 1; i >= 0; i--) {\n const block = filteredTraverseBlocks[i];\n const finished: SparqlFilter = {\n type: 'filter',\n expression: filteredBlockExprs[i],\n inner: filteredBlockInners[i],\n };\n const subject = block.traverseTriple.subject;\n const parentIdx = subject.kind === 'variable'\n ? filteredBlockIdxByAlias.get(subject.name)\n : undefined;\n if (parentIdx !== undefined && parentIdx !== i) {\n filteredBlockInners[parentIdx] = wrapOptional(filteredBlockInners[parentIdx], finished);\n } else {\n rootFilteredBlocks.unshift(finished);\n }\n }\n for (const filteredBlock of rootFilteredBlocks) {\n algebra = wrapOptional(algebra, filteredBlock);\n }\n\n for (const alias of rootOptionalTraversalAliases) {\n algebra = wrapOptional(\n algebra,\n buildOptionalTraversalSubtree(\n alias,\n traversePatternMap,\n childOptionalAliasesByParent,\n nestedOptionalPropertyTriplesByAlias,\n ),\n );\n }\n\n // Wrap each optional property triple in its own OPTIONAL (LeftJoin)\n for (const propTriple of topLevelOptionalPropertyTriples) {\n algebra = wrapOptional(algebra, {\n type: 'bgp',\n triples: [propTriple],\n });\n }\n\n // 5. Where clause → Filter wrapping (or HAVING if aggregate-containing)\n let havingExpr: SparqlExpression | undefined;\n if (query.where) {\n const filterExpr = convertExpression(query.where, registry, optionalPropertyTriples);\n if (containsAggregate(filterExpr)) {\n havingExpr = filterExpr;\n } else {\n algebra = {\n type: 'filter',\n expression: filterExpr,\n inner: algebra,\n };\n }\n }\n\n // 5b. MINUS patterns — wrap algebra in SparqlMinus for each minus pattern\n for (const pattern of query.patterns) {\n if (pattern.kind === 'minus') {\n let minusAlgebra = convertExistsPattern(pattern.pattern, registry);\n if (pattern.filter) {\n const minusPropertyTriples: SparqlTriple[] = [];\n processExpressionForProperties(pattern.filter, registry, minusPropertyTriples);\n // Add property triples into the MINUS block\n if (minusPropertyTriples.length > 0) {\n minusAlgebra = joinNodes(minusAlgebra, {type: 'bgp', triples: minusPropertyTriples});\n }\n const filterExpr = convertExpression(pattern.filter, registry, minusPropertyTriples);\n minusAlgebra = {type: 'filter', expression: filterExpr, inner: minusAlgebra};\n }\n algebra = {type: 'minus', left: algebra, right: minusAlgebra};\n }\n }\n\n // 6. SubjectId → Filter / SubjectIds → VALUES\n if (query.subjectIds && query.subjectIds.length > 0) {\n // Multiple subjects: use VALUES clause for efficient filtering\n algebra = joinNodes(\n {type: 'values', variable: rootAlias, iris: query.subjectIds},\n algebra,\n );\n } else if (query.subjectId) {\n const subjectFilter: SparqlExpression = {\n kind: 'binary_expr',\n op: '=',\n left: {kind: 'variable_expr', name: rootAlias},\n right: {kind: 'iri_expr', value: query.subjectId},\n };\n algebra = {\n type: 'filter',\n expression: subjectFilter,\n inner: algebra,\n };\n }\n\n // 7. Build projection\n const projection: SparqlProjectionItem[] = [];\n const aggregates: SparqlAggregateBinding[] = [];\n let hasAggregates = false;\n\n // Always include root alias as first projection variable\n projection.push({kind: 'variable', name: rootAlias});\n\n // Collect traversal aliases upfront to detect aggregate alias collisions\n const traversalAliasSet = new Set(collectTraversalAliases(query.patterns));\n // Track traversal aliases consumed by aggregate renames (should not be\n // re-projected as plain variables, which would alter GROUP BY semantics)\n const aggregateRenamedAliases = new Set<string>();\n\n for (const item of query.projection) {\n const sparqlExpr = convertExpression(item.expression, registry, optionalPropertyTriples);\n\n if (sparqlExpr.kind === 'aggregate_expr') {\n hasAggregates = true;\n // Avoid collision: if aggregate alias matches a traversal alias,\n // rename it so SPARQL doesn't produce duplicate variable bindings\n let aggAlias = item.alias;\n if (traversalAliasSet.has(aggAlias)) {\n aggregateRenamedAliases.add(aggAlias);\n aggAlias = `${aggAlias}_agg`;\n // Update resultMap so result mapping uses the renamed alias\n for (const rm of query.resultMap) {\n if (rm.alias === item.alias) rm.alias = aggAlias;\n }\n }\n projection.push({\n kind: 'aggregate',\n expression: sparqlExpr,\n alias: aggAlias,\n });\n aggregates.push({\n variable: aggAlias,\n aggregate: sparqlExpr,\n });\n } else {\n // For property_expr, the variable is the resolved name from registry\n const varName = resolveExpressionVariable(item.expression, registry);\n if (varName && varName !== rootAlias) {\n projection.push({kind: 'variable', name: varName});\n } else if (!varName) {\n // Non-variable expression (binary_expr, function_expr, etc.)\n // → project as (expr AS ?alias)\n let exprAlias = item.alias;\n if (traversalAliasSet.has(exprAlias)) {\n // The output alias collides with a traversal target variable — e.g. a\n // computed expression over a traversed path lowers to\n // (UCASE(?a1_name) AS ?a1), and ?a1 is already bound by the traverse\n // triple. Rename the output so SPARQL doesn't reuse an in-scope var.\n exprAlias = `${exprAlias}_expr`;\n for (const rm of query.resultMap) {\n if (rm.alias === item.alias) rm.alias = exprAlias;\n }\n }\n projection.push({kind: 'expression', expression: sparqlExpr, alias: exprAlias});\n }\n }\n }\n\n // 7b. Include traversal aliases needed for result grouping\n // When nested results are projected (e.g. p.friends.name), the result\n // mapping needs the traversal alias variable (?a1) in the bindings to\n // group nested rows by entity. Without this, mapNestedRows() can't\n // identify which nested fields belong to which traversed entity.\n const projectedNames = new Set<string>();\n for (const p of projection) {\n if (p.kind === 'variable') projectedNames.add(p.name);\n else if (p.kind === 'aggregate' || p.kind === 'expression') projectedNames.add(p.alias);\n }\n for (const alias of collectTraversalAliases(query.patterns)) {\n if (!projectedNames.has(alias) && !aggregateRenamedAliases.has(alias)) {\n projection.push({kind: 'variable', name: alias});\n projectedNames.add(alias);\n }\n }\n\n // 8. GROUP BY inference\n let groupBy: string[] | undefined;\n if (havingExpr) {\n hasAggregates = true;\n }\n if (hasAggregates) {\n // All non-aggregate projected variables become GROUP BY targets\n groupBy = projection\n .filter((p): p is {kind: 'variable'; name: string} => p.kind === 'variable')\n .map((p) => p.name);\n }\n\n // 9. OrderBy\n let orderBy: SparqlOrderCondition[] | undefined;\n if (query.orderBy) {\n orderBy = query.orderBy.map((item) => ({\n expression: convertExpression(item.expression, registry, optionalPropertyTriples),\n direction: item.direction,\n }));\n }\n\n // `.one()` lowers to limit=1 + singleResult, but LIMIT bounds ROWS, not\n // entities. When the query yields multiple rows per root entity (traversals\n // or plural properties), a row-level LIMIT would truncate the entity's own\n // nested data — omit it and let the result mapper pick the single entity.\n const multiRowPerEntity =\n query.patterns.some((p) => p.kind === 'traverse') ||\n query.projection.some(\n (item) =>\n item.expression.kind === 'property_expr' &&\n !(typeof item.expression.maxCount === 'number' && item.expression.maxCount <= 1),\n );\n const limit =\n query.singleResult && query.limit === 1 && multiRowPerEntity\n ? undefined\n : query.limit;\n\n return {\n type: 'select',\n algebra,\n projection,\n distinct: !hasAggregates ? true : undefined,\n orderBy,\n limit,\n offset: query.offset,\n groupBy,\n having: havingExpr,\n aggregates: aggregates.length > 0 ? aggregates : undefined,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Pattern processing\n// ---------------------------------------------------------------------------\n\nfunction processPattern(\n pattern: IRGraphPattern,\n registry: VariableRegistry,\n traverseTriples: SparqlTriple[],\n optionalPropertyTriples: SparqlTriple[],\n filteredTraverseBlocks?: Array<{traverseTriple: SparqlTriple; filter: IRExpression; toAlias: string}>,\n subSelectAliases?: ReadonlySet<string>,\n): void {\n switch (pattern.kind) {\n case 'shape_scan':\n // Additional shape scans (non-root) are handled as type triples\n // but this case is rare — root is handled separately\n break;\n\n case 'traverse': {\n // Register the traverse variable: (from, property) → to\n registry.set(pattern.from, pattern.property, pattern.to);\n // Traversals wrapped in a sub-SELECT (inner LIMIT/OFFSET) are emitted\n // separately — don't add their triple to the required BGP here.\n if (subSelectAliases?.has(pattern.to)) {\n break;\n }\n // Add traverse triple to required pattern (or filtered block if inline where)\n const triple = buildTraverseTriple(pattern);\n if (pattern.filter && filteredTraverseBlocks) {\n filteredTraverseBlocks.push({\n traverseTriple: triple,\n filter: pattern.filter,\n toAlias: pattern.to,\n });\n } else {\n traverseTriples.push(triple);\n }\n break;\n }\n\n case 'join': {\n for (const sub of pattern.patterns) {\n processPattern(sub, registry, traverseTriples, optionalPropertyTriples, filteredTraverseBlocks, subSelectAliases);\n }\n break;\n }\n\n case 'optional': {\n // Optional patterns — process inner patterns but keep them optional\n processPattern(pattern.pattern, registry, traverseTriples, optionalPropertyTriples, filteredTraverseBlocks, subSelectAliases);\n break;\n }\n\n case 'union': {\n for (const branch of pattern.branches) {\n processPattern(branch, registry, traverseTriples, optionalPropertyTriples, filteredTraverseBlocks, subSelectAliases);\n }\n break;\n }\n\n case 'exists': {\n processPattern(pattern.pattern, registry, traverseTriples, optionalPropertyTriples, filteredTraverseBlocks, subSelectAliases);\n break;\n }\n\n case 'minus': {\n // MINUS patterns are handled separately in selectToAlgebra — skip in processPattern.\n break;\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Expression processing — discover property_expr references\n// ---------------------------------------------------------------------------\n\nfunction processExpressionForProperties(\n expr: IRExpression,\n registry: VariableRegistry,\n optionalPropertyTriples: SparqlTriple[],\n requiredPropertyTriples: SparqlTriple[] = [],\n requiredPropertyKeys = new Set<string>(),\n): void {\n switch (expr.kind) {\n case 'property_expr': {\n if (!registry.has(expr.sourceAlias, expr.property)) {\n const varName = registry.getOrCreate(expr.sourceAlias, expr.property);\n const predicate = buildPredicateTerm(expr);\n const triple = tripleOf(\n varTerm(expr.sourceAlias),\n predicate,\n varTerm(varName),\n );\n const triples = requiredPropertyKeys.has(bindingKey(expr.sourceAlias, expr.property))\n ? requiredPropertyTriples\n : optionalPropertyTriples;\n triples.push(triple);\n }\n break;\n }\n case 'binary_expr':\n processExpressionForProperties(\n expr.left,\n registry,\n optionalPropertyTriples,\n requiredPropertyTriples,\n requiredPropertyKeys,\n );\n processExpressionForProperties(\n expr.right,\n registry,\n optionalPropertyTriples,\n requiredPropertyTriples,\n requiredPropertyKeys,\n );\n break;\n case 'in_expr':\n // The tested value binds a property; list elements are constants.\n processExpressionForProperties(\n expr.value,\n registry,\n optionalPropertyTriples,\n requiredPropertyTriples,\n requiredPropertyKeys,\n );\n break;\n case 'logical_expr':\n for (const sub of expr.expressions) {\n processExpressionForProperties(\n sub,\n registry,\n optionalPropertyTriples,\n requiredPropertyTriples,\n requiredPropertyKeys,\n );\n }\n break;\n case 'not_expr':\n processExpressionForProperties(\n expr.expression,\n registry,\n optionalPropertyTriples,\n requiredPropertyTriples,\n requiredPropertyKeys,\n );\n break;\n case 'function_expr':\n for (const arg of expr.args) {\n processExpressionForProperties(\n arg,\n registry,\n optionalPropertyTriples,\n requiredPropertyTriples,\n requiredPropertyKeys,\n );\n }\n break;\n case 'aggregate_expr':\n for (const arg of expr.args) {\n processExpressionForProperties(\n arg,\n registry,\n optionalPropertyTriples,\n requiredPropertyTriples,\n requiredPropertyKeys,\n );\n }\n break;\n case 'exists_expr':\n // exists_expr filter properties belong INSIDE the EXISTS block, not in\n // the outer scope. Do NOT register them here — convertExpression's\n // exists_expr handler will collect and emit them locally.\n break;\n case 'context_property_expr': {\n // Context entity property — emit a triple with fixed IRI as subject.\n // Use raw IRI as registry key to avoid collision between IRIs that\n // sanitize to the same string (e.g. ctx-1 vs ctx_1).\n const contextIri = resolvedContextIri(expr.contextIri, expr.contextName);\n const ctxKey = contextAliasKey(contextIri);\n if (!registry.has(ctxKey, expr.property)) {\n const varName = registry.getOrCreate(ctxKey, expr.property);\n const triple = tripleOf(\n iriTerm(contextIri),\n resolvePropertyPredicateTerm(expr.property),\n varTerm(varName),\n );\n const triples = requiredPropertyKeys.has(bindingKey(ctxKey, expr.property))\n ? requiredPropertyTriples\n : optionalPropertyTriples;\n triples.push(triple);\n }\n break;\n }\n case 'literal_expr':\n case 'reference_expr':\n case 'alias_expr':\n // No property references to discover\n break;\n }\n}\n\n/**\n * Compute which bindings are mandatory for a top-level FILTER to keep a row.\n * AND makes either side required; OR only keeps bindings required by every branch.\n */\nfunction collectRequiredBindingKeys(expr: IRExpression): Set<string> {\n switch (expr.kind) {\n case 'property_expr':\n return new Set([bindingKey(expr.sourceAlias, expr.property)]);\n case 'context_property_expr':\n return new Set([bindingKey(contextAliasKey(resolvedContextIri(expr.contextIri, expr.contextName)), expr.property)]);\n case 'in_expr':\n // The tested value must be bound; list elements are constants.\n return collectRequiredBindingKeys(expr.value);\n case 'binary_expr':\n return mergeKeySets(\n collectRequiredBindingKeys(expr.left),\n collectRequiredBindingKeys(expr.right),\n );\n case 'function_expr': {\n const fn = expr.name.toUpperCase();\n // BOUND explicitly tests boundness — forcing its argument into a\n // required (inner-join) pattern would make !BOUND unsatisfiable.\n // COALESCE is unbound-tolerant by design — requiring its arguments\n // would make the fallback unreachable.\n if (fn === 'BOUND' || fn === 'COALESCE') {\n return new Set<string>();\n }\n // IF: an unbound variable in the condition errors the row out either\n // way, so the condition may keep its requirements — but the then/else\n // branches must stay optional (the untaken branch may reference a\n // property the entity doesn't have).\n if (fn === 'IF') {\n return expr.args.length > 0\n ? collectRequiredBindingKeys(expr.args[0])\n : new Set<string>();\n }\n return mergeKeySets(...expr.args.map((arg) => collectRequiredBindingKeys(arg)));\n }\n case 'not_expr':\n return collectRequiredBindingKeys(expr.expression);\n case 'logical_expr': {\n const childSets = expr.expressions.map((sub) => collectRequiredBindingKeys(sub));\n if (expr.operator === 'and') {\n return mergeKeySets(...childSets);\n }\n return intersectKeySets(childSets);\n }\n case 'aggregate_expr':\n case 'exists_expr':\n case 'literal_expr':\n case 'reference_expr':\n case 'alias_expr':\n return new Set<string>();\n }\n}\n\n// ---------------------------------------------------------------------------\n// Expression conversion\n// ---------------------------------------------------------------------------\n\n/**\n * The `sh:datatype` of the property a literal is being compared AGAINST, when the\n * comparison has one. Only temporal values use it (see the `literal_expr` case):\n * it is what tells an `xsd:date` property's filter to render `\"2020-01-01\"^^xsd:date`\n * rather than a full timestamp that can never equal the stored term.\n */\nfunction siblingDatatype(expr: IRExpression | undefined): string | undefined {\n if (!expr) return undefined;\n if (expr.kind === 'property_expr' || expr.kind === 'context_property_expr') {\n return resolvePropertyDatatype(expr.property);\n }\n return undefined;\n}\n\nfunction convertExpression(\n expr: IRExpression,\n registry: VariableRegistry,\n optionalPropertyTriples: SparqlTriple[],\n datatypeHint?: string,\n): SparqlExpression {\n switch (expr.kind) {\n case 'literal_expr': {\n const value = expr.value;\n if (value === null || value === undefined) {\n return {kind: 'literal_expr', value: ''};\n }\n // A temporal literal must carry its datatype. SPARQL's `=` on a plain literal\n // and an `^^xsd:dateTime` one is a type error, so the row is dropped: an\n // untyped date filter matched NOTHING against data core itself wrote. The\n // lexical form follows the compared property's declared datatype, the same\n // rule `dateToTerm` applies on the mutation side.\n if (value instanceof Date) {\n const term = dateToTerm(value, datatypeHint);\n return {\n kind: 'literal_expr',\n value: term.kind === 'literal' ? term.value : String(value),\n datatype: term.kind === 'literal' ? term.datatype : XSD_DATETIME,\n };\n }\n if (typeof value === 'boolean') {\n return {\n kind: 'literal_expr',\n value: String(value),\n datatype: XSD_BOOLEAN,\n };\n }\n if (typeof value === 'number') {\n if (Number.isInteger(value)) {\n return {\n kind: 'literal_expr',\n value: String(value),\n datatype: XSD_INTEGER,\n };\n }\n return {\n kind: 'literal_expr',\n value: String(value),\n datatype: XSD_DOUBLE,\n };\n }\n return {kind: 'literal_expr', value: String(value)};\n }\n\n case 'reference_expr':\n return {kind: 'iri_expr', value: resolvedContextIri(expr.value, expr.contextName)};\n\n case 'alias_expr':\n return {kind: 'variable_expr', name: expr.alias};\n\n case 'context_property_expr': {\n const ctxKey = `__ctx__${resolvedContextIri(expr.contextIri, expr.contextName)}`;\n const ctxVarName = registry.getOrCreate(ctxKey, expr.property);\n return {kind: 'variable_expr', name: ctxVarName};\n }\n\n case 'property_expr': {\n const varName = registry.getOrCreate(expr.sourceAlias, expr.property);\n return {kind: 'variable_expr', name: varName};\n }\n\n case 'in_expr': {\n const listHint = siblingDatatype(expr.value);\n return {\n kind: 'in_expr',\n negated: expr.negated,\n value: convertExpression(expr.value, registry, optionalPropertyTriples),\n list: expr.source.list.map((e) =>\n convertExpression(e, registry, optionalPropertyTriples, listHint),\n ),\n };\n }\n\n case 'binary_expr':\n return {\n kind: 'binary_expr',\n op: expr.operator,\n left: convertExpression(\n expr.left, registry, optionalPropertyTriples, siblingDatatype(expr.right),\n ),\n right: convertExpression(\n expr.right, registry, optionalPropertyTriples, siblingDatatype(expr.left),\n ),\n };\n\n case 'logical_expr':\n return {\n kind: 'logical_expr',\n op: expr.operator,\n exprs: expr.expressions.map((e) =>\n convertExpression(e, registry, optionalPropertyTriples),\n ),\n };\n\n case 'not_expr':\n return {\n kind: 'not_expr',\n inner: convertExpression(expr.expression, registry, optionalPropertyTriples),\n };\n\n case 'function_expr':\n return {\n kind: 'function_expr',\n name: expr.name,\n args: expr.args.map((a) =>\n convertExpression(a, registry, optionalPropertyTriples),\n ),\n };\n\n case 'aggregate_expr':\n return {\n kind: 'aggregate_expr',\n name: expr.name,\n args: expr.args.map((a) =>\n convertExpression(a, registry, optionalPropertyTriples),\n ),\n };\n\n case 'exists_expr': {\n // Convert exists expression with inner pattern + filter.\n // Filter property triples must live INSIDE the EXISTS block\n // (not in the outer scope), so we collect them locally.\n let innerAlgebra = convertExistsPattern(\n expr.pattern,\n registry,\n );\n\n if (expr.filter) {\n // First, discover and register filter property references,\n // collecting their triples into a local array (NOT the outer scope).\n const existsPropertyTriples: SparqlTriple[] = [];\n processExpressionForProperties(expr.filter, registry, existsPropertyTriples);\n\n // Now convert the filter expression (variables are registered above).\n const filterExpr = convertExpression(\n expr.filter,\n registry,\n existsPropertyTriples, // unused — properties already registered\n );\n // Add filter property triples inside the EXISTS\n for (const propTriple of existsPropertyTriples) {\n innerAlgebra = joinNodes(innerAlgebra, {type: 'bgp', triples: [propTriple]})!;\n }\n // Wrap the inner pattern with a filter\n const filteredInner: SparqlFilter = {\n type: 'filter',\n expression: filterExpr,\n inner: innerAlgebra,\n };\n return {\n kind: 'exists_expr',\n pattern: filteredInner,\n negated: false,\n };\n }\n\n return {\n kind: 'exists_expr',\n pattern: innerAlgebra,\n negated: false,\n };\n }\n\n default:\n throw new Error(`Unknown IR expression kind: ${(expr as never as {kind: string}).kind}`);\n }\n}\n\n/**\n * Convert an exists pattern (from exists_expr) into an algebra node.\n * Recursively handles all IR graph pattern kinds.\n */\nfunction convertExistsPattern(\n pattern: IRGraphPattern,\n registry: VariableRegistry,\n): SparqlAlgebraNode {\n switch (pattern.kind) {\n case 'traverse': {\n const existsPredicate = buildPredicateTerm(pattern);\n const triple = tripleOf(\n varTerm(pattern.from),\n existsPredicate,\n varTerm(pattern.to),\n );\n return {type: 'bgp', triples: [triple]};\n }\n\n case 'join': {\n let result: SparqlAlgebraNode | null = null;\n for (const sub of pattern.patterns) {\n const subNode = convertExistsPattern(sub, registry);\n result = result ? joinNodes(result, subNode) : subNode;\n }\n return result || {type: 'bgp', triples: []};\n }\n\n case 'shape_scan': {\n return {\n type: 'bgp',\n triples: [\n tripleOf(\n varTerm(pattern.alias),\n iriTerm(RDF_TYPE),\n iriTerm(resolveShapeScanIri(pattern.shape)),\n ),\n ],\n };\n }\n\n case 'optional': {\n const inner = convertExistsPattern(pattern.pattern, registry);\n return wrapOptional({type: 'bgp', triples: []}, inner);\n }\n\n case 'union': {\n let result: SparqlAlgebraNode | null = null;\n for (const branch of pattern.branches) {\n const branchNode = convertExistsPattern(branch, registry);\n if (!result) {\n result = branchNode;\n } else {\n result = {type: 'union', left: result, right: branchNode};\n }\n }\n return result || {type: 'bgp', triples: []};\n }\n\n case 'exists': {\n return convertExistsPattern(pattern.pattern, registry);\n }\n\n case 'minus': {\n return convertExistsPattern(pattern.pattern, registry);\n }\n\n default:\n throw new Error(`Unsupported pattern kind in EXISTS: ${(pattern as never as {kind: string}).kind}`);\n }\n}\n\n/**\n * Resolve what variable name an IR expression ultimately refers to.\n */\nfunction resolveExpressionVariable(\n expr: IRExpression,\n registry: VariableRegistry,\n): string | null {\n switch (expr.kind) {\n case 'alias_expr':\n return expr.alias;\n case 'property_expr':\n return registry.getOrCreate(expr.sourceAlias, expr.property);\n default:\n return null;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Mutation conversions\n// ---------------------------------------------------------------------------\n\n/** The numeric datatypes a shape may declare, and the DSL accepts a number for. */\nconst NUMERIC_DATATYPES = new Set([\n XSD_INTEGER,\n XSD_DOUBLE,\n xsd.long.id,\n xsd.decimal.id,\n xsd.float.id,\n]);\n\n/**\n * The datatype to write a number as: the one its property declares, falling back\n * to the shape of the value itself. Without the declared datatype a property\n * typed `xsd:long` stored `xsd:integer` and one typed `xsd:decimal` stored\n * `xsd:double` — a value the store round-trips as a different term than the\n * shape says it holds.\n */\nfunction numericDatatype(value: number, datatype?: string): string {\n if (datatype && NUMERIC_DATATYPES.has(datatype)) return datatype;\n return Number.isInteger(value) ? XSD_INTEGER : XSD_DOUBLE;\n}\n\n/**\n * A `Date` in the lexical form its property asks for. `xsd:date` and `xsd:dateTime` take a `Date`\n * and only a `Date`, so the declared `sh:datatype` is what decides whether that instant is\n * written as a date or a full timestamp. With no declared datatype the term stays `xsd:dateTime`.\n *\n * `xsd:time` takes a STRING instead (see `STRING_LEXICAL_DATATYPES`): a `Date` cannot represent a\n * time of day without inventing a date alongside it, which then has to be discarded here and\n * makes two identical clock times on different days compare unequal. The `XSD_TIME` branch below\n * remains for a `Date` that reaches an `xsd:time` property some other way.\n */\nfunction dateToTerm(value: Date, datatype?: string): SparqlTerm {\n const iso = value.toISOString();\n if (datatype === XSD_DATE) return literalTerm(iso.slice(0, 10), XSD_DATE);\n if (datatype === XSD_TIME) return literalTerm(iso.slice(11), XSD_TIME);\n return literalTerm(iso, XSD_DATETIME);\n}\n\n/**\n * Datatypes whose lexical form IS a string, so a plain string value must be typed from the\n * DECLARED datatype rather than written as a plain literal.\n *\n * A deliberate allow-list rather than \"type every string from whatever is declared\". A string\n * reaching a numeric or boolean property is a mistake that `assertValid` rejects; typing it here\n * would instead write a well-formed-looking `\"abc\"^^xsd:integer` and hide the error in the data.\n * Only datatypes a string is a VALID lexical form for belong here.\n */\nconst STRING_LEXICAL_DATATYPES = new Set<string>([XSD_TIME]);\n\n/**\n * Convert a field value to one or more SparqlTerm objects for triple objects.\n *\n * `datatype` is the property's declared `sh:datatype`. It decides the term type for temporal\n * values and for the string-lexical datatypes above; every other literal is still typed from the\n * JavaScript value, because that is what makes a wrong JS type a visible failure rather than a\n * silently mistyped triple.\n */\nfunction fieldValueToTerms(\n value: IRFieldValue,\n options?: SparqlOptions,\n datatype?: string,\n): SparqlTerm[] {\n if (value === null || value === undefined) {\n return [];\n }\n\n if (typeof value === 'string') {\n // A plain literal is `xsd:string` in RDF 1.1, so a string for an `xsd:string` property needs\n // no explicit datatype. Anything else in the allow-list must carry one, or it is written\n // untyped and stops matching the property it was meant to fill.\n if (datatype && STRING_LEXICAL_DATATYPES.has(datatype)) {\n return [literalTerm(value, datatype)];\n }\n return [literalTerm(value)];\n }\n\n if (typeof value === 'number') {\n return [literalTerm(String(value), numericDatatype(value, datatype))];\n }\n\n if (typeof value === 'boolean') {\n return [literalTerm(String(value), XSD_BOOLEAN)];\n }\n\n if (value instanceof Date) {\n return [dateToTerm(value, datatype)];\n }\n\n // Computed/expression value in create: create lowers to INSERT DATA (ground\n // triples, no WHERE), so an expression can't be evaluated here. Fail loudly\n // instead of silently emitting no triple (report 021 §3, G4).\n if (\n value &&\n typeof value === 'object' &&\n (isIRExpression(value) || 'ir' in (value as object))\n ) {\n throw new Error(\n 'Computed/expression values are not supported in create (INSERT DATA has no WHERE clause to evaluate them). Use a literal value, or use update.',\n );\n }\n\n // NodeReferenceValue\n if (typeof value === 'object' && 'id' in value && !('shape' in value) && !('fields' in value)) {\n return [iriTerm((value as NodeReferenceValue).id)];\n }\n\n // IRNodeData — should not produce a term directly (handled by nested create)\n if (typeof value === 'object' && 'shape' in value && 'fields' in value) {\n return []; // Handled separately\n }\n\n // Array\n if (Array.isArray(value)) {\n const terms: SparqlTerm[] = [];\n for (const item of value) {\n terms.push(...fieldValueToTerms(item, options, datatype));\n }\n return terms;\n }\n\n return [];\n}\n\n/**\n * Mints the labels of the blank nodes of one INSERT DATA. Only a create passes one: blank\n * nodes in a `DELETE/INSERT … WHERE` template are minted once per WHERE solution, and the\n * update's cleanup UNION yields several, so the structure would be written several times.\n */\ntype BlankNodeMinter = {next: number};\n\n/** How a nested create is written: an IRI-named, typed node, or an untyped blank node. */\ntype NestedNodeKind = 'iri' | 'blank';\n\n/**\n * True when the property's `sh:nodeKind` allows blank-node values (`sh:BlankNode`,\n * `sh:BlankNodeOrIRI`, `sh:BlankNodeOrLiteral`). A nested create under such a property may be\n * minted as a blank node, and a delete / replace through it removes its blank value.\n */\nfunction isBlankCapable(ps: {nodeKind?: {id?: string}} | undefined): boolean {\n const nk = ps?.nodeKind?.id;\n return nk === shacl.BlankNode.id || nk === shacl.BlankNodeOrIRI.id || nk === shacl.BlankNodeOrLiteral.id;\n}\n\n/** `label` (shape) of a property shape, for error messages. */\nfunction describeProperty(propertyId: string): string {\n const ps = findPropertyShapeById(propertyId);\n return ps?.label ? `'${ps.label}' (${propertyId})` : propertyId;\n}\n\n/**\n * How a nested create under `propertyId` is written, from the property's `sh:nodeKind`:\n *\n * | nodeKind | without id | with id |\n * |---|---|---|\n * | unset, `sh:IRI`, `sh:IRIOrLiteral` | IRI (minted) | IRI |\n * | `sh:BlankNode` | blank node | error: a blank node has no id |\n * | `sh:BlankNodeOrIRI` | blank node | IRI |\n * | `sh:BlankNodeOrLiteral` | blank node | error: an IRI is not allowed |\n * | `sh:Literal` | error | error |\n *\n * The rule is read from the receiving side's registry, so nothing about it travels on the wire.\n */\nfunction nestedNodeKind(propertyId: string, data: IRNodeData): NestedNodeKind {\n const nk = findPropertyShapeById(propertyId)?.nodeKind?.id;\n switch (nk) {\n case shacl.BlankNodeOrIRI.id:\n return data.id ? 'iri' : 'blank';\n case shacl.BlankNode.id:\n case shacl.BlankNodeOrLiteral.id:\n if (data.id) {\n throw new Error(\n `Property ${describeProperty(propertyId)} is ${nk === shacl.BlankNode.id ? 'sh:BlankNode' : 'sh:BlankNodeOrLiteral'}: ` +\n `its nested value is written as a blank node, which has no id, but the value carries ` +\n `the id ${data.id}.`,\n );\n }\n return 'blank';\n case shacl.Literal.id:\n throw new Error(\n `Property ${describeProperty(propertyId)} is sh:Literal and cannot hold a nested node.`,\n );\n default:\n return 'iri';\n }\n}\n\n/**\n * The triples of a nested create held by `subjectTerm` through `propertyId`: the edge, then the\n * nested node's own triples. `blanks` is the create's label minter; without one (the update\n * paths) a value that would be minted blank throws, see `generateNodeDataTriples`.\n */\nfunction nestedCreateTriples(\n subjectTerm: SparqlTerm,\n propertyId: string,\n propertyTerm: SparqlTerm,\n data: IRNodeData,\n options?: SparqlOptions,\n blanks?: BlankNodeMinter,\n): SparqlTriple[] {\n const kind = nestedNodeKind(propertyId, data);\n if (kind === 'blank' && !blanks) {\n throw new Error(\n `Cannot write a blank node in an update: property ${describeProperty(propertyId)} allows ` +\n `blank nodes and its nested value has no id. An update writes its INSERT once per WHERE ` +\n `solution, which would duplicate the blank node. Write the value with the create of its ` +\n `parent${findPropertyShapeById(propertyId)?.nodeKind?.id === shacl.BlankNodeOrIRI.id ? ', or give it an id to write it as an IRI' : ''}.`,\n );\n }\n const nested = generateNodeDataTriples(data, options, blanks, kind);\n return [tripleOf(subjectTerm, propertyTerm, nested.term), ...nested.triples];\n}\n\n/**\n * Recursively generate triples for an IRNodeData (used in create and nested creates).\n * Returns the term used for this node and all generated triples.\n *\n * `kind` is decided by the caller from the property that holds the node (`nestedNodeKind`);\n * the root of a create is always an IRI. A blank node gets a fresh label and only its field\n * triples, no `rdf:type`: its shape is known from the property, and a SHACL path operator, the\n * case blank nodes exist for here, must be the subject of exactly one triple.\n */\nfunction generateNodeDataTriples(\n data: IRNodeData,\n options?: SparqlOptions,\n blanks?: BlankNodeMinter,\n kind: NestedNodeKind = 'iri',\n): {term: SparqlTerm; triples: SparqlTriple[]} {\n const triples: SparqlTriple[] = [];\n let subjectTerm: SparqlTerm;\n if (kind === 'blank') {\n // Callers only pass 'blank' with a minter (`nestedCreateTriples` checks).\n subjectTerm = {kind: 'blank', label: `b${blanks!.next++}`};\n } else {\n subjectTerm = iriTerm(data.id || generateEntityUri(data.shape, options));\n // Type triple — resolve the SHACL NodeShapeData id in the IR to the ontology\n // targetClass URI (sibling of PR #77's SELECT-side resolveShapeScanIri).\n // Mutations were not covered by #77; see mutation-uri-fidelity.test.ts.\n triples.push(tripleOf(subjectTerm, iriTerm(RDF_TYPE), iriTerm(resolveShapeScanIri(data.shape))));\n }\n\n // Field triples\n for (const field of data.fields) {\n const propertyTerm = resolvePropertyPredicateTerm(field.property);\n\n // Skip undefined/null values in create\n if (field.value === undefined || field.value === null) {\n continue;\n }\n\n // Handle arrays (multi-value fields)\n if (Array.isArray(field.value)) {\n for (const item of field.value) {\n if (item && typeof item === 'object' && 'shape' in item && 'fields' in item) {\n triples.push(\n ...nestedCreateTriples(subjectTerm, field.property, propertyTerm, item as IRNodeData, options, blanks),\n );\n } else {\n const terms = fieldValueToTerms(item, options, resolvePropertyDatatype(field.property));\n for (const term of terms) {\n triples.push(tripleOf(subjectTerm, propertyTerm, term));\n }\n }\n }\n continue;\n }\n\n // Handle nested IRNodeData\n if (typeof field.value === 'object' && 'shape' in field.value && 'fields' in field.value) {\n triples.push(\n ...nestedCreateTriples(subjectTerm, field.property, propertyTerm, field.value as IRNodeData, options, blanks),\n );\n continue;\n }\n\n // Simple value\n const terms = fieldValueToTerms(field.value, options, resolvePropertyDatatype(field.property));\n for (const term of terms) {\n triples.push(tripleOf(subjectTerm, propertyTerm, term));\n }\n }\n\n return {term: subjectTerm, triples};\n}\n\n/**\n * Converts an IRCreateMutation to a SparqlInsertDataPlan.\n */\nexport function createToAlgebra(\n query: IRCreateMutation,\n options?: SparqlOptions,\n): SparqlInsertDataPlan {\n const {triples} = generateNodeDataTriples(query.data, options, {next: 0});\n return {\n type: 'insert_data',\n triples,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Shared update field processing\n// ---------------------------------------------------------------------------\n\n/** A bare `{id}` reference: a link to an existing node, not a nested create. */\nexport function isBareNodeReference(value: unknown): value is NodeReferenceValue {\n return (\n !!value &&\n typeof value === 'object' &&\n !Array.isArray(value) &&\n !(value instanceof Date) &&\n typeof (value as {id?: unknown}).id === 'string' &&\n !('shape' in value) &&\n !('fields' in value)\n );\n}\n\n/**\n * The values a `contains` replace keeps: the bare `{id}`s of the new single value or of\n * the overwrite array. A nested create that carries an id is not kept — it rewrites that\n * node completely, as it always has.\n */\nfunction keptReferences(value: IRFieldValue): SparqlTerm[] {\n const items = Array.isArray(value) ? value : [value];\n return items.filter(isBareNodeReference).map((ref) => iriTerm(ref.id));\n}\n\n/**\n * Processes IRNodeData fields into DELETE/INSERT/WHERE triples.\n * Shared between updateToAlgebra (IRI subject) and updateWhereToAlgebra (variable subject).\n */\nfunction processUpdateFields(\n data: IRNodeData,\n subjectTerm: SparqlTerm,\n options?: SparqlOptions,\n): {\n deletePatterns: SparqlTriple[];\n insertPatterns: SparqlTriple[];\n oldValueTriples: SparqlTriple[];\n extends: Array<{variable: string; expression: SparqlExpression}>;\n cascadeOptionals: SparqlAlgebraNode[];\n} {\n const deletePatterns: SparqlTriple[] = [];\n const insertPatterns: SparqlTriple[] = [];\n const oldValueTriples: SparqlTriple[] = [];\n const extends_: Array<{variable: string; expression: SparqlExpression}> = [];\n // Owned cleanup on `contains` replace/remove: dropping a `contains` edge must delete\n // the old object itself (its own triples) AND its owned subtree, not just unlink the\n // one-hop edge — otherwise the old node orphans (backlog 032).\n const containsOldVars: Array<{\n oldVar: string;\n propertyTerm: SparqlTerm;\n keep: SparqlTerm[];\n valueShapeId: string;\n }> = [];\n const cascadeOptionals: SparqlAlgebraNode[] = [];\n\n for (const field of data.fields) {\n const propertyTerm = resolvePropertyPredicateTerm(field.property);\n const suffix = propertySuffix(field.property);\n const fieldShape = findPropertyShapeById(field.property);\n // Ownership is the property's own: a `contains` property with a value shape and a simple\n // path (an IRI predicate term). A plain property on a predicate another shape declares\n // `contains` owns nothing.\n const valueShapeId =\n propertyTerm.kind === 'iri' && fieldShape?.contains ? fieldShape.valueShape?.id : undefined;\n\n // Check for set modification ({add, remove})\n if (\n field.value &&\n typeof field.value === 'object' &&\n !Array.isArray(field.value) &&\n !(field.value instanceof Date) &&\n !('id' in field.value) &&\n !('shape' in field.value) &&\n ('add' in field.value || 'remove' in field.value)\n ) {\n const setMod = field.value as IRSetModificationValue;\n\n if (setMod.remove) {\n // A value that is removed and added back in the same modification stays: its edge\n // is deleted and re-inserted (a no-op), and the node itself is not touched.\n const readdedIds = new Set(\n (setMod.add ?? []).filter(isBareNodeReference).map((ref) => ref.id),\n );\n setMod.remove.forEach((removeItem, ri) => {\n const removeId = (removeItem as NodeReferenceValue).id;\n const removeTerm = iriTerm(removeId);\n const edge = tripleOf(subjectTerm, propertyTerm, removeTerm);\n deletePatterns.push(edge);\n oldValueTriples.push(edge);\n // For a `contains` set, removing a value deletes the removed node itself\n // (its own triples) and its owned subtree — exclusive ownership via the edge.\n if (valueShapeId && !readdedIds.has(removeId)) {\n const prefix = `ucr_${suffix}_${ri}_`;\n const self = buildOwnedSelfDelete(subjectTerm, propertyTerm, removeTerm, prefix);\n deletePatterns.push(...self.deletePatterns);\n cascadeOptionals.push(...self.whereOptionals);\n const blank = subjectBlankCascade(valueShapeId, removeTerm, [edge], `${prefix}vb_`);\n if (blank) {\n deletePatterns.push(...blank.deletePatterns);\n cascadeOptionals.push(blank.whereBlock);\n }\n // The edge leads every branch: the removed node's subtree may only be deleted\n // while the node is still owned here.\n const owned = ownedSubtreeBlocks(valueShapeId, removeTerm, [edge], prefix);\n deletePatterns.push(...owned.deletePatterns);\n cascadeOptionals.push(...owned.whereBlocks);\n }\n });\n }\n\n if (setMod.add) {\n for (const addItem of setMod.add) {\n if (addItem && typeof addItem === 'object' && 'shape' in addItem && 'fields' in addItem) {\n insertPatterns.push(\n ...nestedCreateTriples(subjectTerm, field.property, propertyTerm, addItem as IRNodeData, options),\n );\n } else {\n const terms = fieldValueToTerms(addItem, options, resolvePropertyDatatype(field.property));\n for (const term of terms) {\n insertPatterns.push(tripleOf(subjectTerm, propertyTerm, term));\n }\n }\n }\n }\n\n continue;\n }\n\n // Replace / unset / overwrite of a blank-capable property: its old blank value and the\n // blank nodes below it go (the branch binds `old_${suffix}` through the edge itself).\n if (isBlankCapable(fieldShape)) {\n const blank = buildBlankCascade(\n [tripleOf(subjectTerm, propertyTerm, varTerm(`old_${suffix}`))],\n varTerm(`old_${suffix}`),\n null,\n blankWalkPredicates([fieldShape!]),\n `ub_${suffix}_`,\n );\n if (blank) {\n deletePatterns.push(...blank.deletePatterns);\n cascadeOptionals.push(blank.whereBlock);\n }\n }\n\n // Non-set-modification replace of a `contains` property: cascade the old value's\n // subtree (every branch below binds `old_${suffix}` in the WHERE).\n if (valueShapeId) {\n containsOldVars.push({\n oldVar: `old_${suffix}`,\n propertyTerm,\n keep: keptReferences(field.value),\n valueShapeId,\n });\n }\n\n // Unset (undefined/null) — delete only\n if (field.value === undefined || field.value === null) {\n const oldVar = varTerm(`old_${suffix}`);\n deletePatterns.push(tripleOf(subjectTerm, propertyTerm, oldVar));\n oldValueTriples.push(tripleOf(subjectTerm, propertyTerm, oldVar));\n continue;\n }\n\n // Array overwrite — delete old values + insert new ones\n if (Array.isArray(field.value)) {\n const oldVar = varTerm(`old_${suffix}`);\n deletePatterns.push(tripleOf(subjectTerm, propertyTerm, oldVar));\n oldValueTriples.push(tripleOf(subjectTerm, propertyTerm, oldVar));\n\n for (const item of field.value) {\n if (item && typeof item === 'object' && 'shape' in item && 'fields' in item) {\n insertPatterns.push(\n ...nestedCreateTriples(subjectTerm, field.property, propertyTerm, item as IRNodeData, options),\n );\n } else {\n const terms = fieldValueToTerms(item, options, resolvePropertyDatatype(field.property));\n for (const term of terms) {\n insertPatterns.push(tripleOf(subjectTerm, propertyTerm, term));\n }\n }\n }\n continue;\n }\n\n // Nested create (single object field)\n if (typeof field.value === 'object' && 'shape' in field.value && 'fields' in field.value) {\n const oldVar = varTerm(`old_${suffix}`);\n deletePatterns.push(tripleOf(subjectTerm, propertyTerm, oldVar));\n oldValueTriples.push(tripleOf(subjectTerm, propertyTerm, oldVar));\n\n insertPatterns.push(\n ...nestedCreateTriples(subjectTerm, field.property, propertyTerm, field.value as IRNodeData, options),\n );\n continue;\n }\n\n // IRExpression — computed value update (e.g. p.age.plus(1))\n if (isIRExpression(field.value)) {\n const expr = field.value as IRExpression;\n const oldVar = varTerm(`old_${suffix}`);\n const computedVarName = `computed_${suffix}`;\n const computedVar = varTerm(computedVarName);\n\n // DELETE old value\n deletePatterns.push(tripleOf(subjectTerm, propertyTerm, oldVar));\n\n // WHERE: OPTIONAL for old value\n oldValueTriples.push(tripleOf(subjectTerm, propertyTerm, oldVar));\n\n // Discover additional property references in the expression and add OPTIONAL triples\n const registry = new VariableRegistry();\n const mutationSubjectAlias = '__mutation_subject__';\n // Pre-register the subject variable mapping for the field being updated\n registry.set(mutationSubjectAlias, field.property, `old_${suffix}`);\n\n const additionalOptionals: SparqlTriple[] = [];\n processExpressionForProperties(expr, registry, additionalOptionals);\n\n // Add any additional property OPTIONAL triples (for refs to other properties)\n for (const triple of additionalOptionals) {\n // Rewrite the subject from the placeholder variable to the actual subject term\n if (triple.subject.kind === 'variable' && triple.subject.name === mutationSubjectAlias) {\n oldValueTriples.push(tripleOf(subjectTerm, triple.predicate, triple.object));\n } else {\n oldValueTriples.push(triple);\n }\n }\n\n // Convert IRExpression to SparqlExpression\n const sparqlExpr = convertExpression(expr, registry, additionalOptionals);\n\n // BIND computed expression\n extends_.push({variable: computedVarName, expression: sparqlExpr});\n\n // INSERT computed value\n insertPatterns.push(tripleOf(subjectTerm, propertyTerm, computedVar));\n continue;\n }\n\n // Simple value update — delete old + insert new\n const oldVar = varTerm(`old_${suffix}`);\n deletePatterns.push(tripleOf(subjectTerm, propertyTerm, oldVar));\n oldValueTriples.push(tripleOf(subjectTerm, propertyTerm, oldVar));\n\n const terms = fieldValueToTerms(field.value, options, resolvePropertyDatatype(field.property));\n for (const term of terms) {\n insertPatterns.push(tripleOf(subjectTerm, propertyTerm, term));\n }\n }\n\n // For each replaced `contains` property: delete the old value's own triples\n // (exclusive ownership via the edge — backlog 032) then cascade any owned descendants.\n // Values re-sent as a bare `{id}` are kept: their blocks are filtered, so re-sending the\n // current value is a no-op (the edge is deleted and re-inserted).\n containsOldVars.forEach(({oldVar, propertyTerm, keep, valueShapeId}, n) => {\n const oldTerm = varTerm(oldVar);\n const edge = tripleOf(subjectTerm, propertyTerm, oldTerm);\n const self = buildOwnedSelfDelete(subjectTerm, propertyTerm, oldTerm, `uc${n}_`, keep);\n deletePatterns.push(...self.deletePatterns);\n cascadeOptionals.push(...self.whereOptionals);\n // The old value's own blank values go with it.\n const blank = subjectBlankCascade(valueShapeId, oldTerm, [edge], `uc${n}_vb_`);\n if (blank) {\n deletePatterns.push(...blank.deletePatterns);\n cascadeOptionals.push(keepFilter(blank.whereBlock, oldTerm, keep));\n }\n // Every subtree branch binds `?old` itself through the owning edge, like the self-delete\n // block does. Without it an absent old value leaves `?old` unbound and the branch matches\n // the owned subtree of EVERY node in the graph.\n const owned = ownedSubtreeBlocks(valueShapeId, oldTerm, [edge], `uc${n}_`, keep);\n deletePatterns.push(...owned.deletePatterns);\n cascadeOptionals.push(...owned.whereBlocks);\n });\n\n return {\n deletePatterns,\n insertPatterns,\n oldValueTriples,\n extends: extends_,\n cascadeOptionals,\n };\n}\n\n/**\n * Wraps old-value triples in OPTIONAL (LEFT JOIN) so UPDATE succeeds\n * even when the old value doesn't exist.\n */\nfunction wrapOldValueOptionals(\n base: SparqlAlgebraNode,\n oldValueTriples: SparqlTriple[],\n): SparqlAlgebraNode {\n let algebra = base;\n if (oldValueTriples.length === 0) {\n return algebra;\n }\n for (const triple of oldValueTriples) {\n algebra = {\n type: 'left_join',\n left: algebra,\n right: {type: 'bgp', triples: [triple]},\n };\n }\n return algebra;\n}\n\n/**\n * Converts an IRUpdateMutation to a SparqlDeleteInsertPlan.\n */\nexport function updateToAlgebra(\n query: IRUpdateMutation,\n options?: SparqlOptions,\n): SparqlDeleteInsertPlan {\n return buildDeleteInsertPlan(query, options);\n}\n\n/**\n * Converts an IRUpsertMutation to a SparqlDeleteInsertPlan.\n *\n * The same plan `update` produces, plus `<id> a <targetClass>` in the INSERT. Nothing else\n * differs: `update`'s WHERE is already a bare OPTIONAL, so it matches — and therefore\n * inserts — whether or not the node exists. The type triple is what turns that into a\n * create. Re-asserting it on an existing node is a no-op, RDF graphs being sets, so it\n * needs no guard.\n */\nexport function upsertToAlgebra(\n query: IRUpsertMutation,\n options?: SparqlOptions,\n): SparqlDeleteInsertPlan {\n return buildDeleteInsertPlan(query, options, {\n // Must match the IRI `create` asserts and `select` scans for; the raw shape id is\n // not the same thing, and a node typed with it would be invisible to queries.\n ensureType: resolveShapeScanIri(query.shape),\n });\n}\n\n/**\n * Shared body of the id-targeted DELETE/INSERT/WHERE plans. `ensureType` is the only\n * difference between `update` and `upsert`; when absent the output is exactly what the\n * update path has always emitted.\n */\nfunction buildDeleteInsertPlan(\n query: IRUpdateMutation | IRUpsertMutation,\n options?: SparqlOptions,\n opts?: {ensureType?: string},\n): SparqlDeleteInsertPlan {\n const subjectTerm = iriTerm(query.id);\n const result = processUpdateFields(query.data, subjectTerm, options);\n\n const whereAlgebra = buildUpdateWhere(\n {type: 'bgp', triples: []},\n result,\n query.traversalPatterns,\n subjectTerm,\n );\n\n // The type triple leads the INSERT, mirroring `create`'s triple order.\n const insertPatterns = opts?.ensureType\n ? [\n tripleOf(subjectTerm, iriTerm(RDF_TYPE), iriTerm(opts.ensureType)),\n ...result.insertPatterns,\n ]\n : result.insertPatterns;\n\n return {\n type: 'delete_insert',\n deletePatterns: result.deletePatterns,\n insertPatterns,\n whereAlgebra,\n };\n}\n\n/** Left-nested UNION of `blocks` (at least one). */\nfunction unionOf(blocks: SparqlAlgebraNode[]): SparqlAlgebraNode {\n let union = blocks[0];\n for (let i = 1; i < blocks.length; i++) {\n union = {type: 'union', left: union, right: blocks[i]};\n }\n return union;\n}\n\n/** Every variable name an expression mentions, including inside EXISTS patterns. */\nfunction collectVariableNames(value: unknown, into: Set<string>): Set<string> {\n if (Array.isArray(value)) {\n for (const item of value) collectVariableNames(item, into);\n } else if (value && typeof value === 'object') {\n const node = value as {kind?: string; name?: unknown; variable?: unknown};\n if ((node.kind === 'variable_expr' || node.kind === 'variable') && typeof node.name === 'string') {\n into.add(node.name);\n }\n if (node.kind === 'bound_expr' && typeof node.variable === 'string') {\n into.add(node.variable);\n }\n for (const child of Object.values(value)) collectVariableNames(child, into);\n }\n return into;\n}\n\n/**\n * The WHERE shared by `update`, `upsert` and `updateWhere`, on top of `base` (empty for\n * an id-targeted update; the type guard and filter for an update-where).\n *\n * The old values and owned-cleanup blocks are independent of each other, so they are\n * joined as ONE OPTIONAL over a UNION, never as a chain of OPTIONALs. A chain is a join:\n * the old values of two multi-valued properties, or an owned node's own triples and its\n * owned subtree, multiply into one solution per combination. A UNION yields each block's\n * matches once, so the solutions add up, and the DELETE removes exactly the same triples\n * (a template triple a solution leaves unbound is skipped). The OPTIONAL keeps one\n * solution when nothing matches, so the INSERT still happens.\n *\n * Old values that a computed field's BIND reads stay in `base` as before, together with\n * the traversals they need, because the BIND needs them bound in the same solution. With\n * a single independent block the output is the one OPTIONAL it always was.\n */\nfunction buildUpdateWhere(\n base: SparqlAlgebraNode,\n result: ReturnType<typeof processUpdateFields>,\n traversalPatterns: IRUpdateMutation['traversalPatterns'],\n subjectTerm: SparqlTerm,\n): SparqlAlgebraNode {\n // Partition old-value/optional triples into subject-anchored ones and those\n // anchored on a traversal target variable (e.g. `?a1 <name> ?a1_name` from a\n // `p.bestFriend.name.ucase()` expression). Traversal-anchored triples MUST be\n // nested inside the same OPTIONAL group as their traversal edge — otherwise,\n // when the subject has no such edge, the leaf variable is unbound and the\n // property triple matches every entity in the graph (data-corruption bug).\n const travTos = new Set((traversalPatterns ?? []).map((t) => t.to));\n const travAnchoredByTo = new Map<string, SparqlTriple[]>();\n const subjectAnchored: SparqlTriple[] = [];\n for (const triple of result.oldValueTriples) {\n if (triple.subject.kind === 'variable' && travTos.has(triple.subject.name)) {\n const list = travAnchoredByTo.get(triple.subject.name) ?? [];\n list.push(triple);\n travAnchoredByTo.set(triple.subject.name, list);\n } else {\n subjectAnchored.push(triple);\n }\n }\n\n // Old values a BIND reads must share its solution; the rest are independent blocks.\n const readByBinds = new Set<string>();\n for (const ext of result.extends) collectVariableNames(ext.expression, readByBinds);\n const correlated: SparqlTriple[] = [];\n const independent: SparqlAlgebraNode[] = [];\n for (const triple of subjectAnchored) {\n const vars = collectVariableNames([triple.subject, triple.predicate, triple.object], new Set());\n if ([...vars].some((v) => readByBinds.has(v))) {\n correlated.push(triple);\n } else {\n independent.push({type: 'bgp', triples: [triple]});\n }\n }\n\n let whereAlgebra = wrapOldValueOptionals(base, correlated);\n\n // Add traversal OPTIONAL patterns (for multi-segment expression refs). The\n // traversal edge and its dependent leaf property triples share one OPTIONAL\n // group so the leaf variable is scoped to the traversal target. These come\n // BEFORE expression BINDs since the BINDs reference the traversal variables.\n for (const trav of traversalPatterns ?? []) {\n const fromTerm =\n trav.from === '__mutation_subject__' ? subjectTerm : varTerm(trav.from);\n const traversalTriple = tripleOf(\n fromTerm,\n // The declared `sh:path`, like every other predicate — not the property\n // shape's own IRI, which identifies the description of the property.\n resolvePropertyPredicateTerm(trav.property),\n varTerm(trav.to),\n );\n // The traversal edge binds the target var; each dependent leaf property is\n // a nested OPTIONAL *within* that scope, so a missing optional property\n // (e.g. a bestFriend with no hobby) doesn't drop the whole group, while an\n // absent edge still leaves every leaf var unbound (no cross-entity match).\n let travNode: SparqlAlgebraNode = {type: 'bgp', triples: [traversalTriple]};\n for (const leaf of travAnchoredByTo.get(trav.to) ?? []) {\n travNode = {\n type: 'left_join',\n left: travNode,\n right: {type: 'bgp', triples: [leaf]},\n };\n }\n whereAlgebra = {type: 'left_join', left: whereAlgebra, right: travNode};\n }\n\n // Independent old values + owned-subtree cleanup for `contains` replace/remove.\n const blocks = [...independent, ...result.cascadeOptionals];\n if (blocks.length > 0) {\n whereAlgebra = {type: 'left_join', left: whereAlgebra, right: unionOf(blocks)};\n }\n\n // Add BIND expressions for computed fields\n for (const ext of result.extends) {\n whereAlgebra = {\n type: 'extend',\n inner: whereAlgebra,\n variable: ext.variable,\n expression: ext.expression,\n };\n }\n return whereAlgebra;\n}\n\n// ---------------------------------------------------------------------------\n// Blank-node cascade: blank values are deleted through the blank-capable properties\n// (`isBlankCapable`) that hold them, never through `contains`.\n// ---------------------------------------------------------------------------\n\nconst shapeById = (id: string) => getShapeClass(id)?.shape ?? getNodeShape(id);\n\n/** The blank-capable property shapes of a shape (own and inherited) and of its sub-shapes. */\nfunction blankCapableProperties(shapeId: string): PropertyShapeData[] {\n const out: PropertyShapeData[] = [];\n for (const sid of [shapeId, ...getSubShapes(shapeId).map((sub) => sub.id)]) {\n const nodeShape = shapeById(sid);\n if (!nodeShape) continue;\n for (const ps of getPropertyShapes(nodeShape, true)) {\n if (isBlankCapable(ps)) out.push(ps);\n }\n }\n return out;\n}\n\n/** The simple-path predicates of property shapes, deduplicated in order. */\nfunction simplePredicates(props: PropertyShapeData[]): string[] {\n const predicates = new Set<string>();\n for (const ps of props) {\n const predicate = getSimplePathId(ps.path);\n if (predicate) predicates.add(predicate);\n }\n return [...predicates];\n}\n\nlet blankWalkCache = new Map<string, string[]>();\nlet blankWalkCacheVersion = -1;\n\n/**\n * The predicates the blank-node cascade follows *below* a blank value held by one of `start`:\n * the blank-capable properties of every shape the value (and, transitively, its blank values)\n * can have — a property's value shape and its sub-shapes. A blank-capable property without a\n * value shape is polymorphic (`sh:path`, the `PathNode` slots, `PathList.first`) and may hold\n * any shape, so it yields every blank-capable predicate in the registry. Precision is not what\n * keeps the walk safe:\n * `buildBlankCascade` refuses any node reached through an IRI.\n */\nfunction blankWalkPredicates(start: PropertyShapeData[]): string[] {\n const version = getRegistryVersion();\n if (version !== blankWalkCacheVersion) {\n blankWalkCache = new Map();\n blankWalkCacheVersion = version;\n }\n const key = start.map((ps) => ps.id).join('|');\n const cached = blankWalkCache.get(key);\n if (cached) return cached;\n\n let everything = false;\n const predicates: PropertyShapeData[] = [];\n const seen = new Set<string>();\n const queue: string[] = [];\n const follow = (ps: PropertyShapeData) => {\n if (!ps.valueShape?.id) {\n everything = true;\n return;\n }\n if (!seen.has(ps.valueShape.id)) {\n seen.add(ps.valueShape.id);\n queue.push(ps.valueShape.id);\n }\n };\n start.forEach(follow);\n while (queue.length > 0 && !everything) {\n for (const ps of blankCapableProperties(queue.shift()!)) {\n predicates.push(ps);\n follow(ps);\n }\n }\n if (everything) {\n predicates.length = 0;\n for (const nodeShape of getAllNodeShapes().values()) {\n if (!nodeShape) continue;\n for (const ps of getPropertyShapes(nodeShape, false)) {\n if (isBlankCapable(ps)) predicates.push(ps);\n }\n }\n }\n const result = simplePredicates(predicates);\n blankWalkCache.set(key, result);\n return result;\n}\n\n/** A SPARQL property-path term over `predicates`: `(p1|…|pn)`, then `*` / `+` when given. */\nfunction predicatePathTerm(predicates: string[], repeat?: 'zeroOrMore' | 'oneOrMore'): SparqlTerm {\n const step: PathExpr =\n predicates.length === 1 ? {id: predicates[0]} : {alt: predicates.map((id) => ({id}))};\n const expr: PathExpr = repeat === 'zeroOrMore' ? {zeroOrMore: step} : repeat === 'oneOrMore' ? {oneOrMore: step} : step;\n return {kind: 'path', value: pathExprToSparql(expr), uris: collectPathUris(expr)};\n}\n\nconst isBlankExpr = (name: string): SparqlExpression => ({\n kind: 'function_expr',\n name: 'isBlank',\n args: [{kind: 'variable_expr', name}],\n});\n\n/**\n * One UNION branch that deletes the blank values `owner` holds through `first`, and every blank\n * node below them through `inner`:\n *\n * ```sparql\n * DELETE { ?bn ?bnp ?bno }\n * WHERE {\n * …ownerTriples… <owner> (first…) ?bn0 . FILTER(isBlank(?bn0))\n * ?bn0 (inner…)* ?bn . ?bn ?bnp ?bno . FILTER(isBlank(?bn))\n * FILTER NOT EXISTS { ?bn0 (inner…)* ?mid . ?mid (inner…)+ ?bn . FILTER(!isBlank(?mid)) }\n * }\n * ```\n *\n * `first: null` means the owner term *is* the blank value (the old value of a replaced\n * blank-capable property, bound by `ownerTriples`). Every deleted node is a blank node, so no IRI\n * — a predicate such as `schema:image`, an entity a list merely lists — is ever deleted. The\n * `NOT EXISTS` refuses a blank node reached *through* an IRI: a property path cannot constrain\n * the nodes between its ends, and the walk may include every blank-capable predicate\n * (`blankWalkPredicates`), so without it a blank list's `rdf:first` could lead into a listed\n * entity and delete that entity's blank values. Blank structures core writes are trees, so the\n * guard removes nothing they own. Returns null when there is nothing to follow.\n */\nfunction buildBlankCascade(\n ownerTriples: SparqlTriple[],\n ownerTerm: SparqlTerm,\n first: string[] | null,\n inner: string[],\n varPrefix: string,\n): {deletePatterns: SparqlTriple[]; whereBlock: SparqlAlgebraNode} | null {\n if (first !== null && first.length === 0) return null;\n let bn0Name: string;\n const reach: SparqlTriple[] = [...ownerTriples];\n if (first === null) {\n if (ownerTerm.kind !== 'variable') return null;\n bn0Name = ownerTerm.name;\n } else {\n bn0Name = `${varPrefix}bn0`;\n reach.push(tripleOf(ownerTerm, predicatePathTerm(first), varTerm(bn0Name)));\n }\n const bn0 = varTerm(bn0Name);\n const reached: SparqlAlgebraNode = {\n type: 'filter',\n expression: isBlankExpr(bn0Name),\n inner: {type: 'bgp', triples: reach},\n };\n const bp = varTerm(`${varPrefix}bnp`);\n const bo = varTerm(`${varPrefix}bno`);\n if (inner.length === 0) {\n const own = tripleOf(bn0, bp, bo);\n return {\n deletePatterns: [own],\n whereBlock: {type: 'join', left: reached, right: {type: 'bgp', triples: [own]}},\n };\n }\n const bnName = `${varPrefix}bn`;\n const bn = varTerm(bnName);\n const mid = varTerm(`${varPrefix}bnm`);\n const own = tripleOf(bn, bp, bo);\n const throughIri: SparqlExpression = {\n kind: 'exists_expr',\n negated: true,\n pattern: {\n type: 'filter',\n expression: {kind: 'not_expr', inner: isBlankExpr(`${varPrefix}bnm`)},\n inner: {\n type: 'bgp',\n triples: [\n tripleOf(bn0, predicatePathTerm(inner, 'zeroOrMore'), mid),\n tripleOf(mid, predicatePathTerm(inner, 'oneOrMore'), bn),\n ],\n },\n },\n };\n return {\n deletePatterns: [own],\n whereBlock: {\n type: 'filter',\n expression: {kind: 'logical_expr', op: 'and', exprs: [isBlankExpr(bnName), throughIri]},\n inner: {\n type: 'join',\n // Filter the blank values before the inner walk runs from each of them.\n left: reached,\n right: {\n type: 'bgp',\n triples: [tripleOf(bn0, predicatePathTerm(inner, 'zeroOrMore'), bn), own],\n },\n },\n },\n };\n}\n\n/**\n * The blank-node cascade of a subject: its blank values through the blank-capable properties of\n * its shape, and their blank descendants. `ownerTriples` anchors a variable subject (the bulk\n * deletes pass its type triple).\n */\nfunction subjectBlankCascade(\n shapeId: string,\n subjectTerm: SparqlTerm,\n ownerTriples: SparqlTriple[],\n varPrefix: string,\n): {deletePatterns: SparqlTriple[]; whereBlock: SparqlAlgebraNode} | null {\n const props = blankCapableProperties(shapeId);\n if (props.length === 0) return null;\n return buildBlankCascade(ownerTriples, subjectTerm, simplePredicates(props), blankWalkPredicates(props), varPrefix);\n}\n\n// ---------------------------------------------------------------------------\n// Owned-subtree walk\n//\n// A `contains` property (with a value shape and a simple path) owns its value: replacing,\n// unsetting or set-removing the value, or deleting the subject, deletes the value node, then\n// the values that node's shape owns, and so on down. Ownership is decided per property: the\n// walk starts at the root's shape and follows only the `contains` properties the reached\n// shapes declare (own and inherited), so a plain property on a predicate that another shape\n// declares `contains` is never followed. A registered sub-shape that adds `contains`\n// properties contributes hops guarded by its concrete class (`?n a <SubClass>`). Every node\n// the walk reaches loses its own triples and its blank values; `dependent` plays no part.\n//\n// Recursion: a shape that owns itself through an unguarded edge (`List.rest`) is followed with\n// a closure (`rdf:rest*`), since every such edge from one of its nodes is its own. Any other\n// recursion (a cycle through several shapes, a sub-shape's edge back into the walk) is unrolled\n// into typed hops, up to `MAX_OWNED_RECURSION` repeated shapes per path; deeper values are left.\n// ---------------------------------------------------------------------------\n\n/**\n * How many times one walk path may re-enter a shape it already passed through (a cycle through\n * several shapes, or a sub-shape's edge back into its own kind). Values below are not deleted.\n */\nexport const MAX_OWNED_RECURSION = 4;\n\n/** Above this many branches for one root shape, lowering warns once (see backlog 055). */\nexport const OWNED_BRANCH_WARNING = 64;\n\n/** One owned edge of the shape graph: a `contains` property and its value shape. */\ntype OwnedEdge = {guard?: string; predicate: string; target: string};\n\n/**\n * One hop of the walk from the current position: when `typeClasses` is set the position must\n * have one of them as its `rdf:type`; then along `predicate`, then `closure*` when the target\n * shape owns itself.\n */\ntype OwnedHop = {typeClasses?: string[]; predicate: string; closure: string[]};\n\n/** A node the walk deletes: the hops leading to it and its shape's blank-capable properties. */\ntype OwnedTarget = {hops: OwnedHop[]; blankProps: PropertyShapeData[]};\n\ntype OwnedWalk = {\n /** The root shape's self-loop predicates (`List.rest`). */\n rootClosure: string[];\n /** The blank-capable properties of the root shape. */\n rootBlankProps: PropertyShapeData[];\n targets: OwnedTarget[];\n};\n\n/** The simple-path predicate through which a property owns its value, or null when it does not. */\nfunction ownedPredicate(ps: PropertyShapeData): string | null {\n if (!ps.contains || !ps.valueShape?.id) return null;\n return getSimplePathId(ps.path) ?? null;\n}\n\nlet classHoldersCache = new Map<string, string[]>();\nlet classHoldersVersion = -1;\n\n/** Every registered shape id per `targetClass` (memoized per registry version). */\nfunction classHolders(classId: string): string[] {\n const version = getRegistryVersion();\n if (version !== classHoldersVersion) {\n classHoldersCache = new Map();\n for (const nodeShape of getAllNodeShapes().values()) {\n const cls = nodeShape?.targetClass?.id;\n if (!cls) continue;\n classHoldersCache.set(cls, [...(classHoldersCache.get(cls) ?? []), nodeShape.id]);\n }\n classHoldersVersion = version;\n }\n return classHoldersCache.get(classId) ?? [];\n}\n\n/**\n * Why the added `contains` property `ps` of the sub-shape `sub` cannot be followed from nodes of\n * the sub-shape's class, or null when it can. The guard `?n a <C>` also matches the nodes of\n * every other shape targeting `C`, so it is refused when one of them is a super-shape of `sub`\n * (its own nodes would match) or declares the same predicate as a plain property (following it\n * would delete that shape's references). A holder that does not declare the predicate, or owns\n * it too, does not block it.\n */\nfunction blockedGuard(sub: NodeShapeData, ps: PropertyShapeData): string | null {\n const cls = sub.targetClass?.id;\n if (!cls) return 'has no targetClass';\n const predicate = getSimplePathId(ps.path);\n for (const id of classHolders(cls)) {\n if (id === sub.id || isSubShapeOf(id, sub.id)) continue;\n if (isSubShapeOf(sub.id, id)) return `shares its targetClass with its super-shape '${id}'`;\n const holder = shapeById(id);\n const plain = holder && getPropertyShapes(holder, true).some(\n (q) => !q.contains && getSimplePathId(q.path) === predicate,\n );\n if (plain) return `shares its targetClass with '${id}', which holds <${predicate}> as a plain property`;\n }\n return null;\n}\n\nconst warnedUnguardable = new Set<string>();\n\n/**\n * The owned edges of a shape: its own and inherited `contains` properties, then, per registered\n * sub-shape, the `contains` properties it adds, guarded by its `targetClass` (a node carries only\n * its concrete class's `rdf:type`, so each sub-shape lists its full extra set). An added property\n * whose guard cannot tell the sub-shape's nodes apart (`blockedGuard`) is not followed and is\n * warned once, unless the sub-shape is a profile or data-only copy of its direct super-shape (same\n * class or none, the property inherited from that super-shape), which is skipped silently: that\n * super-shape's entry covers it.\n */\nfunction ownedEdges(shapeId: string): OwnedEdge[] {\n const nodeShape = shapeById(shapeId);\n if (!nodeShape) return [];\n const edges = new Map<string, OwnedEdge>();\n const add = (ps: PropertyShapeData, guard?: string) => {\n const predicate = ownedPredicate(ps);\n if (!predicate) return;\n const target = ps.valueShape!.id;\n edges.set(`${guard ?? ''} ${predicate} ${target}`, {guard, predicate, target});\n };\n const own = getPropertyShapes(nodeShape, true);\n own.forEach((ps) => add(ps));\n const ownIds = new Set(own.map((ps) => ps.id));\n for (const sub of getSubShapes(shapeId)) {\n const extra = getPropertyShapes(sub, true).filter((ps) => !ownIds.has(ps.id) && ownedPredicate(ps));\n if (extra.length === 0) continue;\n const parent = sub.extends?.id ? shapeById(sub.extends.id) : undefined;\n const inherited = new Set(parent ? getPropertyShapes(parent, true).map((ps) => ps.id) : []);\n for (const ps of extra) {\n const reason = blockedGuard(sub, ps);\n if (!reason) {\n add(ps, sub.targetClass!.id);\n continue;\n }\n // A profile or data-only copy of its direct super-shape (same class, or none) is that\n // super-shape's node by type: the super-shape's own entry covers the property, unless\n // that super-shape is this walk's shape itself (no other entry covers it, so warn).\n const sameKind = !sub.targetClass?.id || sub.targetClass.id === parent?.targetClass?.id;\n if (sameKind && inherited.has(ps.id) && parent?.id !== shapeId) continue;\n const key = `${sub.id} ${ps.id}`;\n if (warnedUnguardable.has(key)) continue;\n warnedUnguardable.add(key);\n console.warn(\n `[linked] Shape '${sub.id}' adds the contains property \"${ps.label}\" to '${shapeId}', but ` +\n `${reason}, so its nodes cannot be told apart by rdf:type: deleting through ` +\n `'${shapeId}' does not follow it. Give the shape a targetClass of its own.`,\n );\n }\n }\n return [...edges.values()];\n}\n\n/** The classes a node of `shapeId` may carry: its targetClass and every registered sub-shape's. */\nfunction shapeClasses(shapeId: string): string[] {\n const nodeShape = shapeById(shapeId);\n const classes = new Set<string>();\n for (const shape of nodeShape ? [nodeShape, ...getSubShapes(shapeId)] : []) {\n if (shape.targetClass?.id) classes.add(shape.targetClass.id);\n }\n return [...classes];\n}\n\nlet ownedWalkCache = new Map<string, OwnedWalk>();\nlet ownedWalkCacheVersion = -1;\nconst warnedBranches = new Set<string>();\n\n/**\n * The owned subtree of a root shape, as hops (memoized per registry version; read-only).\n *\n * One target per path from the root. A self-loop (`S` owns `S` through an unguarded edge) is a\n * closure, exact because every such edge from an `S` node is `S`'s own. Every other edge is an\n * explicit hop. A hop is typed when it is a sub-shape's (its class) or when it stays inside a\n * cycle of several shapes (the declaring shape's classes), and a path stops after\n * `MAX_OWNED_RECURSION` hops into a shape already on it.\n */\nfunction ownedWalk(rootShapeId: string): OwnedWalk {\n const version = getRegistryVersion();\n if (version !== ownedWalkCacheVersion) {\n ownedWalkCache = new Map();\n ownedWalkCacheVersion = version;\n }\n const cached = ownedWalkCache.get(rootShapeId);\n if (cached) return cached;\n\n const edgesOf = new Map<string, OwnedEdge[]>();\n const pending = [rootShapeId];\n while (pending.length > 0) {\n const id = pending.pop()!;\n if (edgesOf.has(id)) continue;\n const edges = ownedEdges(id);\n edgesOf.set(id, edges);\n for (const edge of edges) if (!edgesOf.has(edge.target)) pending.push(edge.target);\n }\n const isSelfLoop = (from: string, e: OwnedEdge) => !e.guard && e.target === from;\n const closureOf = (id: string) => [\n ...new Set(edgesOf.get(id)!.filter((e) => isSelfLoop(id, e)).map((e) => e.predicate)),\n ];\n\n // Tarjan's strongly connected components, over the edges that are not closures.\n const index = new Map<string, number>();\n const low = new Map<string, number>();\n const onStack = new Set<string>();\n const stack: string[] = [];\n const groupOf = new Map<string, number>();\n const groupSize: number[] = [];\n const strong = (v: string) => {\n index.set(v, index.size);\n low.set(v, index.get(v)!);\n stack.push(v);\n onStack.add(v);\n for (const e of edgesOf.get(v)!) {\n if (isSelfLoop(v, e)) continue;\n const w = e.target;\n if (!index.has(w)) {\n strong(w);\n low.set(v, Math.min(low.get(v)!, low.get(w)!));\n } else if (onStack.has(w)) {\n low.set(v, Math.min(low.get(v)!, index.get(w)!));\n }\n }\n if (low.get(v) !== index.get(v)) return;\n let w: string;\n let size = 0;\n do {\n w = stack.pop()!;\n onStack.delete(w);\n groupOf.set(w, groupSize.length);\n size++;\n } while (w !== v);\n groupSize.push(size);\n };\n strong(rootShapeId);\n // A non-closure edge back to its own shape (a sub-shape's guarded edge) counts as a cycle too.\n const inCycle = (from: string, e: OwnedEdge) =>\n e.target === from || (groupOf.get(from) === groupOf.get(e.target) && groupSize[groupOf.get(from)!] > 1);\n\n const targets: OwnedTarget[] = [];\n const visit = (shape: string, hops: OwnedHop[], path: string[], repeats: number) => {\n for (const edge of edgesOf.get(shape)!) {\n if (isSelfLoop(shape, edge)) continue;\n const repeat = path.includes(edge.target) ? 1 : 0;\n if (repeats + repeat > MAX_OWNED_RECURSION) continue;\n const typeClasses = edge.guard\n ? [edge.guard]\n : inCycle(shape, edge)\n ? shapeClasses(shape)\n : undefined;\n const hop: OwnedHop = {\n ...(typeClasses?.length ? {typeClasses} : {}),\n predicate: edge.predicate,\n closure: closureOf(edge.target),\n };\n const next = [...hops, hop];\n targets.push({hops: next, blankProps: blankCapableProperties(edge.target)});\n visit(edge.target, next, [...path, edge.target], repeats + repeat);\n }\n };\n visit(rootShapeId, [], [rootShapeId], 0);\n if (targets.length > OWNED_BRANCH_WARNING && !warnedBranches.has(rootShapeId)) {\n warnedBranches.add(rootShapeId);\n console.warn(\n `[linked] Deleting a '${rootShapeId}' walks ${targets.length} owned paths (more than ` +\n `${OWNED_BRANCH_WARNING}); each is one UNION branch of the delete.`,\n );\n }\n const walk: OwnedWalk = {\n rootClosure: closureOf(rootShapeId),\n rootBlankProps: blankCapableProperties(rootShapeId),\n targets,\n };\n ownedWalkCache.set(rootShapeId, walk);\n return walk;\n}\n\n/** `FILTER(!sameTerm(?n, rdf:nil))`: the walk never deletes `rdf:nil`, which every list ends in. */\nfunction notNil(term: SparqlTerm): SparqlExpression | null {\n if (term.kind !== 'variable') return null;\n return {\n kind: 'not_expr',\n inner: {\n kind: 'function_expr',\n name: 'sameTerm',\n args: [{kind: 'variable_expr', name: term.name}, {kind: 'iri_expr', value: RDF_NIL}],\n },\n };\n}\n\n/** `inner` filtered by every expression in `filters` (unchanged when there are none). */\nfunction filtered(inner: SparqlAlgebraNode, filters: SparqlExpression[]): SparqlAlgebraNode {\n if (filters.length === 0) return inner;\n return {\n type: 'filter',\n expression: filters.length === 1 ? filters[0] : {kind: 'logical_expr', op: 'and', exprs: filters},\n inner,\n };\n}\n\n/**\n * DELETE patterns and UNION branches that delete the owned subtree below `rootTerm`, a node of\n * `rootShapeId` (see `ownedWalk`). The root itself is the caller's: the subject wildcard of a\n * delete, or `buildOwnedSelfDelete` for a replaced value. Each branch deletes one node per\n * solution, its own triples and its blank values. Schematically (variable names simplified):\n *\n * ```sparql\n * …anchor… <root> (r…)* ?w . # the root shape's self-loop, if any\n * ?w a <SubClass> . # a typed hop only\n * ?w <c1> ?x0e . ?x0e (s…)* ?x0 . # closure only for a self-owning target shape\n * ?x0 ?x0p ?x0o . FILTER(!sameTerm(?x0, rdf:nil))\n * ```\n *\n * `anchor` leads every branch: the owning edge that binds a variable root (`<s> <p> ?old`), or a\n * bulk delete's type triple, so a branch evaluated on its own never runs with an unbound root.\n * `keep` filters every branch on the root (`FILTER(?old NOT IN (…))`).\n */\nfunction ownedSubtreeBlocks(\n rootShapeId: string,\n rootTerm: SparqlTerm,\n anchor: SparqlTriple[],\n varPrefix: string,\n keep?: SparqlTerm[],\n): {deletePatterns: SparqlTriple[]; whereBlocks: SparqlAlgebraNode[]} {\n const walk = ownedWalk(rootShapeId);\n const deletePatterns: SparqlTriple[] = [];\n const whereBlocks: SparqlAlgebraNode[] = [];\n const emit = (\n reach: SparqlTriple[],\n filters: SparqlExpression[],\n node: SparqlTerm,\n blankProps: PropertyShapeData[],\n prefix: string,\n ) => {\n const nil = notNil(node);\n const all = nil ? [...filters, nil] : filters;\n const own = tripleOf(node, varTerm(`${prefix}p`), varTerm(`${prefix}o`));\n deletePatterns.push(own);\n whereBlocks.push(keepFilter(filtered({type: 'bgp', triples: [...anchor, ...reach, own]}, all), rootTerm, keep));\n if (blankProps.length === 0) return;\n const blank = buildBlankCascade(\n [...anchor, ...reach],\n node,\n simplePredicates(blankProps),\n blankWalkPredicates(blankProps),\n `${prefix}b_`,\n );\n if (!blank) return;\n deletePatterns.push(...blank.deletePatterns);\n whereBlocks.push(keepFilter(filtered(blank.whereBlock, all), rootTerm, keep));\n };\n\n let base = rootTerm;\n const baseReach: SparqlTriple[] = [];\n if (walk.rootClosure.length > 0) {\n // The other nodes of the root's own kind (the tail cells of a list).\n const others = varTerm(`${varPrefix}r`);\n emit(\n [tripleOf(rootTerm, predicatePathTerm(walk.rootClosure, 'oneOrMore'), others)],\n [],\n others,\n walk.rootBlankProps,\n `${varPrefix}r`,\n );\n if (walk.targets.length > 0) {\n base = varTerm(`${varPrefix}w`);\n baseReach.push(tripleOf(rootTerm, predicatePathTerm(walk.rootClosure, 'zeroOrMore'), base));\n }\n }\n walk.targets.forEach((target, t) => {\n const reach = [...baseReach];\n const filters: SparqlExpression[] = [];\n let at = base;\n target.hops.forEach((hop, h) => {\n const name = `${varPrefix}${t}_${h}`;\n if (hop.typeClasses?.length === 1) {\n reach.push(tripleOf(at, iriTerm(RDF_TYPE), iriTerm(hop.typeClasses[0])));\n } else if (hop.typeClasses) {\n reach.push(tripleOf(at, iriTerm(RDF_TYPE), varTerm(`${name}t`)));\n filters.push({\n kind: 'in_expr',\n negated: false,\n value: {kind: 'variable_expr', name: `${name}t`},\n list: hop.typeClasses.map((value) => ({kind: 'iri_expr' as const, value})),\n });\n }\n const end = varTerm(hop.closure.length > 0 ? `${name}e` : name);\n reach.push(tripleOf(at, iriTerm(hop.predicate), end));\n if (hop.closure.length > 0) {\n reach.push(tripleOf(end, predicatePathTerm(hop.closure, 'zeroOrMore'), varTerm(name)));\n }\n at = varTerm(name);\n });\n emit(reach, filters, at, target.blankProps, `${varPrefix}${t}_`);\n });\n return {deletePatterns, whereBlocks};\n}\n\n/**\n * Wrap an owned-cleanup block in `FILTER(?old NOT IN (<k1>, …))` so a value the mutation\n * keeps (re-sent as a bare `{id}`) is not deleted. The filter sits inside the block, next\n * to the edge triple that binds `?old`, so it only removes that block's matches; the\n * edge-only delete of the same value stays and is undone by the INSERT. With an IRI old\n * term, or nothing to keep, the block is returned unchanged.\n */\nfunction keepFilter(\n block: SparqlAlgebraNode,\n oldTerm: SparqlTerm,\n keep?: SparqlTerm[],\n): SparqlAlgebraNode {\n const kept = (keep ?? []).flatMap((term) =>\n term.kind === 'iri' ? [{kind: 'iri_expr' as const, value: term.value}] : [],\n );\n if (oldTerm.kind !== 'variable' || kept.length === 0) return block;\n return {\n type: 'filter',\n expression: {\n kind: 'in_expr',\n negated: true,\n value: {kind: 'variable_expr', name: oldTerm.name},\n list: kept,\n },\n inner: block,\n };\n}\n\n/**\n * Build DELETE + WHERE OPTIONAL that removes the *old node's own* one-hop triples when a\n * `contains` edge is replaced, unset, or set-removed. A `contains` edge asserts exclusive\n * ownership, so overwriting it must delete the previously owned child fully — not merely\n * unlink it — or the child orphans (backlog 032). Ownership via the edge is sufficient.\n * Owned descendants *below* the old node are deleted separately (`ownedSubtreeBlocks`).\n *\n * The owning edge `<subject> <prop> ?old` is re-asserted INSIDE the WHERE group so `?old`\n * is bound there: when no old value exists the group matches nothing and the DELETE is a\n * no-op, rather than an unbound `?old` matching (and deleting) the whole graph. When\n * `oldTerm` is a concrete IRI (set-remove), the guard just confirms the link still holds.\n *\n * `keep` lists the bare `{id}`s the mutation writes again (a re-sent current value, the\n * retained ids of an array overwrite). With a variable `oldTerm` the block is wrapped in\n * `FILTER(?old NOT IN (…))`, so a kept value is not deleted; its edge is deleted and\n * re-inserted, a no-op. A nested create carrying an id is never kept: it rewrites that node.\n */\nexport function buildOwnedSelfDelete(\n subjectTerm: SparqlTerm,\n propertyTerm: SparqlTerm,\n oldTerm: SparqlTerm,\n varPrefix: string,\n keep?: SparqlTerm[],\n): {deletePatterns: SparqlTriple[]; whereOptionals: SparqlAlgebraNode[]} {\n const p = varTerm(`${varPrefix}sp`);\n const o = varTerm(`${varPrefix}so`);\n const wildcard = tripleOf(oldTerm, p, o);\n const nil = notNil(oldTerm);\n return {\n deletePatterns: [wildcard],\n whereOptionals: [\n keepFilter(\n filtered(\n {type: 'bgp', triples: [tripleOf(subjectTerm, propertyTerm, oldTerm), wildcard]},\n nil ? [nil] : [],\n ),\n oldTerm,\n keep,\n ),\n ],\n };\n}\n\n/**\n * Converts an IRDeleteMutation to a SparqlDeleteInsertPlan (DELETE + WHERE).\n *\n * The WHERE is the type guard of every id, joined with ONE UNION of independent\n * blocks: per id its own triples, its incoming references, its blank values and one branch\n * per owned path, plus that node's blank values (`ownedSubtreeBlocks`: the shape's own and\n * inherited `contains` properties, their value shapes' in turn, and the extra ones of\n * registered sub-shapes behind a type guard; none for a shape that owns nothing). The\n * bulk deletes (`deleteAllToAlgebra`, `deleteWhereToAlgebra`) add the same owned blocks,\n * rooted at the subject variable (see `bulkDeleteUnion`).\n *\n * The blocks must not be chained as OPTIONALs. A chain of OPTIONALs is a join, so\n * the solutions multiply: own triples x incoming references x owned triples of each\n * owned path. Deleting one shape description with the shape sync's cascade\n * produced ~27,000 solutions for ~130 triples and took over 30 seconds on Fuseki,\n * which re-evaluated the former registry-wide cascade path for every left-hand row. A UNION\n * yields each block's matches once, so the solutions add up instead, and it deletes\n * exactly the same triples: a DELETE template triple whose variables a solution\n * leaves unbound is skipped, as it was for an OPTIONAL that did not match.\n *\n * The guards stay required for every id, as before: when any id is not of the\n * shape, the WHERE has no solution and nothing is deleted.\n */\nexport function deleteToAlgebra(\n query: IRDeleteMutation,\n _options?: SparqlOptions,\n): SparqlDeleteInsertPlan {\n const deletePatterns: SparqlTriple[] = [];\n const guards: SparqlTriple[] = [];\n const blocks: SparqlAlgebraNode[] = [];\n\n for (let i = 0; i < query.ids.length; i++) {\n const subjectTerm = iriTerm(query.ids[i].id);\n const idx = query.ids.length > 1 ? `_${i}` : '';\n\n const subjWild = tripleOf(subjectTerm, varTerm(`p${idx}`), varTerm(`o${idx}`));\n const objWild = tripleOf(varTerm(`s${idx}`), varTerm(`p2${idx}`), subjectTerm);\n const typeGuard = tripleOf(subjectTerm, iriTerm(RDF_TYPE), iriTerm(resolveShapeScanIri(query.shape)));\n\n // DELETE block: all patterns (subject-wildcard, object-wildcard, type)\n deletePatterns.push(subjWild, objWild, typeGuard);\n\n // WHERE: the type guard is required; the subject's own triples and its\n // incoming references (the entity may have none) are separate UNION blocks.\n guards.push(typeGuard);\n blocks.push({type: 'bgp', triples: [subjWild]}, {type: 'bgp', triples: [objWild]});\n\n // The subject's own blank values (through its blank-capable properties) and the blank\n // nodes below them.\n const blank = subjectBlankCascade(query.shape, subjectTerm, [], `b${idx}_`);\n if (blank) {\n deletePatterns.push(...blank.deletePatterns);\n blocks.push(blank.whereBlock);\n }\n\n // The owned subtree: every node the subject's `contains` properties reach (`ownedWalk`).\n const owned = ownedSubtreeBlocks(query.shape, subjectTerm, [], `c${idx}_`);\n deletePatterns.push(...owned.deletePatterns);\n blocks.push(...owned.whereBlocks);\n }\n\n const whereAlgebra: SparqlAlgebraNode = {\n type: 'join',\n left: {type: 'bgp', triples: guards},\n right: unionOf(blocks),\n };\n\n return {\n type: 'delete_insert',\n deletePatterns,\n insertPatterns: [],\n whereAlgebra,\n };\n}\n\n/**\n * The cleanup blocks of a bulk delete, already joined with the root's own triples as ONE\n * UNION so their matches add up instead of multiplying; `null` when there is nothing to\n * clean up (the root wildcard then stays in the required BGP).\n *\n * - The blank-node cascade of the shape's blank-capable properties (`subjectBlankCascade`).\n * - The same owned subtree as a delete by id (`ownedSubtreeBlocks`), rooted at the subject\n * variable. Each owned block is led by the subject's type triple. With a linear join it is\n * redundant; it keeps a branch that is evaluated on its own from running `?a0 <c> ?x` with\n * both ends unbound, which matches every edge in the graph.\n */\nfunction bulkDeleteUnion(\n shapeId: string,\n subjectVar: string,\n rootWildcard: SparqlTriple,\n typeTriple: SparqlTriple,\n deletePatterns: SparqlTriple[],\n): SparqlAlgebraNode | null {\n const blocks: SparqlAlgebraNode[] = [];\n const blank = subjectBlankCascade(shapeId, varTerm(subjectVar), [typeTriple], 'b_');\n if (blank) {\n deletePatterns.push(...blank.deletePatterns);\n blocks.push(blank.whereBlock);\n }\n const owned = ownedSubtreeBlocks(shapeId, varTerm(subjectVar), [typeTriple], 'c_');\n deletePatterns.push(...owned.deletePatterns);\n blocks.push(...owned.whereBlocks);\n if (blocks.length === 0) return null;\n return unionOf([{type: 'bgp', triples: [rootWildcard]}, ...blocks]);\n}\n\n/**\n * Converts an IRDeleteAllMutation to a SparqlDeleteInsertPlan.\n *\n * Generates DELETE { ?a0 ?p ?o . [blank-node and owned-cleanup wildcards] }\n * WHERE { ?a0 a <Shape> . { ?a0 ?p ?o } UNION [one block per blank node,\n * owned group] }\n * (see `bulkDeleteUnion`). Unlike a delete by id, incoming references are not deleted.\n */\nexport function deleteAllToAlgebra(\n query: IRDeleteAllMutation,\n _options?: SparqlOptions,\n): SparqlDeleteInsertPlan {\n const subjectVar = 'a0';\n\n // DELETE patterns: root wildcard\n const deletePatterns: SparqlTriple[] = [\n tripleOf(varTerm(subjectVar), varTerm('p'), varTerm('o')),\n ];\n\n // WHERE: type triple, then the root wildcard and the blank-node cleanup\n const typeTriple = tripleOf(varTerm(subjectVar), iriTerm(RDF_TYPE), iriTerm(resolveShapeScanIri(query.shape)));\n const rootWildcard = tripleOf(varTerm(subjectVar), varTerm('p'), varTerm('o'));\n const union = bulkDeleteUnion(query.shape, subjectVar, rootWildcard, typeTriple, deletePatterns);\n const whereAlgebra: SparqlAlgebraNode = union\n ? {type: 'join', left: {type: 'bgp', triples: [typeTriple]}, right: union}\n : {type: 'bgp', triples: [typeTriple, rootWildcard]};\n\n return {\n type: 'delete_insert',\n deletePatterns,\n insertPatterns: [],\n whereAlgebra,\n };\n}\n\n/**\n * Converts an IRDeleteWhereMutation to a SparqlDeleteInsertPlan.\n *\n * Like deleteAllToAlgebra but adds filter conditions from the where clause. The cleanup\n * UNION (blank nodes, owned subtree) is joined with the filtered match,\n * so only the matched subjects' children are deleted.\n */\nexport function deleteWhereToAlgebra(\n query: IRDeleteWhereMutation,\n _options?: SparqlOptions,\n): SparqlDeleteInsertPlan {\n const subjectVar = 'a0';\n const registry = new VariableRegistry();\n\n // DELETE patterns: root wildcard\n const deletePatterns: SparqlTriple[] = [\n tripleOf(varTerm(subjectVar), varTerm('p'), varTerm('o')),\n ];\n\n // WHERE: type triple + the where clause; the root wildcard and blank-node cleanup follow\n const typeTriple = tripleOf(varTerm(subjectVar), iriTerm(RDF_TYPE), iriTerm(resolveShapeScanIri(query.shape)));\n const rootWildcard = tripleOf(varTerm(subjectVar), varTerm('p'), varTerm('o'));\n const union = bulkDeleteUnion(query.shape, subjectVar, rootWildcard, typeTriple, deletePatterns);\n let whereAlgebra: SparqlAlgebraNode = {\n type: 'bgp',\n triples: union ? [typeTriple] : [typeTriple, rootWildcard],\n };\n\n // Process where patterns (traversals from the where clause)\n const traverseTriples: SparqlTriple[] = [];\n const optionalPropertyTriples: SparqlTriple[] = [];\n for (const pattern of query.wherePatterns) {\n processPattern(pattern, registry, traverseTriples, optionalPropertyTriples);\n }\n\n // Add traverse triples to required BGP\n if (traverseTriples.length > 0) {\n whereAlgebra = joinNodes(whereAlgebra, {type: 'bgp', triples: traverseTriples});\n }\n\n // Process expression to discover property triples\n processExpressionForProperties(query.where, registry, optionalPropertyTriples);\n\n // Add optional property triples\n for (const triple of optionalPropertyTriples) {\n whereAlgebra = joinNodes(whereAlgebra, {type: 'bgp', triples: [triple]});\n }\n\n // Convert and add filter expression\n const filterExpr = convertExpression(query.where, registry, []);\n whereAlgebra = {type: 'filter', expression: filterExpr, inner: whereAlgebra};\n\n if (union) {\n whereAlgebra = {type: 'join', left: whereAlgebra, right: union};\n }\n\n return {\n type: 'delete_insert',\n deletePatterns,\n insertPatterns: [],\n whereAlgebra,\n };\n}\n\n/**\n * Converts an IRUpdateWhereMutation to a SparqlDeleteInsertPlan.\n *\n * Like updateToAlgebra but uses a variable subject (?a0) instead of a\n * hardcoded entity IRI, adds a type triple, and optionally includes\n * filter conditions from the where clause.\n */\nexport function updateWhereToAlgebra(\n query: IRUpdateWhereMutation,\n options?: SparqlOptions,\n): SparqlDeleteInsertPlan {\n const subjectTerm = varTerm('a0');\n const result = processUpdateFields(query.data, subjectTerm, options);\n\n // WHERE: type triple is always required\n const typeTriple = tripleOf(subjectTerm, iriTerm(RDF_TYPE), iriTerm(resolveShapeScanIri(query.data.shape)));\n let whereAlgebra: SparqlAlgebraNode = {type: 'bgp', triples: [typeTriple]};\n\n // Process where filter conditions (if any)\n if (query.where && query.wherePatterns) {\n const registry = new VariableRegistry();\n const traverseTriples: SparqlTriple[] = [];\n const optionalPropertyTriples: SparqlTriple[] = [];\n\n for (const pattern of query.wherePatterns) {\n processPattern(pattern, registry, traverseTriples, optionalPropertyTriples);\n }\n\n if (traverseTriples.length > 0) {\n whereAlgebra = joinNodes(whereAlgebra, {type: 'bgp', triples: traverseTriples});\n }\n\n processExpressionForProperties(query.where, registry, optionalPropertyTriples);\n\n for (const triple of optionalPropertyTriples) {\n whereAlgebra = joinNodes(whereAlgebra, {type: 'bgp', triples: [triple]});\n }\n\n const filterExpr = convertExpression(query.where, registry, []);\n whereAlgebra = {type: 'filter', expression: filterExpr, inner: whereAlgebra};\n }\n\n // Old-value triples anchored on a traversal *target* belong INSIDE that\n // traversal's OPTIONAL group, not beside it: beside it, the leaf's subject variable\n // is introduced by an OPTIONAL that shares no variable with anything to its left — a\n // cartesian product over every node carrying that predicate. `buildUpdateWhere` does\n // that split for both update paths.\n whereAlgebra = buildUpdateWhere(whereAlgebra, result, query.traversalPatterns, subjectTerm);\n\n return {\n type: 'delete_insert',\n deletePatterns: result.deletePatterns,\n insertPatterns: result.insertPatterns,\n whereAlgebra,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Ask conversion\n// ---------------------------------------------------------------------------\n\n/**\n * Converts an {@link IRAskQuery} to a {@link SparqlAskPlan}.\n *\n * Two cases:\n *\n * - **Rootless** (no shape scan) — a bare subject, emitted as `<iri> ?p ?o`. This\n * is \"does a node with this IRI exist at all\", with no `rdf:type` constraint.\n * - **Shaped** — the pattern is built by {@link selectToAlgebra}, so shape scans,\n * traversals, filters and `MINUS` have exactly one implementation. Only the\n * pattern is kept; the select plan's projection is discarded.\n *\n * `IRAskQuery` has no projection, `orderBy`, `limit` or `offset` to ignore or\n * reject — an `ASK` cannot express them, so the IR cannot carry them. The one\n * thing that *does* need guarding is an aggregate in the where clause, which\n * lowers to `GROUP BY` + `HAVING` rather than to a `FILTER`; see below.\n */\nexport function askToAlgebra(\n query: IRAskQuery,\n options?: SparqlOptions,\n): SparqlAskPlan {\n if (!query.root) {\n if (!query.subjectId) {\n throw new Error(\n 'askToAlgebra: a shapeless ask needs a subject — there is no shape to scan ' +\n 'and no subject to test, so the query matches every node in the store.',\n );\n }\n // ASK { <iri> ?p ?o } — existence of the node itself, under any type or none.\n const bgp: SparqlBGP = {\n type: 'bgp',\n triples: [\n tripleOf(iriTerm(query.subjectId), varTerm('p'), varTerm('o')),\n ],\n };\n return {type: 'ask', algebra: bgp};\n }\n const inner = selectToAlgebra(\n {\n kind: 'select',\n root: query.root,\n patterns: query.patterns,\n projection: [],\n where: query.where,\n subjectId: query.subjectId,\n subjectIds: query.subjectIds,\n },\n options,\n );\n if (inner.having) {\n // Same trap as in `countToAlgebra`: an aggregate in the WHERE clause (e.g.\n // `p.friends.size().gt(2)`) lowers to HAVING + GROUP BY on the select plan, and\n // only `algebra` is carried over here — so the HAVING would vanish and the ASK\n // would answer the UNFILTERED question, `true` for any store holding one\n // instance of the shape. A boolean of the right type for the wrong question is\n // worse than an error: nothing downstream can tell. Asking it properly needs\n // `ASK { SELECT ?a0 WHERE { … } GROUP BY ?a0 HAVING(…) }`, and `SparqlSubSelect`\n // carries no groupBy/having today. Refuse it rather than answer it wrongly.\n throw new Error(\n 'Cannot ask a query whose where clause contains an aggregate (e.g. ' +\n '`.where(p => p.friends.size().gt(2))`). That filter lowers to HAVING over a ' +\n 'per-subject group, and testing whether any group survives needs a nested ' +\n 'sub-SELECT that this layer does not emit yet. Filter without an aggregate, or ' +\n 'run the select and check for rows.',\n );\n }\n return {type: 'ask', algebra: inner.algebra};\n}\n\n/**\n * Converts an {@link IRCountQuery} to a {@link SparqlSelectPlan} shaped as a\n * root-level count:\n *\n * ```sparql\n * SELECT (COUNT(DISTINCT ?a0) AS ?count) WHERE { … }\n * ```\n *\n * The **pattern** is built by {@link selectToAlgebra}, so shape scans, traversals,\n * filters and `MINUS` have exactly one implementation; only the pattern is kept and\n * the select plan's projection is discarded. That discard is load-bearing:\n * `selectToAlgebra` unconditionally projects the root alias as a plain variable, and\n * then makes every plain projected variable a `GROUP BY` target once an aggregate is\n * present — so reusing its projection would yield `SELECT ?a0 (COUNT(…) AS ?count) …\n * GROUP BY ?a0`, one row per entity each counting 1.\n *\n * `DISTINCT` inside the aggregate is likewise load-bearing. A shape scan joined with\n * property triples yields one row per property-value combination (which is why the\n * plain select path emits `SELECT DISTINCT`), so `COUNT(?a0)` would count *rows* and\n * a filter on a multi-valued property would inflate the total. `COUNT(DISTINCT ?a0)`\n * counts subjects, which is what \"how many instances match\" means.\n *\n * There is no `groupBy`, `orderBy`, `limit` or `offset` on the returned plan — and\n * nothing to guard against, because {@link IRCountQuery} cannot carry them.\n */\nexport function countToAlgebra(\n query: IRCountQuery,\n options?: SparqlOptions,\n): SparqlSelectPlan {\n if (!query.root) {\n throw new Error(\n 'countToAlgebra: query.root is undefined. A count needs a shape to scan — a ' +\n 'shapeless count would count every node in the store.',\n );\n }\n const inner = selectToAlgebra(\n {\n kind: 'select',\n root: query.root,\n patterns: query.patterns,\n projection: [],\n where: query.where,\n subjectId: query.subjectId,\n subjectIds: query.subjectIds,\n },\n options,\n );\n if (inner.having) {\n // An aggregate in the WHERE clause (e.g. `p.friends.size().gt(2)`) lowers to\n // HAVING + GROUP BY on the select plan. Only `algebra` is carried over here, so\n // the HAVING would vanish and the count would be of the UNFILTERED match set —\n // a plausible-looking wrong number. Counting a HAVING-filtered group set needs\n // `SELECT (COUNT(DISTINCT ?a0) AS ?count) WHERE { SELECT ?a0 WHERE { … }\n // GROUP BY ?a0 HAVING(…) }`, and `SparqlSubSelect` carries no groupBy/having\n // today. Refuse it rather than answer it wrongly.\n throw new Error(\n 'Cannot count a query whose where clause contains an aggregate (e.g. ' +\n '`.where(p => p.friends.size().gt(2))`). That filter lowers to HAVING over a ' +\n 'per-subject group, and counting the surviving groups needs a nested ' +\n 'sub-SELECT that this layer does not emit yet. Filter without an aggregate, or ' +\n 'count the rows of the select.',\n );\n }\n const aggregate: SparqlAggregateExpr = {\n kind: 'aggregate_expr',\n name: 'count',\n args: [{kind: 'variable_expr', name: query.root.alias}],\n distinct: true,\n };\n return {\n type: 'select',\n algebra: inner.algebra,\n projection: [{kind: 'aggregate', expression: aggregate, alias: query.alias}],\n aggregates: [{variable: query.alias, aggregate}],\n };\n}\n\n// ---------------------------------------------------------------------------\n// Convenience wrappers: IR → algebra → SPARQL string in one call\n// ---------------------------------------------------------------------------\n\n/**\n * Converts an IRSelectQuery to a SPARQL string.\n */\nexport function selectToSparql(\n query: IRSelectQuery,\n options?: SparqlOptions,\n): string {\n const plan = selectToAlgebra(query, options);\n return selectPlanToSparql(plan, options);\n}\n\n/**\n * Converts an {@link IRAskQuery} to a SPARQL `ASK` string.\n */\nexport function askToSparql(\n query: IRAskQuery,\n options?: SparqlOptions,\n): string {\n const plan = askToAlgebra(query, options);\n return askPlanToSparql(plan, options);\n}\n\n/**\n * Converts an {@link IRCountQuery} to a SPARQL `SELECT (COUNT(DISTINCT …) AS …)`\n * string, through the same {@link selectPlanToSparql} every select uses.\n */\nexport function countToSparql(\n query: IRCountQuery,\n options?: SparqlOptions,\n): string {\n const plan = countToAlgebra(query, options);\n return selectPlanToSparql(plan, options);\n}\n\n/**\n * Converts an IRCreateMutation to a SPARQL string.\n * Stub: will be implemented when algebraToString is available.\n */\nexport function createToSparql(\n query: IRCreateMutation,\n options?: SparqlOptions,\n): string {\n const plan = createToAlgebra(query, options);\n return insertDataPlanToSparql(plan, options);\n}\n\n/**\n * Converts an IRUpdateMutation to a SPARQL string.\n * Stub: will be implemented when algebraToString is available.\n */\nexport function updateToSparql(\n query: IRUpdateMutation,\n options?: SparqlOptions,\n): string {\n const plan = updateToAlgebra(query, options);\n return deleteInsertPlanToSparql(plan, options);\n}\n\n/** Lowers an IRUpsertMutation all the way to a SPARQL update string. */\nexport function upsertToSparql(\n query: IRUpsertMutation,\n options?: SparqlOptions,\n): string {\n const plan = upsertToAlgebra(query, options);\n return deleteInsertPlanToSparql(plan, options);\n}\n\n/**\n * Converts an IRDeleteMutation to a SPARQL string.\n */\nexport function deleteToSparql(\n query: IRDeleteMutation,\n options?: SparqlOptions,\n): string {\n const plan = deleteToAlgebra(query, options);\n return deleteInsertPlanToSparql(plan, options);\n}\n\n/**\n * Converts an IRDeleteAllMutation to a SPARQL string.\n */\nexport function deleteAllToSparql(\n query: IRDeleteAllMutation,\n options?: SparqlOptions,\n): string {\n const plan = deleteAllToAlgebra(query, options);\n return deleteInsertPlanToSparql(plan, options);\n}\n\n/**\n * Converts an IRDeleteWhereMutation to a SPARQL string.\n */\nexport function deleteWhereToSparql(\n query: IRDeleteWhereMutation,\n options?: SparqlOptions,\n): string {\n const plan = deleteWhereToAlgebra(query, options);\n return deleteInsertPlanToSparql(plan, options);\n}\n\n/**\n * Converts an IRUpdateWhereMutation to a SPARQL string.\n */\nexport function updateWhereToSparql(\n query: IRUpdateWhereMutation,\n options?: SparqlOptions,\n): string {\n const plan = updateWhereToAlgebra(query, options);\n return deleteInsertPlanToSparql(plan, options);\n}\n"]}