@oml/owl 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +46 -0
- package/out/index.d.ts +10 -0
- package/out/index.js +12 -0
- package/out/index.js.map +1 -0
- package/out/owl/owl-abox.d.ts +79 -0
- package/out/owl/owl-abox.js +765 -0
- package/out/owl/owl-abox.js.map +1 -0
- package/out/owl/owl-imports.d.ts +9 -0
- package/out/owl/owl-imports.js +102 -0
- package/out/owl/owl-imports.js.map +1 -0
- package/out/owl/owl-interfaces.d.ts +121 -0
- package/out/owl/owl-interfaces.js +3 -0
- package/out/owl/owl-interfaces.js.map +1 -0
- package/out/owl/owl-mapper.d.ts +80 -0
- package/out/owl/owl-mapper.js +1217 -0
- package/out/owl/owl-mapper.js.map +1 -0
- package/out/owl/owl-service.d.ts +65 -0
- package/out/owl/owl-service.js +552 -0
- package/out/owl/owl-service.js.map +1 -0
- package/out/owl/owl-shacl.d.ts +28 -0
- package/out/owl/owl-shacl.js +337 -0
- package/out/owl/owl-shacl.js.map +1 -0
- package/out/owl/owl-sparql.d.ts +71 -0
- package/out/owl/owl-sparql.js +260 -0
- package/out/owl/owl-sparql.js.map +1 -0
- package/out/owl/owl-store.d.ts +32 -0
- package/out/owl/owl-store.js +142 -0
- package/out/owl/owl-store.js.map +1 -0
- package/out/owl/owl-tbox.d.ts +98 -0
- package/out/owl/owl-tbox.js +575 -0
- package/out/owl/owl-tbox.js.map +1 -0
- package/out/owl-module.d.ts +15 -0
- package/out/owl-module.js +22 -0
- package/out/owl-module.js.map +1 -0
- package/package.json +52 -0
- package/src/index.ts +12 -0
- package/src/owl/owl-abox.ts +930 -0
- package/src/owl/owl-imports.ts +108 -0
- package/src/owl/owl-interfaces.ts +145 -0
- package/src/owl/owl-mapper.ts +1510 -0
- package/src/owl/owl-service.ts +642 -0
- package/src/owl/owl-shacl.ts +400 -0
- package/src/owl/owl-sparql.ts +317 -0
- package/src/owl/owl-store.ts +173 -0
- package/src/owl/owl-tbox.ts +727 -0
- package/src/owl-module.ts +52 -0
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
// Copyright (c) 2026 Modelware. All rights reserved.
|
|
2
|
+
|
|
3
|
+
export class ImportGraph {
|
|
4
|
+
// forward edges: A imports B
|
|
5
|
+
// modelUri -> set of URIs it directly imports
|
|
6
|
+
private readonly imports = new Map<string, Set<string>>();
|
|
7
|
+
|
|
8
|
+
// reverse edges: B is imported by A
|
|
9
|
+
// modelUri -> set of URIs that directly depend on it
|
|
10
|
+
private readonly importedBy = new Map<string, Set<string>>();
|
|
11
|
+
|
|
12
|
+
// Update the graph for a single document.
|
|
13
|
+
// Called from ReasoningService.onDocumentValidated.
|
|
14
|
+
// Replaces any existing import edges for this model.
|
|
15
|
+
update(modelUri: string, importedUris: string[]): void {
|
|
16
|
+
const oldImports = this.imports.get(modelUri) ?? new Set<string>();
|
|
17
|
+
for (const importedUri of oldImports) {
|
|
18
|
+
const upstream = this.importedBy.get(importedUri);
|
|
19
|
+
if (!upstream) continue;
|
|
20
|
+
upstream.delete(modelUri);
|
|
21
|
+
if (upstream.size === 0) {
|
|
22
|
+
this.importedBy.delete(importedUri);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
const nextImports = new Set(importedUris);
|
|
27
|
+
this.imports.set(modelUri, nextImports);
|
|
28
|
+
for (const importedUri of nextImports) {
|
|
29
|
+
const upstream = this.importedBy.get(importedUri) ?? new Set<string>();
|
|
30
|
+
upstream.add(modelUri);
|
|
31
|
+
this.importedBy.set(importedUri, upstream);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// Remove a model from the graph entirely.
|
|
36
|
+
// Called when a document is removed from the workspace.
|
|
37
|
+
remove(modelUri: string): void {
|
|
38
|
+
const ownImports = this.imports.get(modelUri) ?? new Set<string>();
|
|
39
|
+
for (const importedUri of ownImports) {
|
|
40
|
+
const upstream = this.importedBy.get(importedUri);
|
|
41
|
+
if (!upstream) continue;
|
|
42
|
+
upstream.delete(modelUri);
|
|
43
|
+
if (upstream.size === 0) {
|
|
44
|
+
this.importedBy.delete(importedUri);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
this.imports.delete(modelUri);
|
|
48
|
+
|
|
49
|
+
const directImporters = this.importedBy.get(modelUri) ?? new Set<string>();
|
|
50
|
+
for (const importerUri of directImporters) {
|
|
51
|
+
const forward = this.imports.get(importerUri);
|
|
52
|
+
if (!forward) continue;
|
|
53
|
+
forward.delete(modelUri);
|
|
54
|
+
if (forward.size === 0) {
|
|
55
|
+
this.imports.delete(importerUri);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
this.importedBy.delete(modelUri);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// Direct imports of a model - one hop only.
|
|
62
|
+
directImportsOf(modelUri: string): string[] {
|
|
63
|
+
return [...(this.imports.get(modelUri) ?? [])];
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// All models that transitively depend on modelUri.
|
|
67
|
+
// i.e. importers that would be affected by a change to modelUri.
|
|
68
|
+
dependentsOf(modelUri: string): string[] {
|
|
69
|
+
const visited = new Set<string>();
|
|
70
|
+
const worklist = [modelUri];
|
|
71
|
+
|
|
72
|
+
while (worklist.length > 0) {
|
|
73
|
+
const current = worklist.shift();
|
|
74
|
+
if (!current || visited.has(current)) continue;
|
|
75
|
+
visited.add(current);
|
|
76
|
+
const importers = this.importedBy.get(current) ?? new Set<string>();
|
|
77
|
+
worklist.push(...importers);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
visited.delete(modelUri);
|
|
81
|
+
return [...visited];
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// Full transitive dependency closure of modelUri.
|
|
85
|
+
// i.e. everything modelUri imports, directly or transitively.
|
|
86
|
+
dependenciesOf(modelUri: string): string[] {
|
|
87
|
+
const visited = new Set<string>();
|
|
88
|
+
const visiting = new Set<string>();
|
|
89
|
+
const ordered: string[] = [];
|
|
90
|
+
|
|
91
|
+
const visit = (uri: string): void => {
|
|
92
|
+
if (visited.has(uri) || visiting.has(uri)) {
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
visiting.add(uri);
|
|
96
|
+
const direct = [...(this.imports.get(uri) ?? new Set<string>())].sort();
|
|
97
|
+
for (const dependency of direct) {
|
|
98
|
+
visit(dependency);
|
|
99
|
+
}
|
|
100
|
+
visiting.delete(uri);
|
|
101
|
+
visited.add(uri);
|
|
102
|
+
ordered.push(uri);
|
|
103
|
+
};
|
|
104
|
+
|
|
105
|
+
visit(modelUri);
|
|
106
|
+
return ordered.filter((uri) => uri !== modelUri);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
// Copyright (c) 2026 Modelware. All rights reserved.
|
|
2
|
+
|
|
3
|
+
import type { NamedNode, Quad, Store } from 'n3';
|
|
4
|
+
import type * as RDF from '@rdfjs/types';
|
|
5
|
+
import type { Ontology } from '@oml/language';
|
|
6
|
+
import type { ChainingResult } from './owl-abox.js';
|
|
7
|
+
import type { ModelDiff, ModelGraphs } from './owl-store.js';
|
|
8
|
+
import type { TBoxIndex } from './owl-tbox.js';
|
|
9
|
+
|
|
10
|
+
export interface OwlMapper {
|
|
11
|
+
toQuads(ontology: Ontology): Quad[];
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export interface OwlStore {
|
|
15
|
+
loadModel(modelUri: string, quads: Quad[]): void;
|
|
16
|
+
loadEntailments(modelUri: string, quads: Quad[]): void;
|
|
17
|
+
applyModelDelta(modelUri: string, quads: Quad[], retracted: Quad[], asserted: Quad[]): void;
|
|
18
|
+
retractModel(modelUri: string): void;
|
|
19
|
+
diffModel(modelUri: string, newQuads: Quad[]): ModelDiff;
|
|
20
|
+
clearEntailments(modelUri: string): void;
|
|
21
|
+
graphs(modelUri: string): ModelGraphs;
|
|
22
|
+
getStore(): Store;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export interface OwlImportGraph {
|
|
26
|
+
update(modelUri: string, importedUris: string[]): void;
|
|
27
|
+
remove(modelUri: string): void;
|
|
28
|
+
directImportsOf(modelUri: string): string[];
|
|
29
|
+
dependentsOf(modelUri: string): string[];
|
|
30
|
+
dependenciesOf(modelUri: string): string[];
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export interface OwlTBoxChainer {
|
|
34
|
+
chain(modelUri: string): void;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export interface OwlTBoxIndexBuilder {
|
|
38
|
+
buildOwn(modelUri: string, ontology?: Ontology): TBoxIndex;
|
|
39
|
+
buildMerged(modelUri: string): TBoxIndex;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export interface OwlTBoxIndexCache {
|
|
43
|
+
getOwn(modelUri: string): TBoxIndex | undefined;
|
|
44
|
+
setOwn(modelUri: string, index: TBoxIndex): void;
|
|
45
|
+
hasOwn(modelUri: string): boolean;
|
|
46
|
+
invalidateOwn(modelUri: string): void;
|
|
47
|
+
getMerged(modelUri: string): TBoxIndex | undefined;
|
|
48
|
+
setMerged(modelUri: string, index: TBoxIndex): void;
|
|
49
|
+
hasMerged(modelUri: string): boolean;
|
|
50
|
+
isMergedDirty(modelUri: string): boolean;
|
|
51
|
+
invalidateMerged(modelUri: string): void;
|
|
52
|
+
invalidateMergedAll(modelUris: string[]): void;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export interface OwlABoxChainer {
|
|
56
|
+
chain(
|
|
57
|
+
modelUri: string,
|
|
58
|
+
tboxIndex: TBoxIndex,
|
|
59
|
+
readModelUris: ReadonlyArray<string>,
|
|
60
|
+
deltaPlus: Quad[],
|
|
61
|
+
deltaMinus: Quad[],
|
|
62
|
+
): ChainingResult;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export interface OwlABoxEntailmentState {
|
|
66
|
+
markDirty(modelUri: string): void;
|
|
67
|
+
markDirtyWithDelta(modelUri: string, asserted: Quad[], retracted: Quad[]): void;
|
|
68
|
+
markClean(modelUri: string): void;
|
|
69
|
+
markDirtyAll(modelUris: string[]): void;
|
|
70
|
+
isDirty(modelUri: string): boolean;
|
|
71
|
+
isAbsent(modelUri: string): boolean;
|
|
72
|
+
consumeDelta(modelUri: string): { plus: Quad[]; minus: Quad[] };
|
|
73
|
+
getValidationWarnings(modelUri: string): string[];
|
|
74
|
+
setValidationWarnings(modelUri: string, warnings: string[]): void;
|
|
75
|
+
invalidate(modelUri: string): void;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
export interface OwlInferenceRunner {
|
|
79
|
+
runInference(modelUri: string): ChainingResult;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
export interface OwlQueryTerm {
|
|
83
|
+
termType: 'NamedNode' | 'Literal' | 'BlankNode';
|
|
84
|
+
value: string;
|
|
85
|
+
datatype?: string;
|
|
86
|
+
language?: string;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
export type OwlQueryRow = Map<string, OwlQueryTerm>;
|
|
90
|
+
|
|
91
|
+
export interface OwlQueryResult {
|
|
92
|
+
success: boolean;
|
|
93
|
+
rows: OwlQueryRow[];
|
|
94
|
+
warnings: string[];
|
|
95
|
+
error?: string;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
export interface OwlConstructResult {
|
|
99
|
+
success: boolean;
|
|
100
|
+
quads: RDF.Quad[];
|
|
101
|
+
warnings: string[];
|
|
102
|
+
error?: string;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
export interface OwlSparqlService {
|
|
106
|
+
invalidateFilteredStore(modelUri: string): void;
|
|
107
|
+
removeFilteredStore(modelUri: string): void;
|
|
108
|
+
query(modelUri: string, sparql: string): Promise<OwlQueryResult>;
|
|
109
|
+
construct(modelUri: string, sparql: string): Promise<OwlConstructResult>;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
export interface OwlShaclValidationIssue {
|
|
113
|
+
message: string;
|
|
114
|
+
focusNode?: string;
|
|
115
|
+
path?: string;
|
|
116
|
+
propertyName?: string;
|
|
117
|
+
severity?: string;
|
|
118
|
+
source?: string;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
export interface OwlShaclValidationResult {
|
|
122
|
+
conforms: boolean;
|
|
123
|
+
issues: OwlShaclValidationIssue[];
|
|
124
|
+
error?: string;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
export interface OwlShaclService {
|
|
128
|
+
validateShacl(modelUri: string | undefined, shaclSource: string): Promise<OwlShaclValidationResult>;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
export interface OwlReasoningDependencies {
|
|
132
|
+
mapper: OwlMapper;
|
|
133
|
+
reasoningStore: OwlStore;
|
|
134
|
+
importGraph: OwlImportGraph;
|
|
135
|
+
tboxChainer: OwlTBoxChainer;
|
|
136
|
+
tboxIndexBuilder: OwlTBoxIndexBuilder;
|
|
137
|
+
tboxIndexCache: OwlTBoxIndexCache;
|
|
138
|
+
aboxChainer: OwlABoxChainer;
|
|
139
|
+
aboxEntailmentCache: OwlABoxEntailmentState;
|
|
140
|
+
createSparqlService: (runner: OwlInferenceRunner) => OwlSparqlService;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
export interface OwlGraphResolver {
|
|
144
|
+
getQueryGraphs(modelUri: string): NamedNode[];
|
|
145
|
+
}
|