rust-kgdb 0.4.1 → 0.4.2
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 +1236 -1971
- package/examples/business-assertions.test.ts +1196 -0
- package/examples/core-concepts-demo.ts +502 -0
- package/examples/datalog-example.ts +478 -0
- package/examples/embeddings-example.ts +376 -0
- package/examples/graphframes-example.ts +367 -0
- package/examples/hypermind-fraud-underwriter.ts +669 -0
- package/examples/pregel-example.ts +399 -0
- package/package.json +3 -2
|
@@ -0,0 +1,399 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pregel Example for rust-kgdb TypeScript SDK
|
|
3
|
+
*
|
|
4
|
+
* Demonstrates Bulk Synchronous Parallel (BSP) graph processing:
|
|
5
|
+
* - Pregel programming model
|
|
6
|
+
* - Vertex-centric computation
|
|
7
|
+
* - Message passing between vertices
|
|
8
|
+
* - Superstep synchronization
|
|
9
|
+
* - Built-in algorithms (shortest paths, connected components)
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import { GraphFrame, PregelProgram } from 'rust-kgdb';
|
|
13
|
+
|
|
14
|
+
// =============================================================================
|
|
15
|
+
// Example 1: Pregel Shortest Paths
|
|
16
|
+
// =============================================================================
|
|
17
|
+
|
|
18
|
+
async function shortestPathsPregelExample() {
|
|
19
|
+
console.log('=== Pregel Shortest Paths ===\n');
|
|
20
|
+
|
|
21
|
+
// Create a road network graph
|
|
22
|
+
const vertices = JSON.stringify([
|
|
23
|
+
{ id: 'sf', name: 'San Francisco' },
|
|
24
|
+
{ id: 'la', name: 'Los Angeles' },
|
|
25
|
+
{ id: 'lv', name: 'Las Vegas' },
|
|
26
|
+
{ id: 'phx', name: 'Phoenix' },
|
|
27
|
+
{ id: 'den', name: 'Denver' },
|
|
28
|
+
{ id: 'slc', name: 'Salt Lake City' },
|
|
29
|
+
{ id: 'sea', name: 'Seattle' },
|
|
30
|
+
{ id: 'pdx', name: 'Portland' }
|
|
31
|
+
]);
|
|
32
|
+
|
|
33
|
+
const edges = JSON.stringify([
|
|
34
|
+
// West Coast corridor
|
|
35
|
+
{ src: 'sf', dst: 'la', weight: 380 }, // SF to LA: 380 miles
|
|
36
|
+
{ src: 'sf', dst: 'pdx', weight: 640 }, // SF to Portland
|
|
37
|
+
{ src: 'pdx', dst: 'sea', weight: 175 }, // Portland to Seattle
|
|
38
|
+
|
|
39
|
+
// Southwest routes
|
|
40
|
+
{ src: 'la', dst: 'lv', weight: 270 }, // LA to Las Vegas
|
|
41
|
+
{ src: 'la', dst: 'phx', weight: 370 }, // LA to Phoenix
|
|
42
|
+
{ src: 'lv', dst: 'phx', weight: 300 }, // Las Vegas to Phoenix
|
|
43
|
+
{ src: 'lv', dst: 'slc', weight: 420 }, // Las Vegas to Salt Lake City
|
|
44
|
+
|
|
45
|
+
// Mountain routes
|
|
46
|
+
{ src: 'phx', dst: 'den', weight: 600 }, // Phoenix to Denver
|
|
47
|
+
{ src: 'slc', dst: 'den', weight: 525 }, // Salt Lake to Denver
|
|
48
|
+
{ src: 'slc', dst: 'sea', weight: 840 } // Salt Lake to Seattle
|
|
49
|
+
]);
|
|
50
|
+
|
|
51
|
+
const graph = new GraphFrame(vertices, edges);
|
|
52
|
+
|
|
53
|
+
// Run Pregel shortest paths from San Francisco
|
|
54
|
+
const landmark = 'sf';
|
|
55
|
+
const maxSupersteps = 10;
|
|
56
|
+
|
|
57
|
+
console.log(`Computing shortest paths from ${landmark}...\n`);
|
|
58
|
+
|
|
59
|
+
const result = graph.pregelShortestPaths(landmark, maxSupersteps);
|
|
60
|
+
const distances = JSON.parse(result);
|
|
61
|
+
|
|
62
|
+
console.log('Shortest distances from San Francisco:');
|
|
63
|
+
const cityNames: Record<string, string> = {
|
|
64
|
+
sf: 'San Francisco', la: 'Los Angeles', lv: 'Las Vegas',
|
|
65
|
+
phx: 'Phoenix', den: 'Denver', slc: 'Salt Lake City',
|
|
66
|
+
sea: 'Seattle', pdx: 'Portland'
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
const sortedDistances = Object.entries(distances.values)
|
|
70
|
+
.sort(([, a], [, b]) => {
|
|
71
|
+
const distA = (a as any).values?.distance ?? Infinity;
|
|
72
|
+
const distB = (b as any).values?.distance ?? Infinity;
|
|
73
|
+
return distA - distB;
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
for (const [city, data] of sortedDistances) {
|
|
77
|
+
const dist = (data as any).values?.distance ?? Infinity;
|
|
78
|
+
const name = cityNames[city] || city;
|
|
79
|
+
if (dist === Infinity || dist > 1e9) {
|
|
80
|
+
console.log(` ${name}: unreachable`);
|
|
81
|
+
} else {
|
|
82
|
+
console.log(` ${name}: ${dist} miles`);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
console.log(`\nCompleted in ${distances.supersteps} supersteps`);
|
|
87
|
+
console.log();
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// =============================================================================
|
|
91
|
+
// Example 2: Custom Pregel Program - PageRank
|
|
92
|
+
// =============================================================================
|
|
93
|
+
|
|
94
|
+
async function customPregelPageRankExample() {
|
|
95
|
+
console.log('=== Custom Pregel PageRank ===\n');
|
|
96
|
+
|
|
97
|
+
// Create a web link graph
|
|
98
|
+
const vertices = JSON.stringify([
|
|
99
|
+
{ id: 'home', title: 'Home Page' },
|
|
100
|
+
{ id: 'about', title: 'About Us' },
|
|
101
|
+
{ id: 'products', title: 'Products' },
|
|
102
|
+
{ id: 'blog', title: 'Blog' },
|
|
103
|
+
{ id: 'contact', title: 'Contact' }
|
|
104
|
+
]);
|
|
105
|
+
|
|
106
|
+
const edges = JSON.stringify([
|
|
107
|
+
// Navigation links
|
|
108
|
+
{ src: 'home', dst: 'about' },
|
|
109
|
+
{ src: 'home', dst: 'products' },
|
|
110
|
+
{ src: 'home', dst: 'blog' },
|
|
111
|
+
{ src: 'home', dst: 'contact' },
|
|
112
|
+
// Internal links
|
|
113
|
+
{ src: 'about', dst: 'contact' },
|
|
114
|
+
{ src: 'products', dst: 'home' },
|
|
115
|
+
{ src: 'products', dst: 'blog' },
|
|
116
|
+
{ src: 'blog', dst: 'home' },
|
|
117
|
+
{ src: 'blog', dst: 'products' },
|
|
118
|
+
{ src: 'contact', dst: 'home' }
|
|
119
|
+
]);
|
|
120
|
+
|
|
121
|
+
const graph = new GraphFrame(vertices, edges);
|
|
122
|
+
|
|
123
|
+
// Custom Pregel program configuration
|
|
124
|
+
const pregelConfig = {
|
|
125
|
+
program: 'pagerank',
|
|
126
|
+
dampingFactor: 0.85,
|
|
127
|
+
maxSupersteps: 20,
|
|
128
|
+
convergenceThreshold: 0.001
|
|
129
|
+
};
|
|
130
|
+
|
|
131
|
+
console.log('Running Pregel PageRank...');
|
|
132
|
+
console.log(` Damping factor: ${pregelConfig.dampingFactor}`);
|
|
133
|
+
console.log(` Max supersteps: ${pregelConfig.maxSupersteps}`);
|
|
134
|
+
console.log(` Convergence threshold: ${pregelConfig.convergenceThreshold}\n`);
|
|
135
|
+
|
|
136
|
+
// Execute using built-in PageRank
|
|
137
|
+
const resetProb = 1 - pregelConfig.dampingFactor;
|
|
138
|
+
const result = graph.pageRank(resetProb, pregelConfig.maxSupersteps);
|
|
139
|
+
const ranks = JSON.parse(result);
|
|
140
|
+
|
|
141
|
+
console.log('PageRank Results:');
|
|
142
|
+
const sortedRanks = Object.entries(ranks)
|
|
143
|
+
.sort(([, a], [, b]) => (b as number) - (a as number));
|
|
144
|
+
|
|
145
|
+
for (const [page, rank] of sortedRanks) {
|
|
146
|
+
const bar = '█'.repeat(Math.round((rank as number) * 50));
|
|
147
|
+
console.log(` ${page.padEnd(10)} ${(rank as number).toFixed(4)} ${bar}`);
|
|
148
|
+
}
|
|
149
|
+
console.log();
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
// =============================================================================
|
|
153
|
+
// Example 3: Pregel Connected Components
|
|
154
|
+
// =============================================================================
|
|
155
|
+
|
|
156
|
+
async function connectedComponentsPregelExample() {
|
|
157
|
+
console.log('=== Pregel Connected Components ===\n');
|
|
158
|
+
|
|
159
|
+
// Create a graph with multiple disconnected components
|
|
160
|
+
const vertices = JSON.stringify([
|
|
161
|
+
// Component 1: European cities
|
|
162
|
+
{ id: 'london' }, { id: 'paris' }, { id: 'berlin' }, { id: 'rome' },
|
|
163
|
+
// Component 2: Asian cities
|
|
164
|
+
{ id: 'tokyo' }, { id: 'seoul' }, { id: 'beijing' },
|
|
165
|
+
// Component 3: Australian cities
|
|
166
|
+
{ id: 'sydney' }, { id: 'melbourne' }
|
|
167
|
+
]);
|
|
168
|
+
|
|
169
|
+
const edges = JSON.stringify([
|
|
170
|
+
// European connections
|
|
171
|
+
{ src: 'london', dst: 'paris' },
|
|
172
|
+
{ src: 'paris', dst: 'berlin' },
|
|
173
|
+
{ src: 'berlin', dst: 'rome' },
|
|
174
|
+
{ src: 'rome', dst: 'london' },
|
|
175
|
+
// Asian connections
|
|
176
|
+
{ src: 'tokyo', dst: 'seoul' },
|
|
177
|
+
{ src: 'seoul', dst: 'beijing' },
|
|
178
|
+
{ src: 'beijing', dst: 'tokyo' },
|
|
179
|
+
// Australian connections
|
|
180
|
+
{ src: 'sydney', dst: 'melbourne' }
|
|
181
|
+
]);
|
|
182
|
+
|
|
183
|
+
const graph = new GraphFrame(vertices, edges);
|
|
184
|
+
|
|
185
|
+
console.log('Running Pregel Connected Components...\n');
|
|
186
|
+
|
|
187
|
+
const result = graph.connectedComponents();
|
|
188
|
+
const components = JSON.parse(result);
|
|
189
|
+
|
|
190
|
+
// Group vertices by component
|
|
191
|
+
const componentGroups: Record<string, string[]> = {};
|
|
192
|
+
for (const [vertex, compId] of Object.entries(components)) {
|
|
193
|
+
const key = String(compId);
|
|
194
|
+
if (!componentGroups[key]) {
|
|
195
|
+
componentGroups[key] = [];
|
|
196
|
+
}
|
|
197
|
+
componentGroups[key].push(vertex);
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
console.log('Connected Components Found:');
|
|
201
|
+
let compNum = 1;
|
|
202
|
+
for (const [, members] of Object.entries(componentGroups)) {
|
|
203
|
+
console.log(` Component ${compNum}: ${members.join(' <-> ')}`);
|
|
204
|
+
compNum++;
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
console.log(`\nTotal: ${Object.keys(componentGroups).length} components`);
|
|
208
|
+
console.log();
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
// =============================================================================
|
|
212
|
+
// Example 4: Pregel Label Propagation for Community Detection
|
|
213
|
+
// =============================================================================
|
|
214
|
+
|
|
215
|
+
async function labelPropagationPregelExample() {
|
|
216
|
+
console.log('=== Pregel Label Propagation ===\n');
|
|
217
|
+
|
|
218
|
+
// Create a social network with community structure
|
|
219
|
+
const vertices = JSON.stringify([
|
|
220
|
+
// Tech community
|
|
221
|
+
{ id: 'alice', interests: ['AI', 'ML'] },
|
|
222
|
+
{ id: 'bob', interests: ['AI', 'Data'] },
|
|
223
|
+
{ id: 'carol', interests: ['ML', 'Data'] },
|
|
224
|
+
// Sports community
|
|
225
|
+
{ id: 'dave', interests: ['Football', 'Basketball'] },
|
|
226
|
+
{ id: 'eve', interests: ['Football', 'Tennis'] },
|
|
227
|
+
{ id: 'frank', interests: ['Basketball', 'Tennis'] },
|
|
228
|
+
// Bridge person
|
|
229
|
+
{ id: 'grace', interests: ['AI', 'Football'] }
|
|
230
|
+
]);
|
|
231
|
+
|
|
232
|
+
const edges = JSON.stringify([
|
|
233
|
+
// Dense tech community connections
|
|
234
|
+
{ src: 'alice', dst: 'bob' },
|
|
235
|
+
{ src: 'alice', dst: 'carol' },
|
|
236
|
+
{ src: 'bob', dst: 'carol' },
|
|
237
|
+
// Dense sports community connections
|
|
238
|
+
{ src: 'dave', dst: 'eve' },
|
|
239
|
+
{ src: 'dave', dst: 'frank' },
|
|
240
|
+
{ src: 'eve', dst: 'frank' },
|
|
241
|
+
// Bridge connections
|
|
242
|
+
{ src: 'alice', dst: 'grace' },
|
|
243
|
+
{ src: 'grace', dst: 'dave' }
|
|
244
|
+
]);
|
|
245
|
+
|
|
246
|
+
const graph = new GraphFrame(vertices, edges);
|
|
247
|
+
|
|
248
|
+
console.log('Running Pregel Label Propagation...\n');
|
|
249
|
+
const maxIterations = 10;
|
|
250
|
+
|
|
251
|
+
const result = graph.labelPropagation(maxIterations);
|
|
252
|
+
const labels = JSON.parse(result);
|
|
253
|
+
|
|
254
|
+
// Group by detected community
|
|
255
|
+
const communities: Record<string, string[]> = {};
|
|
256
|
+
for (const [person, label] of Object.entries(labels)) {
|
|
257
|
+
const key = String(label);
|
|
258
|
+
if (!communities[key]) {
|
|
259
|
+
communities[key] = [];
|
|
260
|
+
}
|
|
261
|
+
communities[key].push(person);
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
console.log('Detected Communities:');
|
|
265
|
+
let commNum = 1;
|
|
266
|
+
for (const [, members] of Object.entries(communities)) {
|
|
267
|
+
console.log(` Community ${commNum}: ${members.join(', ')}`);
|
|
268
|
+
commNum++;
|
|
269
|
+
}
|
|
270
|
+
console.log();
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
// =============================================================================
|
|
274
|
+
// Example 5: Understanding Superstep Execution
|
|
275
|
+
// =============================================================================
|
|
276
|
+
|
|
277
|
+
async function superstepExample() {
|
|
278
|
+
console.log('=== Understanding Pregel Supersteps ===\n');
|
|
279
|
+
|
|
280
|
+
console.log('Pregel Programming Model:');
|
|
281
|
+
console.log(' 1. Think like a vertex - each vertex executes the same program');
|
|
282
|
+
console.log(' 2. Computation proceeds in synchronized supersteps');
|
|
283
|
+
console.log(' 3. In each superstep, each active vertex:');
|
|
284
|
+
console.log(' a) Receives messages from previous superstep');
|
|
285
|
+
console.log(' b) Updates its state based on messages');
|
|
286
|
+
console.log(' c) Sends messages to neighbors');
|
|
287
|
+
console.log(' d) May vote to halt (become inactive)');
|
|
288
|
+
console.log(' 4. Computation ends when all vertices halt AND no messages in transit\n');
|
|
289
|
+
|
|
290
|
+
// Demonstrate with a simple chain graph
|
|
291
|
+
const vertices = JSON.stringify([
|
|
292
|
+
{ id: 'v0' }, { id: 'v1' }, { id: 'v2' }, { id: 'v3' }, { id: 'v4' }
|
|
293
|
+
]);
|
|
294
|
+
|
|
295
|
+
const edges = JSON.stringify([
|
|
296
|
+
{ src: 'v0', dst: 'v1' },
|
|
297
|
+
{ src: 'v1', dst: 'v2' },
|
|
298
|
+
{ src: 'v2', dst: 'v3' },
|
|
299
|
+
{ src: 'v3', dst: 'v4' }
|
|
300
|
+
]);
|
|
301
|
+
|
|
302
|
+
const graph = new GraphFrame(vertices, edges);
|
|
303
|
+
|
|
304
|
+
console.log('Chain Graph: v0 -> v1 -> v2 -> v3 -> v4');
|
|
305
|
+
console.log('Running shortest paths from v0:\n');
|
|
306
|
+
|
|
307
|
+
const result = graph.pregelShortestPaths('v0', 10);
|
|
308
|
+
const data = JSON.parse(result);
|
|
309
|
+
|
|
310
|
+
console.log(`Completed in ${data.supersteps} supersteps`);
|
|
311
|
+
console.log('(Each superstep propagates distance one hop further)\n');
|
|
312
|
+
|
|
313
|
+
console.log('Superstep trace:');
|
|
314
|
+
console.log(' Superstep 0: v0 receives initial message, distance=0');
|
|
315
|
+
console.log(' Superstep 1: v1 receives message from v0, distance=1');
|
|
316
|
+
console.log(' Superstep 2: v2 receives message from v1, distance=2');
|
|
317
|
+
console.log(' Superstep 3: v3 receives message from v2, distance=3');
|
|
318
|
+
console.log(' Superstep 4: v4 receives message from v3, distance=4');
|
|
319
|
+
console.log(' Superstep 5: All vertices halt, no messages in transit');
|
|
320
|
+
console.log();
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
// =============================================================================
|
|
324
|
+
// Example 6: Pregel vs Standard Algorithms Comparison
|
|
325
|
+
// =============================================================================
|
|
326
|
+
|
|
327
|
+
async function comparisonExample() {
|
|
328
|
+
console.log('=== Pregel vs Standard Algorithm Comparison ===\n');
|
|
329
|
+
|
|
330
|
+
// Create test graph
|
|
331
|
+
const vertices = JSON.stringify([
|
|
332
|
+
{ id: 'a' }, { id: 'b' }, { id: 'c' }, { id: 'd' }, { id: 'e' }
|
|
333
|
+
]);
|
|
334
|
+
|
|
335
|
+
const edges = JSON.stringify([
|
|
336
|
+
{ src: 'a', dst: 'b' },
|
|
337
|
+
{ src: 'b', dst: 'c' },
|
|
338
|
+
{ src: 'c', dst: 'd' },
|
|
339
|
+
{ src: 'd', dst: 'e' },
|
|
340
|
+
{ src: 'a', dst: 'c' },
|
|
341
|
+
{ src: 'c', dst: 'e' }
|
|
342
|
+
]);
|
|
343
|
+
|
|
344
|
+
const graph = new GraphFrame(vertices, edges);
|
|
345
|
+
|
|
346
|
+
console.log('Graph: a -> b -> c -> d -> e (with shortcuts a->c, c->e)\n');
|
|
347
|
+
|
|
348
|
+
// Shortest paths using standard BFS
|
|
349
|
+
console.log('Shortest Paths (standard BFS):');
|
|
350
|
+
const standardPaths = graph.shortestPaths(['a']);
|
|
351
|
+
const standardResult = JSON.parse(standardPaths);
|
|
352
|
+
for (const [vertex, dists] of Object.entries(standardResult)) {
|
|
353
|
+
const d = (dists as any)['a'];
|
|
354
|
+
console.log(` ${vertex}: distance from a = ${d}`);
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
console.log();
|
|
358
|
+
|
|
359
|
+
// Shortest paths using Pregel
|
|
360
|
+
console.log('Shortest Paths (Pregel BSP):');
|
|
361
|
+
const pregelPaths = graph.pregelShortestPaths('a', 10);
|
|
362
|
+
const pregelResult = JSON.parse(pregelPaths);
|
|
363
|
+
for (const [vertex, data] of Object.entries(pregelResult.values)) {
|
|
364
|
+
const d = (data as any).values?.distance ?? Infinity;
|
|
365
|
+
console.log(` ${vertex}: distance from a = ${d}`);
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
console.log('\nBoth methods produce identical results!');
|
|
369
|
+
console.log('Pregel advantage: Scales to distributed systems automatically.');
|
|
370
|
+
console.log();
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
// =============================================================================
|
|
374
|
+
// Run All Examples
|
|
375
|
+
// =============================================================================
|
|
376
|
+
|
|
377
|
+
async function main() {
|
|
378
|
+
console.log('========================================');
|
|
379
|
+
console.log(' Pregel BSP Processing Examples');
|
|
380
|
+
console.log('========================================\n');
|
|
381
|
+
|
|
382
|
+
try {
|
|
383
|
+
await shortestPathsPregelExample();
|
|
384
|
+
await customPregelPageRankExample();
|
|
385
|
+
await connectedComponentsPregelExample();
|
|
386
|
+
await labelPropagationPregelExample();
|
|
387
|
+
await superstepExample();
|
|
388
|
+
await comparisonExample();
|
|
389
|
+
|
|
390
|
+
console.log('========================================');
|
|
391
|
+
console.log(' All examples completed successfully!');
|
|
392
|
+
console.log('========================================');
|
|
393
|
+
} catch (error) {
|
|
394
|
+
console.error('Error running examples:', error);
|
|
395
|
+
process.exit(1);
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
main();
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "rust-kgdb",
|
|
3
|
-
"version": "0.4.
|
|
4
|
-
"description": "Production-grade Neuro-Symbolic AI Framework: +86.4% accuracy improvement over vanilla LLMs
|
|
3
|
+
"version": "0.4.2",
|
|
4
|
+
"description": "Production-grade Neuro-Symbolic AI Framework: +86.4% accuracy improvement over vanilla LLMs. High-performance knowledge graph (2.78µs lookups, 35x faster than RDFox). Features fraud detection, underwriting agents, WASM sandbox, type/category/proof theory, and W3C SPARQL 1.1 compliance.",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"types": "index.d.ts",
|
|
7
7
|
"napi": {
|
|
@@ -67,6 +67,7 @@
|
|
|
67
67
|
"hypermind-agent.js",
|
|
68
68
|
"secure-agent-sandbox-demo.js",
|
|
69
69
|
"vanilla-vs-hypermind-benchmark.js",
|
|
70
|
+
"examples/",
|
|
70
71
|
"README.md",
|
|
71
72
|
"HYPERMIND_BENCHMARK_REPORT.md",
|
|
72
73
|
"CHANGELOG.md",
|