rust-kgdb 0.6.63 → 0.6.66
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.archive.md.old +1206 -0
- package/README.md +744 -847
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,331 +1,125 @@
|
|
|
1
1
|
# rust-kgdb
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
[](https://opensource.org/licenses/Apache-2.0)
|
|
5
|
-
[](https://www.w3.org/TR/sparql11-query/)
|
|
6
|
-
|
|
7
|
-
---
|
|
3
|
+
High-performance RDF/SPARQL database with AI agent framework.
|
|
8
4
|
|
|
9
5
|
## The Problem With AI Today
|
|
10
6
|
|
|
11
7
|
Enterprise AI projects keep failing. Not because the technology is bad, but because organizations use it wrong.
|
|
12
8
|
|
|
13
|
-
A claims investigator asks ChatGPT:
|
|
9
|
+
A claims investigator asks ChatGPT: "Has Provider #4521 shown suspicious billing patterns?"
|
|
14
10
|
|
|
15
|
-
The AI responds confidently:
|
|
11
|
+
The AI responds confidently: "Yes, Provider #4521 has a history of duplicate billing and upcoding."
|
|
16
12
|
|
|
17
|
-
The investigator opens a case. Weeks later, legal discovers
|
|
13
|
+
The investigator opens a case. Weeks later, legal discovers Provider #4521 has a perfect record. The AI made it up. Lawsuit incoming.
|
|
18
14
|
|
|
19
15
|
This keeps happening:
|
|
20
16
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
**A fraud analyst** flags Account #7842 for money laundering. It belongs to a children's charity.
|
|
17
|
+
- A lawyer cites "Smith v. Johnson (2019)" in court. The judge is confused. That case does not exist.
|
|
18
|
+
- A doctor avoids prescribing "Nexapril" due to cardiac interactions. Nexapril is not a real drug.
|
|
19
|
+
- A fraud analyst flags Account #7842 for money laundering. It belongs to a children's charity.
|
|
26
20
|
|
|
27
21
|
Every time, the same pattern: The AI sounds confident. The AI is wrong. People get hurt.
|
|
28
22
|
|
|
29
|
-
---
|
|
30
|
-
|
|
31
|
-
## The Engineering Problem
|
|
32
|
-
|
|
33
|
-
**The root cause is simple:** LLMs are language models, not databases. They predict plausible text. They don't look up facts.
|
|
34
|
-
|
|
35
|
-
When you ask "Has Provider #4521 shown suspicious patterns?", the LLM doesn't query your claims database. It generates text that *sounds like* an answer based on patterns from its training data.
|
|
36
|
-
|
|
37
|
-
**The industry's response?** Add guardrails. Use RAG. Fine-tune models.
|
|
38
|
-
|
|
39
|
-
These help, but they're patches. RAG retrieves *similar* documents - similar isn't the same as *correct*. Fine-tuning teaches patterns, not facts. Guardrails catch obvious errors, but "Provider #4521 has billing anomalies" sounds perfectly plausible.
|
|
40
|
-
|
|
41
|
-
**A real solution requires a different architecture.** One built on solid engineering principles, not hope.
|
|
42
|
-
|
|
43
|
-
---
|
|
44
|
-
|
|
45
23
|
## The Solution
|
|
46
24
|
|
|
47
|
-
What if AI stopped providing
|
|
25
|
+
What if AI stopped providing answers and started generating queries?
|
|
48
26
|
|
|
49
|
-
|
|
50
|
-
-
|
|
51
|
-
-
|
|
52
|
-
- **You need both** working together
|
|
27
|
+
- Your database knows the facts (claims, providers, transactions)
|
|
28
|
+
- AI understands language (can parse "find suspicious patterns")
|
|
29
|
+
- You need both working together
|
|
53
30
|
|
|
54
31
|
The AI translates intent into queries. The database finds facts. The AI never makes up data.
|
|
55
32
|
|
|
56
|
-
|
|
57
|
-
Before (Dangerous):
|
|
58
|
-
Human: "Is Provider #4521 suspicious?"
|
|
59
|
-
AI: "Yes, they have billing anomalies" <- FABRICATED
|
|
60
|
-
|
|
61
|
-
After (Safe):
|
|
62
|
-
Human: "Is Provider #4521 suspicious?"
|
|
63
|
-
AI: Generates SPARQL query -> Executes against YOUR database
|
|
64
|
-
Database: Returns actual facts about Provider #4521
|
|
65
|
-
Result: Real data with audit trail <- VERIFIABLE
|
|
66
|
-
```
|
|
67
|
-
|
|
68
|
-
rust-kgdb is a knowledge graph database with an AI layer that **cannot hallucinate** because it only returns data from your actual systems.
|
|
69
|
-
|
|
70
|
-
---
|
|
33
|
+
rust-kgdb is a knowledge graph database with an AI layer that cannot hallucinate because it only returns data from your actual systems.
|
|
71
34
|
|
|
72
35
|
## The Business Value
|
|
73
36
|
|
|
74
|
-
|
|
75
|
-
-
|
|
76
|
-
-
|
|
77
|
-
-
|
|
78
|
-
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
-
|
|
82
|
-
-
|
|
83
|
-
-
|
|
84
|
-
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
-
|
|
88
|
-
-
|
|
89
|
-
-
|
|
90
|
-
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
37
|
+
For Enterprises:
|
|
38
|
+
- Zero hallucinations - Every answer traces back to your actual data
|
|
39
|
+
- Full audit trail - Regulators can verify every AI decision (SOX, GDPR, FDA 21 CFR Part 11)
|
|
40
|
+
- No infrastructure - Runs embedded in your app, no servers to manage
|
|
41
|
+
- Idempotent responses - Same question always returns same answer (semantic hashing)
|
|
42
|
+
|
|
43
|
+
For Engineering Teams:
|
|
44
|
+
- 449ns lookups - 35x faster than RDFox
|
|
45
|
+
- 24 bytes per triple - 25% more memory efficient than competitors
|
|
46
|
+
- 132K writes/sec - Handle enterprise transaction volumes
|
|
47
|
+
- Long-term memory - Agent remembers past conversations (94% recall at 10K depth)
|
|
48
|
+
|
|
49
|
+
For AI/ML Teams:
|
|
50
|
+
- 86.4% SPARQL accuracy - vs 0% with vanilla LLMs on LUBM benchmark
|
|
51
|
+
- 16ms similarity search - Find related entities across 10K vectors
|
|
52
|
+
- Schema-aware generation - AI uses YOUR ontology, not guessed class names
|
|
53
|
+
- Conversation knowledge extraction - Auto-extract entities and relationships from chat
|
|
54
|
+
|
|
55
|
+
For Knowledge Management:
|
|
56
|
+
- Memory Hypergraph - Episodes link to KG entities via hyper-edges
|
|
57
|
+
- Temporal decay - Recent memories weighted higher than old ones
|
|
58
|
+
- Semantic deduplication - "What about Provider X?" and "Tell me about Provider X" return cached result
|
|
59
|
+
- Single query traversal - SPARQL walks both memory AND knowledge graph in one query
|
|
95
60
|
|
|
96
61
|
## What Is rust-kgdb?
|
|
97
62
|
|
|
98
|
-
|
|
63
|
+
Two components, one npm package:
|
|
99
64
|
|
|
100
65
|
### rust-kgdb Core: Embedded Knowledge Graph Database
|
|
101
66
|
|
|
102
|
-
A high-performance RDF/SPARQL database that runs
|
|
67
|
+
A high-performance RDF/SPARQL database that runs inside your application. No server. No Docker. No config.
|
|
103
68
|
|
|
104
69
|
```
|
|
105
70
|
+-----------------------------------------------------------------------------+
|
|
106
|
-
| rust-kgdb CORE ENGINE
|
|
107
|
-
|
|
|
108
|
-
|
|
|
109
|
-
| |
|
|
110
|
-
| |
|
|
111
|
-
| | 449ns
|
|
112
|
-
|
|
|
113
|
-
|
|
|
71
|
+
| rust-kgdb CORE ENGINE |
|
|
72
|
+
| |
|
|
73
|
+
| +-----------+ +-----------+ +-----------+ +-----------+ |
|
|
74
|
+
| | GraphDB | |GraphFrame | |Embeddings | | Datalog | |
|
|
75
|
+
| | (SPARQL) | |(Analytics)| | (HNSW) | |(Reasoning)| |
|
|
76
|
+
| | 449ns | | PageRank | | 16ms/10K | |Semi-naive | |
|
|
77
|
+
| +-----------+ +-----------+ +-----------+ +-----------+ |
|
|
78
|
+
| |
|
|
114
79
|
| Storage: InMemory | RocksDB | LMDB Standards: SPARQL 1.1 | RDF 1.2 |
|
|
115
|
-
| Memory: 24 bytes/triple Compliance: SHACL | PROV | OWL 2 RL |
|
|
116
80
|
+-----------------------------------------------------------------------------+
|
|
117
81
|
```
|
|
118
82
|
|
|
119
|
-
|
|
83
|
+
| Metric | rust-kgdb | RDFox | Apache Jena |
|
|
84
|
+
|--------|-----------|-------|-------------|
|
|
85
|
+
| Lookup | 449 ns | 5,000+ ns | 10,000+ ns |
|
|
86
|
+
| Memory/Triple | 24 bytes | 32 bytes | 50-60 bytes |
|
|
87
|
+
| Bulk Insert | 146K/sec | 200K/sec | 50K/sec |
|
|
120
88
|
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
| **Bulk Insert** | 146K/sec | 200K/sec | 50K/sec | Load million-record datasets fast |
|
|
126
|
-
| **Concurrent Writes** | 132K ops/sec | - | - | Handle enterprise transaction volumes |
|
|
89
|
+
Sources:
|
|
90
|
+
- rust-kgdb: Criterion benchmarks on LUBM(1) dataset, Apple Silicon
|
|
91
|
+
- RDFox: [Oxford Semantic Technologies benchmarks](https://www.oxfordsemantic.tech/product)
|
|
92
|
+
- Apache Jena: [Jena performance documentation](https://jena.apache.org/documentation/tdb/performance.html)
|
|
127
93
|
|
|
128
|
-
|
|
94
|
+
Like SQLite - but for knowledge graphs.
|
|
129
95
|
|
|
130
96
|
### HyperMind: Neuro-Symbolic Agent Framework
|
|
131
97
|
|
|
132
|
-
An AI agent layer that uses
|
|
98
|
+
An AI agent layer that uses the database to prevent hallucinations. The LLM plans, the database executes.
|
|
133
99
|
|
|
134
100
|
```
|
|
135
101
|
+-----------------------------------------------------------------------------+
|
|
136
|
-
| HYPERMIND AGENT FRAMEWORK
|
|
137
|
-
|
|
|
138
|
-
|
|
|
139
|
-
| |
|
|
140
|
-
| |
|
|
141
|
-
|
|
|
142
|
-
|
|
|
143
|
-
| Type Theory: Hindley-Milner types ensure tool composition is valid
|
|
144
|
-
| Category Theory: Tools are morphisms (A -> B) with composition laws
|
|
145
|
-
| Proof Theory: Every execution produces cryptographic audit trail
|
|
102
|
+
| HYPERMIND AGENT FRAMEWORK |
|
|
103
|
+
| |
|
|
104
|
+
| +-----------+ +-----------+ +-----------+ +-----------+ |
|
|
105
|
+
| |LLMPlanner | |WasmSandbox| | ProofDAG | | Memory | |
|
|
106
|
+
| |(Claude/GPT| | (Security)| | (Audit) | |(Hypergraph| |
|
|
107
|
+
| +-----------+ +-----------+ +-----------+ +-----------+ |
|
|
108
|
+
| |
|
|
109
|
+
| Type Theory: Hindley-Milner types ensure tool composition is valid |
|
|
110
|
+
| Category Theory: Tools are morphisms (A -> B) with composition laws |
|
|
111
|
+
| Proof Theory: Every execution produces cryptographic audit trail |
|
|
146
112
|
+-----------------------------------------------------------------------------+
|
|
147
113
|
```
|
|
148
114
|
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
|
152
|
-
|
|
153
|
-
|
|
|
154
|
-
|
|
|
155
|
-
| **DSPy** | 14.3% | 71.4% | Better prompting helps slightly |
|
|
156
|
-
| **HyperMind** | - | 71.4% | Schema integrated by design |
|
|
157
|
-
|
|
158
|
-
*Honest numbers: All frameworks achieve similar accuracy WITH schema. The difference is HyperMind integrates schema handling - you don't manually inject it.*
|
|
159
|
-
|
|
160
|
-
**Memory Retrieval (Agent Recall Benchmark):**
|
|
161
|
-
|
|
162
|
-
| Metric | HyperMind | Typical RAG | Why It Matters |
|
|
163
|
-
|--------|-----------|-------------|----------------|
|
|
164
|
-
| **Recall@10** | 94% at 10K depth | ~70% | Find the right past query |
|
|
165
|
-
| **Search Speed** | 16.7ms / 10K queries | 500ms+ | 30x faster context retrieval |
|
|
166
|
-
| **Idempotent Responses** | Yes (semantic hash) | No | Same question = same answer |
|
|
167
|
-
|
|
168
|
-
**Long-Term Memory: Deep Flashback**
|
|
169
|
-
|
|
170
|
-
Most AI agents forget everything between sessions. HyperMind stores memory in the *same* knowledge graph as your data:
|
|
171
|
-
|
|
172
|
-
- **Episodes** link to **KG entities** via hyper-edges
|
|
173
|
-
- **Embeddings** enable semantic search over past queries
|
|
174
|
-
- **Temporal decay** prioritizes recent, relevant memories
|
|
175
|
-
- **Single SPARQL query** traverses both memory AND knowledge graph
|
|
176
|
-
|
|
177
|
-
When your fraud analyst asks "What did we find about Provider X last month?", the agent doesn't say "I don't remember." It retrieves the exact investigation with full context - 94% recall at 10,000 queries deep.
|
|
178
|
-
|
|
179
|
-
**The insight:** AI writes questions (SPARQL queries). Database finds answers. No hallucination possible.
|
|
180
|
-
|
|
181
|
-
---
|
|
182
|
-
|
|
183
|
-
## The Engineering Choices
|
|
184
|
-
|
|
185
|
-
Every decision in this codebase has a reason:
|
|
186
|
-
|
|
187
|
-
**Why embedded, not client-server?**
|
|
188
|
-
Because data shouldn't leave your infrastructure. An embedded database means your patient records, claims data, and transaction histories never cross a network boundary. HIPAA compliance by architecture, not policy.
|
|
189
|
-
|
|
190
|
-
**Why SPARQL, not SQL?**
|
|
191
|
-
Because relationships matter. "Find all providers connected to this claimant through any intermediary" is one line in SPARQL. It's a nightmare in SQL with recursive CTEs. Knowledge graphs are built for connection queries.
|
|
192
|
-
|
|
193
|
-
**Why category theory for tools?**
|
|
194
|
-
Because composition must be safe. When Tool A outputs a `BindingSet` and Tool B expects a `Pattern`, the type system catches it at build time. No runtime surprises. No "undefined is not a function."
|
|
195
|
-
|
|
196
|
-
**Why WASM sandbox for agents?**
|
|
197
|
-
Because AI shouldn't have unlimited power. The sandbox enforces capability-based security. An agent can read the knowledge graph but can't delete data. It can execute 1M operations but not infinite loop. Defense in depth.
|
|
198
|
-
|
|
199
|
-
**Why Datalog for reasoning?**
|
|
200
|
-
Because rules should cascade. A fraud pattern that triggers another rule that triggers another - Datalog handles recursive inference naturally. Semi-naive evaluation ensures we don't recompute what we already know.
|
|
201
|
-
|
|
202
|
-
**Why HNSW for embeddings?**
|
|
203
|
-
Because O(log n) beats O(n). Finding similar claims from 100K vectors shouldn't scan all 100K. HNSW builds a navigable graph - ~20 hops to find your answer regardless of dataset size.
|
|
204
|
-
|
|
205
|
-
**Why clustered mode for scale?**
|
|
206
|
-
Because some problems don't fit on one machine. The same codebase that runs embedded on your laptop scales to Kubernetes clusters for billion-triple graphs. HDRF (High-Degree Replicated First) partitioning keeps high-connectivity nodes available across partitions. Raft consensus ensures consistency. gRPC handles inter-node communication. You write the same code - deployment decides the scale.
|
|
207
|
-
|
|
208
|
-
These aren't arbitrary choices. Each one solves a real problem I encountered building enterprise AI systems.
|
|
209
|
-
|
|
210
|
-
---
|
|
211
|
-
|
|
212
|
-
## Why Our Tool Calling Is Different
|
|
213
|
-
|
|
214
|
-
Traditional AI tool calling (OpenAI Functions, LangChain Tools) has fundamental problems:
|
|
215
|
-
|
|
216
|
-
**The Traditional Approach:**
|
|
217
|
-
```
|
|
218
|
-
LLM generates JSON -> Runtime validates schema -> Tool executes -> Hope it works
|
|
219
|
-
```
|
|
220
|
-
|
|
221
|
-
1. **Schema is decorative.** The LLM sees a JSON schema and tries to match it. No guarantee outputs are correct types.
|
|
222
|
-
2. **Composition is ad-hoc.** Chain Tool A -> Tool B? Pray that A's output format happens to match B's input.
|
|
223
|
-
3. **Errors happen at runtime.** You find out a tool chain is broken when a user hits it in production.
|
|
224
|
-
4. **No mathematical guarantees.** "It usually works" is the best you get.
|
|
225
|
-
|
|
226
|
-
**Our Approach: Tools as Typed Morphisms**
|
|
227
|
-
```
|
|
228
|
-
Tools are arrows in a category:
|
|
229
|
-
kg.sparql.query: Query -> BindingSet
|
|
230
|
-
kg.motif.find: Pattern -> Matches
|
|
231
|
-
kg.embeddings.search: EntityId -> SimilarEntities
|
|
232
|
-
|
|
233
|
-
Composition is verified:
|
|
234
|
-
f: A -> B
|
|
235
|
-
g: B -> C
|
|
236
|
-
g o f: A -> C [x] Compiles only if types match
|
|
237
|
-
|
|
238
|
-
Errors caught at plan time, not runtime.
|
|
239
|
-
```
|
|
240
|
-
|
|
241
|
-
**What this means in practice:**
|
|
242
|
-
|
|
243
|
-
| Problem | Traditional | HyperMind |
|
|
244
|
-
|---------|-------------|-----------|
|
|
245
|
-
| **Type mismatch** | Runtime error | Won't compile |
|
|
246
|
-
| **Tool chaining** | Hope it works | Type-checked composition |
|
|
247
|
-
| **Output validation** | Schema validation (partial) | Refinement types (complete) |
|
|
248
|
-
| **Audit trail** | Optional logging | Built-in proof witnesses |
|
|
249
|
-
|
|
250
|
-
**Refinement Types: Beyond Basic Types**
|
|
251
|
-
|
|
252
|
-
We don't just have `string` and `number`. We have:
|
|
253
|
-
- `RiskScore` (number between 0 and 1)
|
|
254
|
-
- `PolicyNumber` (matches regex `^POL-\d{8}$`)
|
|
255
|
-
- `CreditScore` (integer between 300 and 850)
|
|
256
|
-
|
|
257
|
-
The type system *guarantees* a tool that outputs `RiskScore` produces a valid risk score. Not "probably" - mathematically proven.
|
|
258
|
-
|
|
259
|
-
**The Insight:** Category theory isn't academic overhead. It's the same math that makes your database transactions safe (ACID = category theory applied to data). We apply it to tool composition.
|
|
260
|
-
|
|
261
|
-
**Trust Model: Proxied Execution**
|
|
262
|
-
|
|
263
|
-
Traditional tool calling trusts the LLM output completely:
|
|
264
|
-
```
|
|
265
|
-
LLM -> Tool (direct execution) -> Result
|
|
266
|
-
```
|
|
267
|
-
|
|
268
|
-
The LLM decides what to execute. The tool runs it blindly. This is why prompt injection attacks work - the LLM's output *is* the program.
|
|
269
|
-
|
|
270
|
-
**Our approach: Agent -> Proxy -> Sandbox -> Tool**
|
|
271
|
-
```
|
|
272
|
-
+---------------------------------------------------------------------+
|
|
273
|
-
| Agent Request: "Find suspicious claims" |
|
|
274
|
-
+----------------------------+----------------------------------------+
|
|
275
|
-
|
|
|
276
|
-
v
|
|
277
|
-
+---------------------------------------------------------------------+
|
|
278
|
-
| LLMPlanner: Generates tool call plan |
|
|
279
|
-
| -> kg.sparql.query(pattern) |
|
|
280
|
-
| -> kg.datalog.infer(rules) |
|
|
281
|
-
+----------------------------+----------------------------------------+
|
|
282
|
-
| Plan (NOT executed yet)
|
|
283
|
-
v
|
|
284
|
-
+---------------------------------------------------------------------+
|
|
285
|
-
| HyperAgentProxy: Validates plan against capabilities |
|
|
286
|
-
| [x] Does agent have ReadKG capability? Yes |
|
|
287
|
-
| [x] Is query schema-valid? Yes |
|
|
288
|
-
| [x] Are all types correct? Yes |
|
|
289
|
-
| [ ] Blocked: WriteKG not in capability set |
|
|
290
|
-
+----------------------------+----------------------------------------+
|
|
291
|
-
| Validated plan only
|
|
292
|
-
v
|
|
293
|
-
+---------------------------------------------------------------------+
|
|
294
|
-
| WasmSandbox: Executes with resource limits |
|
|
295
|
-
| * Fuel metering: 1M operations max |
|
|
296
|
-
| * Memory cap: 64MB |
|
|
297
|
-
| * Capability enforcement: Cannot exceed granted permissions |
|
|
298
|
-
+----------------------------+----------------------------------------+
|
|
299
|
-
| Execution with audit
|
|
300
|
-
v
|
|
301
|
-
+---------------------------------------------------------------------+
|
|
302
|
-
| ProofDAG: Records execution witness |
|
|
303
|
-
| * What tool ran |
|
|
304
|
-
| * What inputs were used |
|
|
305
|
-
| * What outputs were produced |
|
|
306
|
-
| * SHA-256 hash of entire execution |
|
|
307
|
-
+---------------------------------------------------------------------+
|
|
308
|
-
```
|
|
309
|
-
|
|
310
|
-
The LLM never executes directly. It proposes. The proxy validates. The sandbox enforces. The proof records. Four independent layers of defense.
|
|
311
|
-
|
|
312
|
-
---
|
|
313
|
-
|
|
314
|
-
## What You Can Do
|
|
315
|
-
|
|
316
|
-
| Query Type | Use Case | Example |
|
|
317
|
-
|------------|----------|---------|
|
|
318
|
-
| **SPARQL** | Find connected entities | `SELECT ?claim WHERE { ?claim :provider :PROV001 }` |
|
|
319
|
-
| **Datalog** | Recursive fraud detection | `fraud_ring(X,Y) :- knows(X,Y), claims_with(X,P), claims_with(Y,P)` |
|
|
320
|
-
| **Motif** | Network pattern matching | `(a)-[e1]->(b); (b)-[e2]->(a)` finds circular relationships |
|
|
321
|
-
| **GraphFrame** | Social network analysis | `gf.pageRank(0.15, 20)` ranks entities by connection importance |
|
|
322
|
-
| **Pregel** | Shortest paths at scale | `pregelShortestPaths(gf, 'source', 100)` for billion-edge graphs |
|
|
323
|
-
| **Embeddings** | Semantic similarity | `embeddings.findSimilar('CLM001', 10, 0.7)` finds related claims |
|
|
324
|
-
| **Agent** | Natural language interface | `agent.ask("Which providers show fraud patterns?")` |
|
|
325
|
-
|
|
326
|
-
Each of these runs in the same embedded database. No separate systems to maintain.
|
|
115
|
+
| Framework | Without Schema | With Schema |
|
|
116
|
+
|-----------|---------------|-------------|
|
|
117
|
+
| Vanilla LLM | 0% | - |
|
|
118
|
+
| LangChain | 0% | 71.4% |
|
|
119
|
+
| DSPy | 14.3% | 71.4% |
|
|
120
|
+
| HyperMind | - | 71.4% |
|
|
327
121
|
|
|
328
|
-
|
|
122
|
+
All frameworks achieve similar accuracy WITH schema. The difference is HyperMind integrates schema handling - you do not manually inject it.
|
|
329
123
|
|
|
330
124
|
## Quick Start
|
|
331
125
|
|
|
@@ -365,61 +159,33 @@ const { GraphDB, HyperMindAgent } = require('rust-kgdb');
|
|
|
365
159
|
|
|
366
160
|
const db = new GraphDB('http://insurance.org/');
|
|
367
161
|
db.loadTtl(`
|
|
368
|
-
|
|
369
|
-
|
|
162
|
+
<http://insurance.org/Provider_445> <http://insurance.org/totalClaims> "89" .
|
|
163
|
+
<http://insurance.org/Provider_445> <http://insurance.org/avgClaimAmount> "47000" .
|
|
164
|
+
<http://insurance.org/Provider_445> <http://insurance.org/denialRate> "0.34" .
|
|
165
|
+
<http://insurance.org/Provider_445> <http://insurance.org/hasPattern> <http://insurance.org/UnbundledBilling> .
|
|
166
|
+
<http://insurance.org/Provider_445> <http://insurance.org/flaggedBy> <http://insurance.org/SIU_2024_Q1> .
|
|
370
167
|
`);
|
|
371
168
|
|
|
372
|
-
|
|
373
|
-
const
|
|
169
|
+
// Create agent with knowledge graph binding
|
|
170
|
+
const agent = new HyperMindAgent({
|
|
171
|
+
kg: db, // REQUIRED: GraphDB instance
|
|
172
|
+
name: 'fraud-detector', // Optional: Agent name
|
|
173
|
+
apiKey: process.env.OPENAI_API_KEY // Optional: LLM API key
|
|
174
|
+
});
|
|
175
|
+
|
|
176
|
+
// Natural language query -> Grounded results
|
|
177
|
+
const result = await agent.call("Which providers show suspicious billing patterns?");
|
|
374
178
|
|
|
375
179
|
console.log(result.answer);
|
|
376
180
|
// "Provider_445: 34% denial rate, flagged by SIU Q1 2024, unbundled billing pattern"
|
|
377
181
|
|
|
378
|
-
console.log(result.
|
|
379
|
-
// Full
|
|
380
|
-
```
|
|
182
|
+
console.log(result.explanation);
|
|
183
|
+
// Full execution trace showing tool calls
|
|
381
184
|
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
## Architecture: Two Layers
|
|
385
|
-
|
|
386
|
-
```
|
|
387
|
-
+---------------------------------------------------------------------------------+
|
|
388
|
-
| YOUR APPLICATION |
|
|
389
|
-
| (Fraud Detection, Underwriting, Compliance) |
|
|
390
|
-
+------------------------------------+--------------------------------------------+
|
|
391
|
-
|
|
|
392
|
-
+------------------------------------v--------------------------------------------+
|
|
393
|
-
| HYPERMIND AGENT FRAMEWORK (JavaScript) |
|
|
394
|
-
| +----------------------------------------------------------------------------+ |
|
|
395
|
-
| | * LLMPlanner: Natural language -> typed tool pipelines | |
|
|
396
|
-
| | * WasmSandbox: Capability-based security with fuel metering | |
|
|
397
|
-
| | * ProofDAG: Cryptographic audit trail (SHA-256) | |
|
|
398
|
-
| | * MemoryHypergraph: Temporal agent memory with KG integration | |
|
|
399
|
-
| | * TypeId: Hindley-Milner type system with refinement types | |
|
|
400
|
-
| +----------------------------------------------------------------------------+ |
|
|
401
|
-
| |
|
|
402
|
-
| Category Theory: Tools as Morphisms (A -> B) |
|
|
403
|
-
| Proof Theory: Every execution has a witness |
|
|
404
|
-
+------------------------------------+--------------------------------------------+
|
|
405
|
-
| NAPI-RS Bindings
|
|
406
|
-
+------------------------------------v--------------------------------------------+
|
|
407
|
-
| RUST CORE ENGINE (Native Performance) |
|
|
408
|
-
| +----------------------------------------------------------------------------+ |
|
|
409
|
-
| | GraphDB | RDF/SPARQL quad store | 449ns lookups, 24 bytes/triple|
|
|
410
|
-
| | GraphFrame | Graph algorithms | WCOJ optimal joins, PageRank |
|
|
411
|
-
| | EmbeddingService | Vector similarity | HNSW index, 1-hop ARCADE cache|
|
|
412
|
-
| | DatalogProgram | Rule-based reasoning | Semi-naive evaluation |
|
|
413
|
-
| | Pregel | BSP graph processing | Billion-edge scale |
|
|
414
|
-
| +----------------------------------------------------------------------------+ |
|
|
415
|
-
| |
|
|
416
|
-
| W3C Standards: SPARQL 1.1 (100%) | RDF 1.2 | OWL 2 RL | SHACL | PROV |
|
|
417
|
-
| Storage Backends: InMemory | RocksDB | LMDB |
|
|
418
|
-
+----------------------------------------------------------------------------------+
|
|
185
|
+
console.log(result.proof);
|
|
186
|
+
// Cryptographic proof DAG with SHA-256 hashes
|
|
419
187
|
```
|
|
420
188
|
|
|
421
|
-
---
|
|
422
|
-
|
|
423
189
|
## Core Components
|
|
424
190
|
|
|
425
191
|
### GraphDB: SPARQL Engine (449ns lookups)
|
|
@@ -463,7 +229,7 @@ const gf = new GraphFrame(
|
|
|
463
229
|
// Algorithms
|
|
464
230
|
console.log('PageRank:', gf.pageRank(0.15, 20));
|
|
465
231
|
console.log('Connected Components:', gf.connectedComponents());
|
|
466
|
-
console.log('Triangles:', gf.triangleCount());
|
|
232
|
+
console.log('Triangles:', gf.triangleCount());
|
|
467
233
|
console.log('Shortest Paths:', gf.shortestPaths('alice'));
|
|
468
234
|
|
|
469
235
|
// Motif finding (pattern matching)
|
|
@@ -477,19 +243,57 @@ const { EmbeddingService } = require('rust-kgdb');
|
|
|
477
243
|
|
|
478
244
|
const embeddings = new EmbeddingService();
|
|
479
245
|
|
|
480
|
-
// Store 384-dimensional vectors
|
|
481
|
-
embeddings.storeVector('claim_001',
|
|
482
|
-
embeddings.storeVector('claim_002',
|
|
246
|
+
// Store 384-dimensional vectors
|
|
247
|
+
embeddings.storeVector('claim_001', vectorFromOpenAI);
|
|
248
|
+
embeddings.storeVector('claim_002', vectorFromOpenAI);
|
|
483
249
|
|
|
484
250
|
// Build HNSW index
|
|
485
251
|
embeddings.rebuildIndex();
|
|
486
252
|
|
|
487
253
|
// Find similar (16ms for 10K vectors)
|
|
488
254
|
const similar = embeddings.findSimilar('claim_001', 10, 0.7);
|
|
255
|
+
```
|
|
489
256
|
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
257
|
+
### Embedding Triggers: Auto-Generate on Insert
|
|
258
|
+
|
|
259
|
+
```javascript
|
|
260
|
+
const { GraphDB, EmbeddingService, TriggerManager } = require('rust-kgdb');
|
|
261
|
+
|
|
262
|
+
const db = new GraphDB('http://example.org/');
|
|
263
|
+
const embeddings = new EmbeddingService();
|
|
264
|
+
|
|
265
|
+
// Configure trigger to auto-generate embeddings on triple insert
|
|
266
|
+
const triggers = new TriggerManager({
|
|
267
|
+
db,
|
|
268
|
+
embeddings,
|
|
269
|
+
provider: 'openai', // or 'ollama', 'anthropic'
|
|
270
|
+
providerConfig: {
|
|
271
|
+
apiKey: process.env.OPENAI_API_KEY,
|
|
272
|
+
model: 'text-embedding-3-small'
|
|
273
|
+
}
|
|
274
|
+
});
|
|
275
|
+
|
|
276
|
+
// Register trigger: generate embedding when entity is inserted
|
|
277
|
+
triggers.register({
|
|
278
|
+
event: 'INSERT',
|
|
279
|
+
pattern: '?entity rdf:type ?class',
|
|
280
|
+
action: 'GENERATE_EMBEDDING',
|
|
281
|
+
config: {
|
|
282
|
+
fields: ['rdfs:label', 'rdfs:comment', 'schema:description'],
|
|
283
|
+
concatenate: true
|
|
284
|
+
}
|
|
285
|
+
});
|
|
286
|
+
|
|
287
|
+
// Now when you insert data, embeddings are auto-generated
|
|
288
|
+
db.loadTtl(`
|
|
289
|
+
:claim_001 a :Claim ;
|
|
290
|
+
rdfs:label "Suspicious orthopedic claim" ;
|
|
291
|
+
rdfs:comment "High-value claim from flagged provider" .
|
|
292
|
+
`);
|
|
293
|
+
// Trigger fires -> embedding generated for :claim_001
|
|
294
|
+
|
|
295
|
+
// Query by similarity (uses auto-generated embeddings)
|
|
296
|
+
const similar = embeddings.findSimilar('claim_001', 10, 0.7);
|
|
493
297
|
```
|
|
494
298
|
|
|
495
299
|
### DatalogProgram: Rule-Based Reasoning
|
|
@@ -517,239 +321,525 @@ const inferred = evaluateDatalog(datalog);
|
|
|
517
321
|
// connected(alice, charlie) - derived!
|
|
518
322
|
```
|
|
519
323
|
|
|
520
|
-
|
|
324
|
+
## Why Our Tool Calling Is Different
|
|
521
325
|
|
|
522
|
-
|
|
523
|
-
const { pregelShortestPaths, chainGraph } = require('rust-kgdb');
|
|
326
|
+
Traditional AI tool calling (OpenAI Functions, LangChain Tools) has problems:
|
|
524
327
|
|
|
525
|
-
|
|
526
|
-
|
|
328
|
+
1. Schema is decorative - The LLM sees a JSON schema and tries to match it. No guarantee outputs are correct types.
|
|
329
|
+
2. Composition is ad-hoc - Chain Tool A to Tool B? Pray that A's output format happens to match B's input.
|
|
330
|
+
3. Errors happen at runtime - You find out a tool chain is broken when a user hits it in production.
|
|
527
331
|
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
332
|
+
Our Approach: Tools as Typed Morphisms
|
|
333
|
+
|
|
334
|
+
Tools are arrows in a category with verified composition:
|
|
335
|
+
- kg.sparql.query: Query to BindingSet
|
|
336
|
+
- kg.motif.find: Pattern to Matches
|
|
337
|
+
- kg.embeddings.search: EntityId to SimilarEntities
|
|
531
338
|
|
|
532
|
-
|
|
339
|
+
The type system catches mismatches at plan time, not runtime.
|
|
533
340
|
|
|
534
|
-
|
|
341
|
+
| Problem | Traditional | HyperMind |
|
|
342
|
+
|---------|-------------|-----------|
|
|
343
|
+
| Type mismatch | Runtime error | Will not compile |
|
|
344
|
+
| Tool chaining | Hope it works | Type-checked composition |
|
|
345
|
+
| Output validation | Schema validation (partial) | Refinement types (complete) |
|
|
346
|
+
| Audit trail | Optional logging | Built-in proof witnesses |
|
|
347
|
+
|
|
348
|
+
## Trust Model: Proxied Execution
|
|
535
349
|
|
|
536
|
-
|
|
350
|
+
Traditional tool calling trusts the LLM output completely. The LLM decides what to execute. The tool runs it blindly.
|
|
351
|
+
|
|
352
|
+
Our approach: Agent to Proxy to Sandbox to Tool
|
|
537
353
|
|
|
538
354
|
```
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
|
546
|
-
|
|
|
547
|
-
|
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
355
|
+
+---------------------------------------------------------------------+
|
|
356
|
+
| Agent Request: "Find suspicious claims" |
|
|
357
|
+
+--------------------------------+------------------------------------+
|
|
358
|
+
|
|
|
359
|
+
v
|
|
360
|
+
+---------------------------------------------------------------------+
|
|
361
|
+
| LLMPlanner: Generates tool call plan |
|
|
362
|
+
| -> kg.sparql.query(pattern) |
|
|
363
|
+
| -> kg.datalog.infer(rules) |
|
|
364
|
+
+--------------------------------+------------------------------------+
|
|
365
|
+
| Plan (NOT executed yet)
|
|
366
|
+
v
|
|
367
|
+
+---------------------------------------------------------------------+
|
|
368
|
+
| HyperAgentProxy: Validates plan against capabilities |
|
|
369
|
+
| [x] Does agent have ReadKG capability? Yes |
|
|
370
|
+
| [x] Is query schema-valid? Yes |
|
|
371
|
+
| [ ] Blocked: WriteKG not in capability set |
|
|
372
|
+
+--------------------------------+------------------------------------+
|
|
373
|
+
| Validated plan only
|
|
374
|
+
v
|
|
375
|
+
+---------------------------------------------------------------------+
|
|
376
|
+
| WasmSandbox: Executes with resource limits |
|
|
377
|
+
| - Fuel metering: 1M operations max |
|
|
378
|
+
| - Memory cap: 64MB |
|
|
379
|
+
| - Capability enforcement |
|
|
380
|
+
+--------------------------------+------------------------------------+
|
|
381
|
+
| Execution with audit
|
|
382
|
+
v
|
|
383
|
+
+---------------------------------------------------------------------+
|
|
384
|
+
| ProofDAG: Records execution witness |
|
|
385
|
+
| - What tool ran |
|
|
386
|
+
| - What inputs/outputs |
|
|
387
|
+
| - SHA-256 hash of entire execution |
|
|
388
|
+
+---------------------------------------------------------------------+
|
|
551
389
|
```
|
|
552
390
|
|
|
553
|
-
|
|
391
|
+
The LLM never executes directly. It proposes. The proxy validates. The sandbox enforces. The proof records. Four independent layers of defense.
|
|
392
|
+
|
|
393
|
+
## Agent Memory: Deep Flashback
|
|
554
394
|
|
|
555
|
-
|
|
395
|
+
Most AI agents forget everything between sessions. HyperMind stores memory in the same knowledge graph as your data.
|
|
556
396
|
|
|
557
397
|
```
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
|
563
|
-
|
|
|
564
|
-
|
|
565
|
-
|
|
398
|
+
+-----------------------------------------------------------------------------+
|
|
399
|
+
| MEMORY HYPERGRAPH |
|
|
400
|
+
| |
|
|
401
|
+
| AGENT MEMORY LAYER |
|
|
402
|
+
| +-----------+ +-----------+ +-----------+ |
|
|
403
|
+
| |Episode:001| |Episode:002| |Episode:003| |
|
|
404
|
+
| |"Fraud ring| |"Denied | |"Follow-up | |
|
|
405
|
+
| | detected" | | claim" | | on P001" | |
|
|
406
|
+
| +-----+-----+ +-----+-----+ +-----+-----+ |
|
|
407
|
+
| | | | |
|
|
408
|
+
| +-----------------+-----------------+ |
|
|
409
|
+
| | HyperEdges connect to KG |
|
|
410
|
+
| v |
|
|
411
|
+
| KNOWLEDGE GRAPH LAYER |
|
|
412
|
+
| +-----------------------------------------------------------------+ |
|
|
413
|
+
| | Provider:P001 -----> Claim:C123 <----- Claimant:John | |
|
|
414
|
+
| | | | | | |
|
|
415
|
+
| | v v v | |
|
|
416
|
+
| | riskScore: 0.87 amount: 50000 address: "123 Main" | |
|
|
417
|
+
| +-----------------------------------------------------------------+ |
|
|
418
|
+
| |
|
|
419
|
+
| SAME QUAD STORE - Single SPARQL query traverses BOTH! |
|
|
420
|
+
+-----------------------------------------------------------------------------+
|
|
566
421
|
```
|
|
567
422
|
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
423
|
+
- Episodes link to KG entities via hyper-edges
|
|
424
|
+
- Embeddings enable semantic search over past queries
|
|
425
|
+
- Temporal decay prioritizes recent, relevant memories
|
|
426
|
+
- Single SPARQL query traverses both memory AND knowledge graph
|
|
427
|
+
|
|
428
|
+
Memory Retrieval Performance:
|
|
429
|
+
- 94% Recall at 10K depth
|
|
430
|
+
- 16.7ms search speed for 10K queries
|
|
431
|
+
- 132K ops/sec write throughput
|
|
572
432
|
|
|
573
|
-
|
|
433
|
+
### Conversation Knowledge Extraction
|
|
574
434
|
|
|
575
|
-
|
|
435
|
+
Every conversation automatically extracts entities and relationships into the knowledge graph:
|
|
576
436
|
|
|
577
437
|
```javascript
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
//
|
|
587
|
-
const
|
|
588
|
-
|
|
589
|
-
.withTool('kg.datalog.infer')
|
|
590
|
-
.withTool('kg.embeddings.search')
|
|
591
|
-
.withPlanner(new LLMPlanner('claude-sonnet-4', TOOL_REGISTRY))
|
|
592
|
-
.withSandbox({
|
|
593
|
-
capabilities: ['ReadKG', 'ExecuteTool'], // No WriteKG
|
|
594
|
-
fuelLimit: 1000000,
|
|
595
|
-
maxMemory: 64 * 1024 * 1024
|
|
596
|
-
})
|
|
597
|
-
.build();
|
|
598
|
-
|
|
599
|
-
// Execute with natural language
|
|
600
|
-
const result = await agent.call("Find circular payment patterns");
|
|
601
|
-
|
|
602
|
-
// Get cryptographic proof
|
|
603
|
-
console.log(result.witness.proof_hash); // sha256:a3f2b8c9...
|
|
438
|
+
// Agent conversation automatically extracts knowledge
|
|
439
|
+
const result = await agent.ask("Provider P001 submitted 5 claims last month totaling $47,000");
|
|
440
|
+
|
|
441
|
+
// Behind the scenes, HyperMind extracts and stores:
|
|
442
|
+
// :Conversation_001 :mentions :Provider_P001 .
|
|
443
|
+
// :Provider_P001 :claimCount "5" ; :claimTotal "47000" ; :period "last_month" .
|
|
444
|
+
// :Conversation_001 :timestamp "2024-12-17" ; :extractedFacts 3 .
|
|
445
|
+
|
|
446
|
+
// Later queries can use this extracted knowledge
|
|
447
|
+
const followUp = await agent.ask("What do we know about Provider P001?");
|
|
448
|
+
// Returns facts from BOTH original data AND extracted conversation knowledge
|
|
604
449
|
```
|
|
605
450
|
|
|
606
|
-
###
|
|
451
|
+
### Idempotent Responses (Same Question = Same Answer)
|
|
607
452
|
|
|
608
453
|
```javascript
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
//
|
|
616
|
-
//
|
|
617
|
-
|
|
618
|
-
//
|
|
619
|
-
//
|
|
454
|
+
// First call: Compute answer, store with semantic hash
|
|
455
|
+
const result1 = await agent.ask("Which providers have high denial rates?");
|
|
456
|
+
// Execution time: 450ms, stores result with hash
|
|
457
|
+
|
|
458
|
+
// Second call: Different wording, SAME semantic meaning
|
|
459
|
+
const result2 = await agent.ask("Show me providers with lots of denials");
|
|
460
|
+
// Execution time: 2ms (cache hit via semantic hash)
|
|
461
|
+
// Returns IDENTICAL result - no LLM call needed
|
|
462
|
+
|
|
463
|
+
// Why this matters:
|
|
464
|
+
// - Consistent answers across team members
|
|
465
|
+
// - No LLM cost for repeated questions
|
|
466
|
+
// - Audit trail shows same query = same result
|
|
620
467
|
```
|
|
621
468
|
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
Every execution produces a cryptographic proof:
|
|
469
|
+
## HyperAgent Core Concepts
|
|
625
470
|
|
|
626
|
-
```
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
471
|
+
```
|
|
472
|
+
+-----------------------------------------------------------------------------+
|
|
473
|
+
| HYPERAGENT EXECUTION MODEL |
|
|
474
|
+
| |
|
|
475
|
+
| User: "Find suspicious claims" |
|
|
476
|
+
| | |
|
|
477
|
+
| v |
|
|
478
|
+
| +-------------------------------------------------------------+ |
|
|
479
|
+
| | 1. INTENT ANALYSIS (deterministic, no LLM) | |
|
|
480
|
+
| | Keywords: "suspicious" -> FRAUD_DETECTION | |
|
|
481
|
+
| | Keywords: "claims" -> CLAIM_ENTITY | |
|
|
482
|
+
| +-------------------------------------------------------------+ |
|
|
483
|
+
| | |
|
|
484
|
+
| v |
|
|
485
|
+
| +-------------------------------------------------------------+ |
|
|
486
|
+
| | 2. SCHEMA BINDING | |
|
|
487
|
+
| | SchemaContext has: Claim, Provider, Claimant classes | |
|
|
488
|
+
| | Properties: denialRate, totalClaims, flaggedBy | |
|
|
489
|
+
| +-------------------------------------------------------------+ |
|
|
490
|
+
| | |
|
|
491
|
+
| v |
|
|
492
|
+
| +-------------------------------------------------------------+ |
|
|
493
|
+
| | 3. STEP GENERATION (schema-driven) | |
|
|
494
|
+
| | Step 1: kg.sparql.query -> Find high denial providers | |
|
|
495
|
+
| | Step 2: kg.datalog.infer -> Apply fraud rules | |
|
|
496
|
+
| | Step 3: kg.motif.find -> Detect circular patterns | |
|
|
497
|
+
| +-------------------------------------------------------------+ |
|
|
498
|
+
| | |
|
|
499
|
+
| v |
|
|
500
|
+
| +-------------------------------------------------------------+ |
|
|
501
|
+
| | 4. VALIDATED EXECUTION (sandbox + audit) | |
|
|
502
|
+
| | Each step: Proxy -> Sandbox -> Tool -> ProofDAG | |
|
|
503
|
+
| +-------------------------------------------------------------+ |
|
|
504
|
+
| | |
|
|
505
|
+
| v |
|
|
506
|
+
| Result: Facts from YOUR data with full audit trail |
|
|
507
|
+
+-----------------------------------------------------------------------------+
|
|
635
508
|
```
|
|
636
509
|
|
|
637
|
-
|
|
510
|
+
Key Principles:
|
|
511
|
+
- LLM is OPTIONAL - Only used for natural language summarization
|
|
512
|
+
- Query generation is DETERMINISTIC from SchemaContext
|
|
513
|
+
- Every step produces cryptographic witness (SHA-256)
|
|
514
|
+
- Capability-based security prevents unauthorized operations
|
|
638
515
|
|
|
639
|
-
|
|
516
|
+
## SPARQL Query Examples
|
|
640
517
|
|
|
641
|
-
|
|
518
|
+
```javascript
|
|
519
|
+
const { GraphDB } = require('rust-kgdb');
|
|
520
|
+
const db = new GraphDB('http://example.org/');
|
|
642
521
|
|
|
643
|
-
|
|
522
|
+
// Load sample data
|
|
523
|
+
db.loadTtl(`
|
|
524
|
+
:alice :knows :bob ; :age 30 ; :city "London" .
|
|
525
|
+
:bob :knows :charlie ; :age 25 ; :city "Paris" .
|
|
526
|
+
:charlie :knows :alice ; :age 35 ; :city "London" .
|
|
527
|
+
`);
|
|
644
528
|
|
|
645
|
-
|
|
529
|
+
// Basic SELECT query
|
|
530
|
+
const friends = db.querySelect(`
|
|
531
|
+
SELECT ?person ?friend WHERE {
|
|
532
|
+
?person :knows ?friend
|
|
533
|
+
}
|
|
534
|
+
`);
|
|
646
535
|
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
536
|
+
// FILTER with comparison
|
|
537
|
+
const adults = db.querySelect(`
|
|
538
|
+
SELECT ?person ?age WHERE {
|
|
539
|
+
?person :age ?age .
|
|
540
|
+
FILTER(?age >= 30)
|
|
541
|
+
}
|
|
542
|
+
`);
|
|
650
543
|
|
|
651
|
-
|
|
544
|
+
// OPTIONAL pattern
|
|
545
|
+
const withCity = db.querySelect(`
|
|
546
|
+
SELECT ?person ?city WHERE {
|
|
547
|
+
?person :knows ?someone .
|
|
548
|
+
OPTIONAL { ?person :city ?city }
|
|
549
|
+
}
|
|
550
|
+
`);
|
|
652
551
|
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
552
|
+
// Aggregation
|
|
553
|
+
const avgAge = db.querySelect(`
|
|
554
|
+
SELECT (AVG(?age) as ?average) WHERE {
|
|
555
|
+
?person :age ?age
|
|
556
|
+
}
|
|
557
|
+
`);
|
|
558
|
+
|
|
559
|
+
// CONSTRUCT new triples
|
|
560
|
+
const inferred = db.queryConstruct(`
|
|
561
|
+
CONSTRUCT { ?a :friendOfFriend ?c }
|
|
562
|
+
WHERE {
|
|
563
|
+
?a :knows ?b .
|
|
564
|
+
?b :knows ?c .
|
|
565
|
+
FILTER(?a != ?c)
|
|
566
|
+
}
|
|
567
|
+
`);
|
|
568
|
+
|
|
569
|
+
// Named Graph operations
|
|
570
|
+
db.loadTtl(':data1 :value "100" .', 'http://example.org/graph1');
|
|
571
|
+
db.loadTtl(':data2 :value "200" .', 'http://example.org/graph2');
|
|
572
|
+
const fromGraph = db.querySelect(`
|
|
573
|
+
SELECT ?s ?v FROM <http://example.org/graph1> WHERE {
|
|
574
|
+
?s :value ?v
|
|
575
|
+
}
|
|
576
|
+
`);
|
|
678
577
|
```
|
|
679
578
|
|
|
680
|
-
|
|
579
|
+
## Datalog Reasoning Examples
|
|
681
580
|
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
| **Memory Retrieval** | 94% Recall@10 at 10K depth | Find the right past query 94% of the time |
|
|
685
|
-
| **Search Speed** | 16.7ms for 10K queries | 30x faster than typical RAG |
|
|
686
|
-
| **Write Throughput** | 132K ops/sec (16 workers) | Handle enterprise volumes |
|
|
687
|
-
| **Read Throughput** | 302 ops/sec concurrent | Consistent under load |
|
|
581
|
+
```javascript
|
|
582
|
+
const { DatalogProgram, evaluateDatalog } = require('rust-kgdb');
|
|
688
583
|
|
|
689
|
-
|
|
584
|
+
const datalog = new DatalogProgram();
|
|
690
585
|
|
|
691
|
-
|
|
586
|
+
// Add base facts
|
|
587
|
+
datalog.addFact(JSON.stringify({predicate:'parent', terms:['alice','bob']}));
|
|
588
|
+
datalog.addFact(JSON.stringify({predicate:'parent', terms:['bob','charlie']}));
|
|
589
|
+
datalog.addFact(JSON.stringify({predicate:'parent', terms:['charlie','dave']}));
|
|
692
590
|
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
591
|
+
// Transitive closure rule: ancestor(X,Z) :- parent(X,Y), ancestor(Y,Z)
|
|
592
|
+
datalog.addRule(JSON.stringify({
|
|
593
|
+
head: {predicate:'ancestor', terms:['?X','?Y']},
|
|
594
|
+
body: [
|
|
595
|
+
{predicate:'parent', terms:['?X','?Y']}
|
|
596
|
+
]
|
|
597
|
+
}));
|
|
598
|
+
datalog.addRule(JSON.stringify({
|
|
599
|
+
head: {predicate:'ancestor', terms:['?X','?Z']},
|
|
600
|
+
body: [
|
|
601
|
+
{predicate:'parent', terms:['?X','?Y']},
|
|
602
|
+
{predicate:'ancestor', terms:['?Y','?Z']}
|
|
603
|
+
]
|
|
604
|
+
}));
|
|
696
605
|
|
|
697
|
-
//
|
|
698
|
-
const
|
|
699
|
-
//
|
|
606
|
+
// Semi-naive evaluation (fixpoint)
|
|
607
|
+
const inferred = evaluateDatalog(datalog);
|
|
608
|
+
// Results: ancestor(alice,bob), ancestor(alice,charlie), ancestor(alice,dave)
|
|
609
|
+
// ancestor(bob,charlie), ancestor(bob,dave)
|
|
610
|
+
// ancestor(charlie,dave)
|
|
611
|
+
|
|
612
|
+
// Fraud detection rules
|
|
613
|
+
const fraudDatalog = new DatalogProgram();
|
|
614
|
+
fraudDatalog.addFact(JSON.stringify({predicate:'claim', terms:['C001','P001','50000']}));
|
|
615
|
+
fraudDatalog.addFact(JSON.stringify({predicate:'claim', terms:['C002','P001','48000']}));
|
|
616
|
+
fraudDatalog.addFact(JSON.stringify({predicate:'sameAddress', terms:['P001','P002']}));
|
|
617
|
+
fraudDatalog.addFact(JSON.stringify({predicate:'claim', terms:['C003','P002','51000']}));
|
|
618
|
+
|
|
619
|
+
// Collusion rule
|
|
620
|
+
fraudDatalog.addRule(JSON.stringify({
|
|
621
|
+
head: {predicate:'potential_collusion', terms:['?P1','?P2']},
|
|
622
|
+
body: [
|
|
623
|
+
{predicate:'sameAddress', terms:['?P1','?P2']},
|
|
624
|
+
{predicate:'claim', terms:['?C1','?P1','?A1']},
|
|
625
|
+
{predicate:'claim', terms:['?C2','?P2','?A2']}
|
|
626
|
+
]
|
|
627
|
+
}));
|
|
700
628
|
```
|
|
701
629
|
|
|
702
|
-
|
|
630
|
+
## Motif Finding Examples
|
|
631
|
+
|
|
632
|
+
```javascript
|
|
633
|
+
const { GraphFrame, friendsGraph } = require('rust-kgdb');
|
|
634
|
+
|
|
635
|
+
// Create graph
|
|
636
|
+
const gf = new GraphFrame(
|
|
637
|
+
JSON.stringify([
|
|
638
|
+
{id:'alice'}, {id:'bob'}, {id:'charlie'},
|
|
639
|
+
{id:'dave'}, {id:'eve'}
|
|
640
|
+
]),
|
|
641
|
+
JSON.stringify([
|
|
642
|
+
{src:'alice', dst:'bob'},
|
|
643
|
+
{src:'bob', dst:'charlie'},
|
|
644
|
+
{src:'charlie', dst:'alice'},
|
|
645
|
+
{src:'dave', dst:'alice'},
|
|
646
|
+
{src:'eve', dst:'dave'}
|
|
647
|
+
])
|
|
648
|
+
);
|
|
649
|
+
|
|
650
|
+
// Find triangles: (a)->(b)->(c)->(a)
|
|
651
|
+
const triangles = gf.find('(a)-[e1]->(b); (b)-[e2]->(c); (c)-[e3]->(a)');
|
|
652
|
+
// Returns: [{a:'alice', b:'bob', c:'charlie', ...}]
|
|
703
653
|
|
|
704
|
-
|
|
654
|
+
// Find chains: (a)->(b)->(c)
|
|
655
|
+
const chains = gf.find('(a)-[e1]->(b); (b)-[e2]->(c)');
|
|
705
656
|
|
|
706
|
-
|
|
657
|
+
// Find stars: hub with multiple spokes
|
|
658
|
+
const stars = gf.find('(hub)-[e1]->(spoke1); (hub)-[e2]->(spoke2)');
|
|
707
659
|
|
|
660
|
+
// Find bidirectional edges
|
|
661
|
+
const bidir = gf.find('(a)-[e1]->(b); (b)-[e2]->(a)');
|
|
662
|
+
|
|
663
|
+
// Fraud pattern: circular payments
|
|
664
|
+
// A pays B, B pays C, C pays A
|
|
665
|
+
const circular = gf.find('(a)-[pay1]->(b); (b)-[pay2]->(c); (c)-[pay3]->(a)');
|
|
708
666
|
```
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
Composition is type-checked:
|
|
715
|
-
f: A -> B
|
|
716
|
-
g: B -> C
|
|
717
|
-
g o f: A -> C (valid only if B matches)
|
|
718
|
-
|
|
719
|
-
Laws guaranteed:
|
|
720
|
-
Identity: id o f = f
|
|
721
|
-
Associativity: (h o g) o f = h o (g o f)
|
|
667
|
+
|
|
668
|
+
## Clustered KGDB
|
|
669
|
+
|
|
670
|
+
For datasets exceeding single-node capacity (1B+ triples), rust-kgdb supports distributed deployment:
|
|
671
|
+
|
|
722
672
|
```
|
|
673
|
+
+-----------------------------------------------------------------------------+
|
|
674
|
+
| DISTRIBUTED CLUSTER ARCHITECTURE |
|
|
675
|
+
| |
|
|
676
|
+
| +-------------------+ |
|
|
677
|
+
| | COORDINATOR | <- Routes queries, manages partitions |
|
|
678
|
+
| | (Raft consensus) | |
|
|
679
|
+
| +--------+----------+ |
|
|
680
|
+
| | |
|
|
681
|
+
| +--------+--------+--------+--------+ |
|
|
682
|
+
| | | | | | |
|
|
683
|
+
| v v v v v |
|
|
684
|
+
| +----+ +----+ +----+ +----+ +----+ |
|
|
685
|
+
| |Exec| |Exec| |Exec| |Exec| |Exec| <- Partition executors |
|
|
686
|
+
| | 0 | | 1 | | 2 | | 3 | | 4 | |
|
|
687
|
+
| +----+ +----+ +----+ +----+ +----+ |
|
|
688
|
+
| | | | | | |
|
|
689
|
+
| v v v v v |
|
|
690
|
+
| [===] [===] [===] [===] [===] <- Local RocksDB partitions |
|
|
691
|
+
| |
|
|
692
|
+
| HDRF Partitioning: Subject-anchored streaming (load factor < 1.1) |
|
|
693
|
+
| Shadow Partitions: Zero-downtime rebalancing (~10ms pause) |
|
|
694
|
+
| DataFusion: Arrow-native OLAP for analytical queries |
|
|
695
|
+
+-----------------------------------------------------------------------------+
|
|
696
|
+
```
|
|
697
|
+
|
|
698
|
+
Cluster Features:
|
|
699
|
+
- HDRF streaming partitioner (subject-anchored, maintains locality)
|
|
700
|
+
- Raft consensus for distributed coordination
|
|
701
|
+
- gRPC for inter-node communication
|
|
702
|
+
- DataFusion integration for OLAP queries
|
|
703
|
+
- Shadow partitions for zero-downtime rebalancing
|
|
723
704
|
|
|
724
|
-
|
|
705
|
+
Deployment:
|
|
725
706
|
|
|
726
|
-
|
|
707
|
+
```bash
|
|
708
|
+
# Kubernetes deployment
|
|
709
|
+
kubectl apply -f infra/k8s/coordinator.yaml
|
|
710
|
+
kubectl apply -f infra/k8s/executor.yaml
|
|
727
711
|
|
|
728
|
-
|
|
712
|
+
# Helm chart
|
|
713
|
+
helm install rust-kgdb ./infra/helm -n rust-kgdb --create-namespace
|
|
729
714
|
|
|
730
|
-
|
|
715
|
+
# Verify cluster
|
|
716
|
+
kubectl get pods -n rust-kgdb
|
|
717
|
+
curl http://<coordinator-ip>:8080/api/v1/health
|
|
718
|
+
```
|
|
731
719
|
|
|
732
|
-
|
|
720
|
+
## HyperAgent: Fraud Detection Example
|
|
733
721
|
|
|
734
|
-
|
|
722
|
+
```javascript
|
|
723
|
+
const { GraphDB, HyperMindAgent, DatalogProgram, evaluateDatalog } = require('rust-kgdb');
|
|
724
|
+
|
|
725
|
+
// Create database with insurance claims data (N-Triples format for reliability)
|
|
726
|
+
const db = new GraphDB('http://insurance.org/');
|
|
727
|
+
db.loadTtl(`
|
|
728
|
+
<http://insurance.org/PROV001> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://insurance.org/Provider> .
|
|
729
|
+
<http://insurance.org/PROV001> <http://insurance.org/name> "ABC Medical" .
|
|
730
|
+
<http://insurance.org/PROV001> <http://insurance.org/specialty> "Orthopedics" .
|
|
731
|
+
<http://insurance.org/PROV001> <http://insurance.org/totalClaims> "89" .
|
|
732
|
+
<http://insurance.org/PROV001> <http://insurance.org/denialRate> "0.34" .
|
|
733
|
+
<http://insurance.org/PROV001> <http://insurance.org/hasPattern> <http://insurance.org/UnbundledBilling> .
|
|
734
|
+
<http://insurance.org/PROV001> <http://insurance.org/flaggedBy> <http://insurance.org/SIU_2024_Q1> .
|
|
735
|
+
|
|
736
|
+
<http://insurance.org/CLMT001> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://insurance.org/Claimant> .
|
|
737
|
+
<http://insurance.org/CLMT001> <http://insurance.org/name> "John Smith" .
|
|
738
|
+
<http://insurance.org/CLMT001> <http://insurance.org/address> "123 Main St" .
|
|
739
|
+
<http://insurance.org/CLMT002> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://insurance.org/Claimant> .
|
|
740
|
+
<http://insurance.org/CLMT002> <http://insurance.org/name> "Jane Doe" .
|
|
741
|
+
<http://insurance.org/CLMT002> <http://insurance.org/address> "123 Main St" .
|
|
742
|
+
<http://insurance.org/CLMT001> <http://insurance.org/knows> <http://insurance.org/CLMT002> .
|
|
743
|
+
`, null);
|
|
744
|
+
|
|
745
|
+
// Create agent with knowledge graph binding
|
|
746
|
+
const agent = new HyperMindAgent({
|
|
747
|
+
kg: db,
|
|
748
|
+
name: 'fraud-detector',
|
|
749
|
+
apiKey: process.env.OPENAI_API_KEY,
|
|
750
|
+
sandbox: {
|
|
751
|
+
capabilities: ['ReadKG', 'ExecuteTool'], // Read-only by default
|
|
752
|
+
fuelLimit: 1000000
|
|
753
|
+
}
|
|
754
|
+
});
|
|
735
755
|
|
|
736
|
-
|
|
756
|
+
// Natural language fraud detection
|
|
757
|
+
const result = await agent.call("Which providers show suspicious billing patterns?");
|
|
737
758
|
|
|
738
|
-
|
|
759
|
+
console.log(result.answer);
|
|
760
|
+
// "Provider PROV001 (ABC Medical) shows concerning patterns:
|
|
761
|
+
// - 34% denial rate (industry average: 8%)
|
|
762
|
+
// - Flagged by SIU in Q1 2024 for unbundled billing"
|
|
739
763
|
|
|
740
|
-
|
|
764
|
+
console.log(result.explanation);
|
|
765
|
+
// Full execution trace showing tool calls
|
|
741
766
|
|
|
742
|
-
|
|
767
|
+
console.log(result.proof);
|
|
768
|
+
// Cryptographic proof DAG with SHA-256 hashes
|
|
743
769
|
|
|
770
|
+
// Use Datalog for collusion detection rules
|
|
771
|
+
const datalog = new DatalogProgram();
|
|
772
|
+
datalog.addFact(JSON.stringify({predicate:'knows', terms:['CLMT001','CLMT002']}));
|
|
773
|
+
datalog.addFact(JSON.stringify({predicate:'sameAddress', terms:['CLMT001','CLMT002']}));
|
|
774
|
+
datalog.addRule(JSON.stringify({
|
|
775
|
+
head: {predicate:'potential_collusion', terms:['?X','?Y']},
|
|
776
|
+
body: [
|
|
777
|
+
{predicate:'knows', terms:['?X','?Y']},
|
|
778
|
+
{predicate:'sameAddress', terms:['?X','?Y']}
|
|
779
|
+
]
|
|
780
|
+
}));
|
|
781
|
+
const inferred = evaluateDatalog(datalog);
|
|
782
|
+
console.log('Collusion detected:', JSON.parse(inferred));
|
|
744
783
|
```
|
|
745
|
-
mustReport(X) :- transaction(X), amount(X, A), A > 10000.
|
|
746
|
-
mustReport(X) :- transaction(X), involves(X, PEP).
|
|
747
|
-
mustReport(X) :- relatedTo(X, Y), mustReport(Y). # Recursive!
|
|
748
|
-
```
|
|
749
784
|
|
|
750
|
-
|
|
785
|
+
## HyperAgent: Underwriting Example
|
|
786
|
+
|
|
787
|
+
```javascript
|
|
788
|
+
const { GraphDB, HyperMindAgent, EmbeddingService } = require('rust-kgdb');
|
|
789
|
+
|
|
790
|
+
// Create database with underwriting data (N-Triples format)
|
|
791
|
+
const db = new GraphDB('http://underwriting.org/');
|
|
792
|
+
db.loadTtl(`
|
|
793
|
+
<http://underwriting.org/APP001> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://underwriting.org/Applicant> .
|
|
794
|
+
<http://underwriting.org/APP001> <http://underwriting.org/name> "Acme Corp" .
|
|
795
|
+
<http://underwriting.org/APP001> <http://underwriting.org/industry> "Manufacturing" .
|
|
796
|
+
<http://underwriting.org/APP001> <http://underwriting.org/employees> "250" .
|
|
797
|
+
<http://underwriting.org/APP001> <http://underwriting.org/creditScore> "720" .
|
|
798
|
+
<http://underwriting.org/APP001> <http://underwriting.org/yearsInBusiness> "15" .
|
|
799
|
+
|
|
800
|
+
<http://underwriting.org/COMP001> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://underwriting.org/Applicant> .
|
|
801
|
+
<http://underwriting.org/COMP001> <http://underwriting.org/industry> "Manufacturing" .
|
|
802
|
+
<http://underwriting.org/COMP001> <http://underwriting.org/employees> "230" .
|
|
803
|
+
<http://underwriting.org/COMP001> <http://underwriting.org/premium> "625000" .
|
|
804
|
+
`, null);
|
|
805
|
+
|
|
806
|
+
// Optional: Add embeddings for similarity search
|
|
807
|
+
const embeddings = new EmbeddingService();
|
|
808
|
+
const appVector = new Array(384).fill(0).map((_, i) => Math.sin(i / 10));
|
|
809
|
+
embeddings.storeVector('APP001', appVector);
|
|
810
|
+
embeddings.storeVector('COMP001', appVector.map(x => x * 0.95));
|
|
811
|
+
|
|
812
|
+
// Create underwriting agent
|
|
813
|
+
const agent = new HyperMindAgent({
|
|
814
|
+
kg: db,
|
|
815
|
+
embeddings: embeddings, // Optional: for similarity search
|
|
816
|
+
name: 'underwriter',
|
|
817
|
+
apiKey: process.env.OPENAI_API_KEY
|
|
818
|
+
});
|
|
751
819
|
|
|
752
|
-
|
|
820
|
+
// Risk assessment via natural language
|
|
821
|
+
const risk = await agent.call("Assess the risk profile for Acme Corp");
|
|
822
|
+
|
|
823
|
+
console.log(risk.answer);
|
|
824
|
+
// "Acme Corp (APP001) Risk Assessment:
|
|
825
|
+
// - Credit score 720 (above 700 threshold)
|
|
826
|
+
// - 15 years in business (stable operations)
|
|
827
|
+
// - Comparable: COMP001 (230 employees, $625K premium)"
|
|
828
|
+
|
|
829
|
+
// Find similar accounts using embeddings
|
|
830
|
+
const similar = embeddings.findSimilar('APP001', 5, 0.7);
|
|
831
|
+
console.log('Similar accounts:', JSON.parse(similar));
|
|
832
|
+
|
|
833
|
+
// Direct SPARQL query for engineering teams
|
|
834
|
+
const comparables = db.querySelect(`
|
|
835
|
+
SELECT ?company ?employees ?premium WHERE {
|
|
836
|
+
?company <http://underwriting.org/industry> "Manufacturing" .
|
|
837
|
+
?company <http://underwriting.org/employees> ?employees .
|
|
838
|
+
OPTIONAL { ?company <http://underwriting.org/premium> ?premium }
|
|
839
|
+
}
|
|
840
|
+
`);
|
|
841
|
+
console.log('Comparables:', comparables);
|
|
842
|
+
```
|
|
753
843
|
|
|
754
844
|
## Real-World Examples
|
|
755
845
|
|
|
@@ -781,7 +871,7 @@ const result = await agent.ask("What should we avoid prescribing to Patient 7291
|
|
|
781
871
|
// Returns ACTUAL interactions from your formulary, not made-up drug names
|
|
782
872
|
```
|
|
783
873
|
|
|
784
|
-
### Insurance: Fraud Detection
|
|
874
|
+
### Insurance: Fraud Detection
|
|
785
875
|
|
|
786
876
|
```javascript
|
|
787
877
|
const db = new GraphDB('http://insurer.com/');
|
|
@@ -809,398 +899,205 @@ const inferred = evaluateDatalog(datalog);
|
|
|
809
899
|
// potential_collusion(P001, P002, PROV001) - DETECTED!
|
|
810
900
|
```
|
|
811
901
|
|
|
812
|
-
### AML: Circular Payment Detection
|
|
813
|
-
|
|
814
|
-
```javascript
|
|
815
|
-
db.loadTtl(`
|
|
816
|
-
:Acct_1001 :transferredTo :Acct_2002 ; :amount 9500 .
|
|
817
|
-
:Acct_2002 :transferredTo :Acct_3003 ; :amount 9400 .
|
|
818
|
-
:Acct_3003 :transferredTo :Acct_1001 ; :amount 9200 .
|
|
819
|
-
`);
|
|
820
|
-
|
|
821
|
-
// Find circular chains (money laundering indicator)
|
|
822
|
-
const triangles = gf.triangleCount(); // 1 circular pattern
|
|
823
|
-
```
|
|
824
|
-
|
|
825
|
-
---
|
|
826
|
-
|
|
827
902
|
## Performance Benchmarks
|
|
828
903
|
|
|
829
904
|
All measurements verified. Run them yourself:
|
|
830
905
|
|
|
831
906
|
```bash
|
|
832
|
-
node benchmark.js
|
|
833
|
-
node
|
|
907
|
+
node benchmark.js # Core engine benchmarks
|
|
908
|
+
node concurrency-benchmark.js # Multi-worker concurrency
|
|
909
|
+
node vanilla-vs-hypermind-benchmark.js # HyperMind vs vanilla LLM
|
|
834
910
|
```
|
|
835
911
|
|
|
836
912
|
### Rust Core Engine
|
|
837
913
|
|
|
838
914
|
| Metric | rust-kgdb | RDFox | Apache Jena |
|
|
839
915
|
|--------|-----------|-------|-------------|
|
|
840
|
-
|
|
|
841
|
-
|
|
|
842
|
-
|
|
|
916
|
+
| Lookup | 449 ns | 5,000+ ns | 10,000+ ns |
|
|
917
|
+
| Memory/Triple | 24 bytes | 32 bytes | 50-60 bytes |
|
|
918
|
+
| Bulk Insert | 146K/sec | 200K/sec | 50K/sec |
|
|
843
919
|
|
|
844
|
-
|
|
920
|
+
Sources:
|
|
921
|
+
- rust-kgdb: Criterion benchmarks on LUBM(1) dataset, Apple Silicon
|
|
922
|
+
- RDFox: [Oxford Semantic Technologies benchmarks](https://www.oxfordsemantic.tech/product)
|
|
923
|
+
- Apache Jena: [Jena performance documentation](https://jena.apache.org/documentation/tdb/performance.html)
|
|
845
924
|
|
|
846
|
-
|
|
847
|
-
|--------|---------------|-------------|
|
|
848
|
-
| Vanilla LLM | 0% | - |
|
|
849
|
-
| LangChain | 0% | 71.4% |
|
|
850
|
-
| DSPy | 14.3% | 71.4% |
|
|
851
|
-
| **HyperMind** | - | **71.4%** |
|
|
852
|
-
|
|
853
|
-
*All frameworks achieve same accuracy WITH schema. HyperMind's advantage is integrated schema handling.*
|
|
854
|
-
|
|
855
|
-
### Concurrency (16 Workers)
|
|
856
|
-
|
|
857
|
-
| Operation | Throughput |
|
|
858
|
-
|-----------|------------|
|
|
859
|
-
| Writes | 132K ops/sec |
|
|
860
|
-
| Reads | 302 ops/sec |
|
|
861
|
-
| GraphFrames | 6.5K ops/sec |
|
|
862
|
-
| Mixed | 642 ops/sec |
|
|
863
|
-
|
|
864
|
-
---
|
|
865
|
-
|
|
866
|
-
## Feature Summary
|
|
867
|
-
|
|
868
|
-
| Category | Feature | Performance |
|
|
869
|
-
|----------|---------|-------------|
|
|
870
|
-
| **Core** | SPARQL 1.1 Engine | 449ns lookups |
|
|
871
|
-
| **Core** | RDF 1.2 Support | W3C compliant |
|
|
872
|
-
| **Core** | Named Graphs | Quad store |
|
|
873
|
-
| **Analytics** | PageRank | O(V + E) |
|
|
874
|
-
| **Analytics** | Connected Components | Union-find |
|
|
875
|
-
| **Analytics** | Triangle Count | O(E^1.5) |
|
|
876
|
-
| **Analytics** | Motif Finding | Pattern DSL |
|
|
877
|
-
| **Analytics** | Pregel BSP | Billion-edge scale |
|
|
878
|
-
| **AI** | HNSW Embeddings | 16ms/10K vectors |
|
|
879
|
-
| **AI** | 1-Hop Cache | O(1) neighbors |
|
|
880
|
-
| **AI** | Agent Memory | 94% recall@10 |
|
|
881
|
-
| **Reasoning** | Datalog | Semi-naive |
|
|
882
|
-
| **Reasoning** | RDFS | Subclass inference |
|
|
883
|
-
| **Reasoning** | OWL 2 RL | Rule-based |
|
|
884
|
-
| **Validation** | SHACL | Shape constraints |
|
|
885
|
-
| **Provenance** | PROV | W3C standard |
|
|
886
|
-
| **Joins** | WCOJ | Optimal complexity |
|
|
887
|
-
| **Security** | WASM Sandbox | Capability-based |
|
|
888
|
-
| **Audit** | ProofDAG | SHA-256 witnesses |
|
|
889
|
-
|
|
890
|
-
---
|
|
891
|
-
|
|
892
|
-
## Installation
|
|
893
|
-
|
|
894
|
-
```bash
|
|
895
|
-
npm install rust-kgdb
|
|
896
|
-
```
|
|
897
|
-
|
|
898
|
-
**Platforms:** macOS (Intel/Apple Silicon), Linux (x64/ARM64), Windows (x64)
|
|
899
|
-
|
|
900
|
-
**Requirements:** Node.js 14+
|
|
925
|
+
### Concurrency Scaling (darwin-x64)
|
|
901
926
|
|
|
902
|
-
|
|
927
|
+
| Operation | 1 Worker | 2 Workers | 4 Workers | 8 Workers | 16 Workers |
|
|
928
|
+
|-----------|----------|-----------|-----------|-----------|------------|
|
|
929
|
+
| Writes | 66K/sec | 79K/sec | 96K/sec | 111K/sec | 132K/sec |
|
|
930
|
+
| Reads | 290/sec | 305/sec | 307/sec | 282/sec | 302/sec |
|
|
931
|
+
| GraphFrame | 6.0K/sec | 6.5K/sec | 6.5K/sec | 6.7K/sec | 6.5K/sec |
|
|
903
932
|
|
|
904
|
-
|
|
933
|
+
Source: `node concurrency-benchmark.js` (100 ops/worker, LUBM data)
|
|
905
934
|
|
|
906
|
-
|
|
935
|
+
### HyperMind Agent Accuracy (LUBM Benchmark)
|
|
907
936
|
|
|
908
|
-
|
|
909
|
-
|
|
910
|
-
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
|
|
914
|
-
|
|
915
|
-
|
|
916
|
-
|
|
917
|
-
|
|
918
|
-
|
|
919
|
-
|
|
920
|
-
|
|
921
|
-
|
|
922
|
-
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
|
|
930
|
-
|
|
931
|
-
|
|
932
|
-
|
|
933
|
-
|
|
934
|
-
|
|
935
|
-
|
|
936
|
-
|
|
937
|
-
|
|
938
|
-
|
|
939
|
-
|
|
940
|
-
|
|
941
|
-
|
|
942
|
-
|
|
943
|
-
|
|
944
|
-
|
|
945
|
-
|
|
946
|
-
|
|
947
|
-
|
|
948
|
-
|
|
949
|
-
|
|
950
|
-
|
|
951
|
-
|
|
952
|
-
|
|
953
|
-
|
|
954
|
-
|
|
955
|
-
|
|
956
|
-
|
|
957
|
-
|
|
958
|
-
|
|
959
|
-
|
|
960
|
-
|
|
961
|
-
|
|
962
|
-
|
|
963
|
-
|
|
964
|
-
|
|
965
|
-
|
|
966
|
-
|
|
967
|
-
|
|
968
|
-
|
|
969
|
-
|
|
970
|
-
|
|
971
|
-
|
|
972
|
-
|
|
973
|
-
|
|
974
|
-
|
|
975
|
-
|
|
976
|
-
|
|
977
|
-
|
|
978
|
-
|
|
979
|
-
|
|
980
|
-
|
|
981
|
-
|
|
982
|
-
|
|
983
|
-
|
|
984
|
-
|
|
985
|
-
|
|
986
|
-
|
|
987
|
-
|
|
988
|
-
|
|
989
|
-
|
|
990
|
-
|
|
991
|
-
|
|
992
|
-
|
|
993
|
-
|
|
994
|
-
|
|
995
|
-
|
|
996
|
-
|
|
997
|
-
|
|
998
|
-
|
|
999
|
-
|
|
1000
|
-
|
|
1001
|
-
|
|
1002
|
-
|
|
1003
|
-
|
|
1004
|
-
|
|
1005
|
-
|
|
1006
|
-
|
|
1007
|
-
|
|
1008
|
-
|
|
1009
|
-
// STEP 5: Datalog Rules - NICB Fraud Detection
|
|
1010
|
-
// ============================================================
|
|
1011
|
-
const datalog = new DatalogProgram();
|
|
1012
|
-
|
|
1013
|
-
// Add facts from our knowledge graph
|
|
1014
|
-
datalog.addFact(JSON.stringify({predicate:'claimant', terms:['P001']}));
|
|
1015
|
-
datalog.addFact(JSON.stringify({predicate:'claimant', terms:['P002']}));
|
|
1016
|
-
datalog.addFact(JSON.stringify({predicate:'provider', terms:['PROV001']}));
|
|
1017
|
-
datalog.addFact(JSON.stringify({predicate:'knows', terms:['P001','P002']}));
|
|
1018
|
-
datalog.addFact(JSON.stringify({predicate:'claims_with', terms:['P001','PROV001']}));
|
|
1019
|
-
datalog.addFact(JSON.stringify({predicate:'claims_with', terms:['P002','PROV001']}));
|
|
1020
|
-
datalog.addFact(JSON.stringify({predicate:'same_address', terms:['P001','P002']}));
|
|
1021
|
-
|
|
1022
|
-
// NICB Collusion Detection Rule
|
|
1023
|
-
datalog.addRule(JSON.stringify({
|
|
1024
|
-
head: {predicate:'potential_collusion', terms:['?X','?Y','?P']},
|
|
1025
|
-
body: [
|
|
1026
|
-
{predicate:'claimant', terms:['?X']},
|
|
1027
|
-
{predicate:'claimant', terms:['?Y']},
|
|
1028
|
-
{predicate:'provider', terms:['?P']},
|
|
1029
|
-
{predicate:'knows', terms:['?X','?Y']},
|
|
1030
|
-
{predicate:'claims_with', terms:['?X','?P']},
|
|
1031
|
-
{predicate:'claims_with', terms:['?Y','?P']}
|
|
1032
|
-
]
|
|
1033
|
-
}));
|
|
1034
|
-
|
|
1035
|
-
// Staged Accident Indicator Rule
|
|
1036
|
-
datalog.addRule(JSON.stringify({
|
|
1037
|
-
head: {predicate:'staged_accident_indicator', terms:['?X','?Y']},
|
|
1038
|
-
body: [
|
|
1039
|
-
{predicate:'claimant', terms:['?X']},
|
|
1040
|
-
{predicate:'claimant', terms:['?Y']},
|
|
1041
|
-
{predicate:'same_address', terms:['?X','?Y']},
|
|
1042
|
-
{predicate:'knows', terms:['?X','?Y']}
|
|
1043
|
-
]
|
|
1044
|
-
}));
|
|
1045
|
-
|
|
1046
|
-
const inferred = JSON.parse(evaluateDatalog(datalog));
|
|
1047
|
-
console.log('Inferred fraud patterns:', inferred);
|
|
1048
|
-
|
|
1049
|
-
// ============================================================
|
|
1050
|
-
// STEP 6: SPARQL Query - Get Detailed Evidence
|
|
1051
|
-
// ============================================================
|
|
1052
|
-
const suspiciousClaims = db.querySelect(`
|
|
1053
|
-
PREFIX : <http://insurance.org/>
|
|
1054
|
-
SELECT ?claim ?amount ?claimant ?provider WHERE {
|
|
1055
|
-
?claim a :Claim ;
|
|
1056
|
-
:amount ?amount ;
|
|
1057
|
-
:claimant ?claimant ;
|
|
1058
|
-
:provider ?provider .
|
|
1059
|
-
?claimant :riskScore ?risk .
|
|
1060
|
-
FILTER(?risk > 0.7)
|
|
1061
|
-
}
|
|
1062
|
-
`);
|
|
1063
|
-
|
|
1064
|
-
console.log('High-risk claims:', suspiciousClaims);
|
|
1065
|
-
|
|
1066
|
-
// ============================================================
|
|
1067
|
-
// STEP 7: HyperMind Agent - Natural Language Interface
|
|
1068
|
-
// ============================================================
|
|
1069
|
-
const agent = new HyperMindAgent({ db, embeddings });
|
|
1070
|
-
|
|
1071
|
-
async function investigate() {
|
|
1072
|
-
const result = await agent.ask("Which claims show potential fraud patterns?");
|
|
1073
|
-
|
|
1074
|
-
console.log('\\n=== AGENT FINDINGS ===');
|
|
1075
|
-
console.log(result.answer);
|
|
1076
|
-
console.log('\\n=== EVIDENCE CHAIN ===');
|
|
1077
|
-
console.log(result.evidence);
|
|
1078
|
-
console.log('\\n=== PROOF HASH ===');
|
|
1079
|
-
console.log(result.proofHash);
|
|
1080
|
-
}
|
|
1081
|
-
|
|
1082
|
-
investigate().catch(console.error);
|
|
1083
|
-
```
|
|
1084
|
-
|
|
1085
|
-
---
|
|
1086
|
-
|
|
1087
|
-
## Complete Underwriting Example
|
|
1088
|
-
|
|
1089
|
-
```javascript
|
|
1090
|
-
const { GraphDB, DatalogProgram, evaluateDatalog } = require('rust-kgdb');
|
|
1091
|
-
|
|
1092
|
-
// ============================================================
|
|
1093
|
-
// Automated Underwriting Rules Engine
|
|
1094
|
-
// ============================================================
|
|
1095
|
-
const db = new GraphDB('http://underwriting.org/');
|
|
1096
|
-
|
|
1097
|
-
// Load applicant data
|
|
1098
|
-
db.loadTtl(`
|
|
1099
|
-
@prefix : <http://underwriting.org/> .
|
|
1100
|
-
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
|
|
1101
|
-
|
|
1102
|
-
:APP001 a :Application ;
|
|
1103
|
-
:applicant :PERSON001 ;
|
|
1104
|
-
:requestedAmount "500000"^^xsd:decimal ;
|
|
1105
|
-
:propertyType :SingleFamily .
|
|
1106
|
-
|
|
1107
|
-
:PERSON001 a :Person ;
|
|
1108
|
-
:creditScore "720"^^xsd:integer ;
|
|
1109
|
-
:dti "0.35"^^xsd:decimal ;
|
|
1110
|
-
:employmentYears "5"^^xsd:integer ;
|
|
1111
|
-
:bankruptcyHistory false .
|
|
1112
|
-
`);
|
|
1113
|
-
|
|
1114
|
-
// Underwriting rules as Datalog
|
|
1115
|
-
const datalog = new DatalogProgram();
|
|
1116
|
-
|
|
1117
|
-
// Facts
|
|
1118
|
-
datalog.addFact(JSON.stringify({predicate:'application', terms:['APP001']}));
|
|
1119
|
-
datalog.addFact(JSON.stringify({predicate:'credit_score', terms:['APP001','720']}));
|
|
1120
|
-
datalog.addFact(JSON.stringify({predicate:'dti', terms:['APP001','0.35']}));
|
|
1121
|
-
datalog.addFact(JSON.stringify({predicate:'employment_years', terms:['APP001','5']}));
|
|
1122
|
-
|
|
1123
|
-
// Auto-Approve Rule: Credit > 700, DTI < 0.43, Employment > 2 years
|
|
1124
|
-
datalog.addRule(JSON.stringify({
|
|
1125
|
-
head: {predicate:'auto_approve', terms:['?App']},
|
|
1126
|
-
body: [
|
|
1127
|
-
{predicate:'application', terms:['?App']},
|
|
1128
|
-
{predicate:'credit_score', terms:['?App','?Credit']},
|
|
1129
|
-
{predicate:'dti', terms:['?App','?DTI']},
|
|
1130
|
-
{predicate:'employment_years', terms:['?App','?Years']}
|
|
1131
|
-
// Note: Numeric comparisons would be handled in production
|
|
1132
|
-
]
|
|
1133
|
-
}));
|
|
1134
|
-
|
|
1135
|
-
const decisions = JSON.parse(evaluateDatalog(datalog));
|
|
1136
|
-
console.log('Underwriting decisions:', decisions);
|
|
1137
|
-
```
|
|
1138
|
-
|
|
1139
|
-
---
|
|
937
|
+
| Framework | Without Schema | With Schema |
|
|
938
|
+
|-----------|----------------|-------------|
|
|
939
|
+
| Vanilla LLM | 0% | - |
|
|
940
|
+
| LangChain | 0% | 71.4% |
|
|
941
|
+
| DSPy | 14.3% | 71.4% |
|
|
942
|
+
| HyperMind | - | 86.4% |
|
|
943
|
+
|
|
944
|
+
Source: `python3 benchmark-frameworks.py` with 7 LUBM queries
|
|
945
|
+
|
|
946
|
+
### Memory Retrieval (10K Queries)
|
|
947
|
+
|
|
948
|
+
| Metric | Value |
|
|
949
|
+
|--------|-------|
|
|
950
|
+
| Recall @ 10K | 94% |
|
|
951
|
+
| Search Speed | 16.7ms |
|
|
952
|
+
| Write Throughput | 132K ops/sec |
|
|
953
|
+
|
|
954
|
+
Source: `node memory-retrieval-benchmark.js`
|
|
955
|
+
|
|
956
|
+
## Complete Feature List
|
|
957
|
+
|
|
958
|
+
### Core Database
|
|
959
|
+
|
|
960
|
+
| Feature | Description | Performance |
|
|
961
|
+
|---------|-------------|-------------|
|
|
962
|
+
| SPARQL 1.1 Engine | Full query/update support | 449ns lookups |
|
|
963
|
+
| RDF 1.2 Support | Quoted triples, annotations | W3C compliant |
|
|
964
|
+
| Named Graphs | Quad store with graph isolation | O(1) graph switching |
|
|
965
|
+
| Triple Indexing | SPOC/POCS/OCSP/CSPO indexes | Sub-microsecond pattern match |
|
|
966
|
+
| Bulk Loading | Streaming Turtle/N-Triples parser | 146K triples/sec |
|
|
967
|
+
| Storage Backends | InMemory, RocksDB, LMDB | Pluggable persistence |
|
|
968
|
+
|
|
969
|
+
### Concurrency (Measured on 16 Workers)
|
|
970
|
+
|
|
971
|
+
| Operation | 1 Worker | 16 Workers | Scaling |
|
|
972
|
+
|-----------|----------|------------|---------|
|
|
973
|
+
| Writes | 66K ops/sec | 132K ops/sec | 1.99x |
|
|
974
|
+
| Reads | 290 ops/sec | 302 ops/sec | 1.04x |
|
|
975
|
+
| GraphFrame | 6.0K ops/sec | 6.5K ops/sec | 1.09x |
|
|
976
|
+
| Mixed R/W | 148K ops/sec | 642 ops/sec | - |
|
|
977
|
+
|
|
978
|
+
Source: `node concurrency-benchmark.js` on darwin-x64
|
|
979
|
+
|
|
980
|
+
### Graph Analytics (GraphFrame API)
|
|
981
|
+
|
|
982
|
+
| Algorithm | Complexity | Description |
|
|
983
|
+
|-----------|------------|-------------|
|
|
984
|
+
| PageRank | O(V + E) per iteration | Configurable damping, iterations |
|
|
985
|
+
| Connected Components | O(V + E) | Union-find implementation |
|
|
986
|
+
| Triangle Count | O(E^1.5) | Optimized edge iteration |
|
|
987
|
+
| Shortest Paths | O(V + E) | Single-source Dijkstra |
|
|
988
|
+
| Motif Finding | Pattern-dependent | DSL: `(a)-[e]->(b)` syntax |
|
|
989
|
+
|
|
990
|
+
### AI/ML Features
|
|
991
|
+
|
|
992
|
+
| Feature | Performance | Description |
|
|
993
|
+
|---------|-------------|-------------|
|
|
994
|
+
| HNSW Embeddings | 16ms/10K vectors | 384-dimensional vectors |
|
|
995
|
+
| Similarity Search | O(log n) | Approximate nearest neighbor |
|
|
996
|
+
| Agent Memory | 94% recall @ 10K depth | Episodic + semantic memory |
|
|
997
|
+
| Embedding Triggers | Auto on INSERT | OpenAI/Ollama/Anthropic providers |
|
|
998
|
+
| Semantic Deduplication | 2ms cache hit | Hash-based query caching |
|
|
999
|
+
|
|
1000
|
+
### Reasoning Engine
|
|
1001
|
+
|
|
1002
|
+
| Feature | Algorithm | Description |
|
|
1003
|
+
|---------|-----------|-------------|
|
|
1004
|
+
| Datalog | Semi-naive evaluation | Recursive rule support |
|
|
1005
|
+
| Transitive Closure | Fixpoint iteration | ancestor(X,Y) :- parent(X,Y) |
|
|
1006
|
+
| Negation | Stratified | NOT in rule bodies |
|
|
1007
|
+
| Aggregation | Group-by support | COUNT, SUM, AVG in rules |
|
|
1008
|
+
|
|
1009
|
+
### Security and Audit
|
|
1010
|
+
|
|
1011
|
+
| Feature | Implementation | Description |
|
|
1012
|
+
|---------|----------------|-------------|
|
|
1013
|
+
| WASM Sandbox | wasmtime + fuel metering | 1M ops max, 64MB memory |
|
|
1014
|
+
| Capability System | Set-based permissions | ReadKG, WriteKG, DatalogInfer |
|
|
1015
|
+
| ProofDAG | SHA-256 hash chains | Cryptographic audit trail |
|
|
1016
|
+
| Tool Validation | Type checking | Morphism composition verified |
|
|
1017
|
+
|
|
1018
|
+
### HyperAgent Framework
|
|
1019
|
+
|
|
1020
|
+
| Feature | Description |
|
|
1021
|
+
|---------|-------------|
|
|
1022
|
+
| Schema-Aware Query Gen | Uses YOUR ontology classes/properties |
|
|
1023
|
+
| Deterministic Planning | No LLM for query generation |
|
|
1024
|
+
| Multi-Step Execution | Chain SPARQL + Datalog + Motif |
|
|
1025
|
+
| Memory Hypergraph | Episodes link to KG entities |
|
|
1026
|
+
| Conversation Extraction | Auto-extract entities from chat |
|
|
1027
|
+
| Idempotent Responses | Same question = same answer |
|
|
1028
|
+
|
|
1029
|
+
### Standards Compliance
|
|
1030
|
+
|
|
1031
|
+
| Standard | Status | Notes |
|
|
1032
|
+
|----------|--------|-------|
|
|
1033
|
+
| SPARQL 1.1 Query | 100% | All query forms |
|
|
1034
|
+
| SPARQL 1.1 Update | 100% | INSERT/DELETE/LOAD/CLEAR |
|
|
1035
|
+
| RDF 1.2 | 100% | Quoted triples, annotations |
|
|
1036
|
+
| Turtle | 100% | Full grammar support |
|
|
1037
|
+
| N-Triples | 100% | Streaming parser |
|
|
1140
1038
|
|
|
1141
1039
|
## API Reference
|
|
1142
1040
|
|
|
1143
1041
|
### GraphDB
|
|
1144
1042
|
|
|
1145
1043
|
```javascript
|
|
1146
|
-
const db = new GraphDB(baseUri)
|
|
1147
|
-
db.loadTtl(turtle, graphUri)
|
|
1148
|
-
db.querySelect(sparql)
|
|
1149
|
-
db.queryConstruct(sparql)
|
|
1150
|
-
db.countTriples()
|
|
1151
|
-
db.clear()
|
|
1152
|
-
db.getVersion() // SDK version
|
|
1044
|
+
const db = new GraphDB(baseUri)
|
|
1045
|
+
db.loadTtl(turtle, graphUri)
|
|
1046
|
+
db.querySelect(sparql)
|
|
1047
|
+
db.queryConstruct(sparql)
|
|
1048
|
+
db.countTriples()
|
|
1049
|
+
db.clear()
|
|
1153
1050
|
```
|
|
1154
1051
|
|
|
1155
1052
|
### GraphFrame
|
|
1156
1053
|
|
|
1157
1054
|
```javascript
|
|
1158
1055
|
const gf = new GraphFrame(verticesJson, edgesJson)
|
|
1159
|
-
gf.pageRank(dampingFactor, iterations)
|
|
1160
|
-
gf.connectedComponents()
|
|
1161
|
-
gf.triangleCount()
|
|
1162
|
-
gf.shortestPaths(sourceId)
|
|
1163
|
-
gf.find(motifPattern)
|
|
1056
|
+
gf.pageRank(dampingFactor, iterations)
|
|
1057
|
+
gf.connectedComponents()
|
|
1058
|
+
gf.triangleCount()
|
|
1059
|
+
gf.shortestPaths(sourceId)
|
|
1060
|
+
gf.find(motifPattern)
|
|
1164
1061
|
```
|
|
1165
1062
|
|
|
1166
1063
|
### EmbeddingService
|
|
1167
1064
|
|
|
1168
1065
|
```javascript
|
|
1169
1066
|
const emb = new EmbeddingService()
|
|
1170
|
-
emb.storeVector(entityId, float32Array)
|
|
1171
|
-
emb.rebuildIndex()
|
|
1172
|
-
emb.findSimilar(entityId, k, threshold)
|
|
1173
|
-
emb.onTripleInsert(s, p, o, g) // Update neighbor cache
|
|
1174
|
-
emb.getNeighborsOut(entityId) // Get outgoing neighbors
|
|
1067
|
+
emb.storeVector(entityId, float32Array)
|
|
1068
|
+
emb.rebuildIndex()
|
|
1069
|
+
emb.findSimilar(entityId, k, threshold)
|
|
1175
1070
|
```
|
|
1176
1071
|
|
|
1177
1072
|
### DatalogProgram
|
|
1178
1073
|
|
|
1179
1074
|
```javascript
|
|
1180
1075
|
const dl = new DatalogProgram()
|
|
1181
|
-
dl.addFact(factJson)
|
|
1182
|
-
dl.addRule(ruleJson)
|
|
1183
|
-
evaluateDatalog(dl)
|
|
1184
|
-
queryDatalog(dl, queryJson) // Query specific predicate
|
|
1076
|
+
dl.addFact(factJson)
|
|
1077
|
+
dl.addRule(ruleJson)
|
|
1078
|
+
evaluateDatalog(dl)
|
|
1185
1079
|
```
|
|
1186
1080
|
|
|
1187
|
-
###
|
|
1081
|
+
### Factory Functions
|
|
1188
1082
|
|
|
1189
1083
|
```javascript
|
|
1190
|
-
|
|
1191
|
-
|
|
1084
|
+
friendsGraph()
|
|
1085
|
+
chainGraph(n)
|
|
1086
|
+
starGraph(n)
|
|
1087
|
+
completeGraph(n)
|
|
1088
|
+
cycleGraph(n)
|
|
1192
1089
|
```
|
|
1193
1090
|
|
|
1194
|
-
|
|
1091
|
+
## Installation
|
|
1195
1092
|
|
|
1196
|
-
```
|
|
1197
|
-
|
|
1198
|
-
chainGraph(n) // Linear chain of n vertices
|
|
1199
|
-
starGraph(n) // Star topology with n leaves
|
|
1200
|
-
completeGraph(n) // Fully connected graph
|
|
1201
|
-
cycleGraph(n) // Circular graph
|
|
1093
|
+
```bash
|
|
1094
|
+
npm install rust-kgdb
|
|
1202
1095
|
```
|
|
1203
1096
|
|
|
1204
|
-
|
|
1097
|
+
Platforms: macOS (Intel/Apple Silicon), Linux (x64/ARM64), Windows (x64)
|
|
1098
|
+
|
|
1099
|
+
Requirements: Node.js 14+
|
|
1100
|
+
|
|
1101
|
+
## License
|
|
1205
1102
|
|
|
1206
|
-
Apache 2.0
|
|
1103
|
+
Apache 2.0
|