@eucoder/rag 0.2.0 → 0.3.1
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 +90 -10
- package/dist/index.d.ts +5 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/neo4j-knowledge-graph.d.ts +78 -0
- package/dist/neo4j-knowledge-graph.d.ts.map +1 -0
- package/dist/neo4j-knowledge-graph.js +307 -0
- package/dist/neo4j-knowledge-graph.js.map +1 -0
- package/dist/neo4j-knowledge-graph.test.d.ts +2 -0
- package/dist/neo4j-knowledge-graph.test.d.ts.map +1 -0
- package/dist/neo4j-knowledge-graph.test.js +219 -0
- package/dist/neo4j-knowledge-graph.test.js.map +1 -0
- package/dist/qdrant-store.d.ts +19 -0
- package/dist/qdrant-store.d.ts.map +1 -0
- package/dist/qdrant-store.js +84 -0
- package/dist/qdrant-store.js.map +1 -0
- package/dist/types.d.ts +19 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +3 -2
- package/src/index.ts +8 -0
- package/src/neo4j-knowledge-graph.test.ts +267 -0
- package/src/neo4j-knowledge-graph.ts +357 -0
- package/src/qdrant-store.ts +114 -0
- package/src/types.ts +14 -0
package/README.md
CHANGED
|
@@ -98,20 +98,100 @@ console.log(result.graphContext); // Contesto formattato dal grafo
|
|
|
98
98
|
- Contesto arricchito con entità connesse
|
|
99
99
|
- Citazioni con path e line numbers
|
|
100
100
|
|
|
101
|
-
|
|
101
|
+
#### Knowledge Graph Persistente con Neo4j
|
|
102
|
+
|
|
103
|
+
Per uso in produzione, è disponibile un'implementazione persistente basata su Neo4j:
|
|
104
|
+
|
|
102
105
|
```typescript
|
|
103
|
-
import
|
|
106
|
+
import { Neo4jKnowledgeGraph } from "@eucode/rag";
|
|
104
107
|
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
+
const graph = new Neo4jKnowledgeGraph({
|
|
109
|
+
uri: "bolt://localhost:7687",
|
|
110
|
+
username: "neo4j",
|
|
111
|
+
password: "your-password",
|
|
112
|
+
database: "neo4j", // opzionale, default "neo4j"
|
|
113
|
+
});
|
|
108
114
|
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
getConnectedEntities(entityId: string, depth?: number): Entity[] { /* ... */ }
|
|
115
|
+
// Verifica connessione
|
|
116
|
+
const connected = await graph.verifyConnectivity();
|
|
117
|
+
if (!connected) {
|
|
118
|
+
throw new Error("Neo4j non raggiungibile");
|
|
114
119
|
}
|
|
120
|
+
|
|
121
|
+
// Inizializza schema (indici e vincoli)
|
|
122
|
+
await graph.initializeSchema();
|
|
123
|
+
|
|
124
|
+
// Aggiungi entità
|
|
125
|
+
await graph.addEntity({
|
|
126
|
+
id: "user-1",
|
|
127
|
+
name: "Alice",
|
|
128
|
+
type: "User",
|
|
129
|
+
properties: { age: 30, role: "developer" },
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
// Aggiungi relazione
|
|
133
|
+
await graph.addRelation({
|
|
134
|
+
id: "rel-1",
|
|
135
|
+
source: "user-1",
|
|
136
|
+
target: "user-2",
|
|
137
|
+
type: "KNOWS",
|
|
138
|
+
properties: { since: 2020 },
|
|
139
|
+
});
|
|
140
|
+
|
|
141
|
+
// Recupera entità
|
|
142
|
+
const user = await graph.getEntity("user-1");
|
|
143
|
+
|
|
144
|
+
// Recupera relazioni
|
|
145
|
+
const relations = await graph.getRelations("user-1");
|
|
146
|
+
|
|
147
|
+
// Recupera entità connesse (fino a profondità 2)
|
|
148
|
+
const connected = await graph.getConnectedEntities("user-1", 2);
|
|
149
|
+
|
|
150
|
+
// Cerca entità
|
|
151
|
+
const users = await graph.searchEntities({ type: "User" });
|
|
152
|
+
const alices = await graph.searchEntities({ name: "Alice" });
|
|
153
|
+
|
|
154
|
+
// Statistiche del grafo
|
|
155
|
+
const stats = await graph.getStats();
|
|
156
|
+
console.log(`Entities: ${stats.entityCount}, Relations: ${stats.relationCount}`);
|
|
157
|
+
|
|
158
|
+
// Elimina entità (e tutte le sue relazioni)
|
|
159
|
+
await graph.deleteEntity("user-1");
|
|
160
|
+
|
|
161
|
+
// Elimina relazione
|
|
162
|
+
await graph.deleteRelation("rel-1");
|
|
163
|
+
|
|
164
|
+
// Pulisci completamente il grafo
|
|
165
|
+
await graph.clear();
|
|
166
|
+
|
|
167
|
+
// Chiudi connessione
|
|
168
|
+
await graph.close();
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
**Caratteristiche Neo4j:**
|
|
172
|
+
- Persistenza su database Neo4j
|
|
173
|
+
- Indici automatici per query veloci
|
|
174
|
+
- Supporto transazioni
|
|
175
|
+
- Query Cypher per operazioni complesse
|
|
176
|
+
- Scalabilità orizzontale
|
|
177
|
+
- Backup e recovery integrati
|
|
178
|
+
|
|
179
|
+
**Requisiti:**
|
|
180
|
+
- Neo4j 5.x o superiore
|
|
181
|
+
- Driver `neo4j-driver` (incluso nelle dipendenze)
|
|
182
|
+
|
|
183
|
+
**Setup Neo4j:**
|
|
184
|
+
```bash
|
|
185
|
+
# Docker
|
|
186
|
+
docker run -d \
|
|
187
|
+
--name neo4j \
|
|
188
|
+
-p 7474:7474 -p 7687:7687 \
|
|
189
|
+
-e NEO4J_AUTH=neo4j/your-password \
|
|
190
|
+
-e NEO4J_PLUGINS='["apoc"]' \
|
|
191
|
+
neo4j:latest
|
|
192
|
+
|
|
193
|
+
# Verifica connessione
|
|
194
|
+
curl http://localhost:7474
|
|
115
195
|
```
|
|
116
196
|
|
|
117
197
|
### 4. Agentic RAG
|
package/dist/index.d.ts
CHANGED
|
@@ -8,8 +8,12 @@ export { MetricsCalculator } from "./metrics.js";
|
|
|
8
8
|
export { ABTestFramework } from "./ab-testing.js";
|
|
9
9
|
export { ParameterOptimizer } from "./optimizer.js";
|
|
10
10
|
export { SelfImprovingRag } from "./self-improving.js";
|
|
11
|
+
export { Neo4jKnowledgeGraph } from "./neo4j-knowledge-graph.js";
|
|
12
|
+
export type { Neo4jConfig } from "./neo4j-knowledge-graph.js";
|
|
13
|
+
export { QdrantVectorStore } from "./qdrant-store.js";
|
|
14
|
+
export type { QdrantFilter, QdrantSearchResult } from "./qdrant-store.js";
|
|
11
15
|
export type { LlmProvider } from "./llm-grader.js";
|
|
12
|
-
export type { Retriever, KeywordRetriever, Grader, GraderResult, QueryRewriter, CorrectiveRagOptions, RagAnswer, RagCitation, HybridSearchOptions, HybridSearchResult, Entity, Relation, KnowledgeGraph, EntityExtractor, RelationExtractor, KnowledgeGraphRagOptions, KnowledgeGraphRagResult, ReasoningStep, AgenticRagOptions, AgenticRagResult, } from "./types.js";
|
|
16
|
+
export type { Retriever, KeywordRetriever, Grader, GraderResult, QueryRewriter, CorrectiveRagOptions, RagAnswer, RagCitation, HybridSearchOptions, HybridSearchResult, Entity, Relation, KnowledgeGraph, AsyncKnowledgeGraph, EntityExtractor, RelationExtractor, KnowledgeGraphRagOptions, KnowledgeGraphRagResult, ReasoningStep, AgenticRagOptions, AgenticRagResult, } from "./types.js";
|
|
13
17
|
export type { RagFeedback, RagMetrics, ABTestResult, OptimizationSuggestion, FeedbackStorage, } from "./feedback.js";
|
|
14
18
|
export type { RagStrategyConfig, } from "./ab-testing.js";
|
|
15
19
|
export type { OptimizableParams, } from "./optimizer.js";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AACzE,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AACjF,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAG9C,OAAO,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AACzE,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AACjF,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAG9C,OAAO,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAGvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,YAAY,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAE9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,YAAY,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAE1E,YAAY,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACnD,YAAY,EACV,SAAS,EACT,gBAAgB,EAChB,MAAM,EACN,YAAY,EACZ,aAAa,EACb,oBAAoB,EACpB,SAAS,EACT,WAAW,EACX,mBAAmB,EACnB,kBAAkB,EAClB,MAAM,EACN,QAAQ,EACR,cAAc,EACd,mBAAmB,EACnB,eAAe,EACf,iBAAiB,EACjB,wBAAwB,EACxB,uBAAuB,EACvB,aAAa,EACb,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,YAAY,CAAC;AAGpB,YAAY,EACV,WAAW,EACX,UAAU,EACV,YAAY,EACZ,sBAAsB,EACtB,eAAe,GAChB,MAAM,eAAe,CAAC;AAEvB,YAAY,EACV,iBAAiB,GAClB,MAAM,iBAAiB,CAAC;AAEzB,YAAY,EACV,iBAAiB,GAClB,MAAM,gBAAgB,CAAC;AAExB,YAAY,EACV,mBAAmB,GACpB,MAAM,qBAAqB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -9,4 +9,7 @@ export { MetricsCalculator } from "./metrics.js";
|
|
|
9
9
|
export { ABTestFramework } from "./ab-testing.js";
|
|
10
10
|
export { ParameterOptimizer } from "./optimizer.js";
|
|
11
11
|
export { SelfImprovingRag } from "./self-improving.js";
|
|
12
|
+
// Fase 5: Knowledge Graph Persistente
|
|
13
|
+
export { Neo4jKnowledgeGraph } from "./neo4j-knowledge-graph.js";
|
|
14
|
+
export { QdrantVectorStore } from "./qdrant-store.js";
|
|
12
15
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AACzE,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AACjF,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,yBAAyB;AACzB,OAAO,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AACzE,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AACjF,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,yBAAyB;AACzB,OAAO,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAEvD,sCAAsC;AACtC,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAGjE,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import type { Entity, Relation, AsyncKnowledgeGraph } from "./types.js";
|
|
2
|
+
export interface Neo4jConfig {
|
|
3
|
+
uri: string;
|
|
4
|
+
username: string;
|
|
5
|
+
password: string;
|
|
6
|
+
database?: string;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Knowledge Graph persistente con Neo4j
|
|
10
|
+
*
|
|
11
|
+
* Implementa un grafo di conoscenza persistente usando Neo4j come database.
|
|
12
|
+
* Supporta operazioni CRUD per entità e relazioni, query per trovare entità connesse,
|
|
13
|
+
* e gestione delle transazioni.
|
|
14
|
+
*/
|
|
15
|
+
export declare class Neo4jKnowledgeGraph implements AsyncKnowledgeGraph {
|
|
16
|
+
private driver;
|
|
17
|
+
private database;
|
|
18
|
+
constructor(config: Neo4jConfig);
|
|
19
|
+
/**
|
|
20
|
+
* Chiude la connessione al database
|
|
21
|
+
*/
|
|
22
|
+
close(): Promise<void>;
|
|
23
|
+
/**
|
|
24
|
+
* Verifica la connessione al database
|
|
25
|
+
*/
|
|
26
|
+
verifyConnectivity(): Promise<boolean>;
|
|
27
|
+
/**
|
|
28
|
+
* Inizializza gli indici e i vincoli del database
|
|
29
|
+
*/
|
|
30
|
+
initializeSchema(): Promise<void>;
|
|
31
|
+
/**
|
|
32
|
+
* Aggiunge un'entità al grafo
|
|
33
|
+
*/
|
|
34
|
+
addEntity(entity: Entity): Promise<void>;
|
|
35
|
+
/**
|
|
36
|
+
* Aggiunge una relazione al grafo
|
|
37
|
+
*/
|
|
38
|
+
addRelation(relation: Relation): Promise<void>;
|
|
39
|
+
/**
|
|
40
|
+
* Recupera un'entità per ID
|
|
41
|
+
*/
|
|
42
|
+
getEntity(id: string): Promise<Entity | undefined>;
|
|
43
|
+
/**
|
|
44
|
+
* Recupera tutte le relazioni di un'entità
|
|
45
|
+
*/
|
|
46
|
+
getRelations(entityId: string): Promise<Relation[]>;
|
|
47
|
+
/**
|
|
48
|
+
* Recupera tutte le entità connesse a un'entità fino a una certa profondità
|
|
49
|
+
*/
|
|
50
|
+
getConnectedEntities(entityId: string, depth?: number): Promise<Entity[]>;
|
|
51
|
+
/**
|
|
52
|
+
* Cerca entità per nome o tipo
|
|
53
|
+
*/
|
|
54
|
+
searchEntities(query: {
|
|
55
|
+
name?: string;
|
|
56
|
+
type?: string;
|
|
57
|
+
}): Promise<Entity[]>;
|
|
58
|
+
/**
|
|
59
|
+
* Elimina un'entità e tutte le sue relazioni
|
|
60
|
+
*/
|
|
61
|
+
deleteEntity(entityId: string): Promise<void>;
|
|
62
|
+
/**
|
|
63
|
+
* Elimina una relazione per ID
|
|
64
|
+
*/
|
|
65
|
+
deleteRelation(relationId: string): Promise<void>;
|
|
66
|
+
/**
|
|
67
|
+
* Recupera statistiche del grafo
|
|
68
|
+
*/
|
|
69
|
+
getStats(): Promise<{
|
|
70
|
+
entityCount: number;
|
|
71
|
+
relationCount: number;
|
|
72
|
+
}>;
|
|
73
|
+
/**
|
|
74
|
+
* Pulisce completamente il grafo (elimina tutte le entità e relazioni)
|
|
75
|
+
*/
|
|
76
|
+
clear(): Promise<void>;
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=neo4j-knowledge-graph.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"neo4j-knowledge-graph.d.ts","sourceRoot":"","sources":["../src/neo4j-knowledge-graph.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAExE,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;GAMG;AACH,qBAAa,mBAAoB,YAAW,mBAAmB;IAC7D,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,QAAQ,CAAS;gBAEb,MAAM,EAAE,WAAW;IAQ/B;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAI5B;;OAEG;IACG,kBAAkB,IAAI,OAAO,CAAC,OAAO,CAAC;IAU5C;;OAEG;IACG,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC;IA+BvC;;OAEG;IACG,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAyB9C;;OAEG;IACG,WAAW,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IA2BpD;;OAEG;IACG,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IA6BxD;;OAEG;IACG,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IA6BzD;;OAEG;IACG,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,GAAE,MAAU,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IA4BlF;;OAEG;IACG,cAAc,CAAC,KAAK,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAyChF;;OAEG;IACG,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBnD;;OAEG;IACG,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBvD;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE,CAAC;IAoBzE;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAU7B"}
|
|
@@ -0,0 +1,307 @@
|
|
|
1
|
+
import neo4j from "neo4j-driver";
|
|
2
|
+
/**
|
|
3
|
+
* Knowledge Graph persistente con Neo4j
|
|
4
|
+
*
|
|
5
|
+
* Implementa un grafo di conoscenza persistente usando Neo4j come database.
|
|
6
|
+
* Supporta operazioni CRUD per entità e relazioni, query per trovare entità connesse,
|
|
7
|
+
* e gestione delle transazioni.
|
|
8
|
+
*/
|
|
9
|
+
export class Neo4jKnowledgeGraph {
|
|
10
|
+
driver;
|
|
11
|
+
database;
|
|
12
|
+
constructor(config) {
|
|
13
|
+
this.driver = neo4j.driver(config.uri, neo4j.auth.basic(config.username, config.password));
|
|
14
|
+
this.database = config.database || "neo4j";
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Chiude la connessione al database
|
|
18
|
+
*/
|
|
19
|
+
async close() {
|
|
20
|
+
await this.driver.close();
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Verifica la connessione al database
|
|
24
|
+
*/
|
|
25
|
+
async verifyConnectivity() {
|
|
26
|
+
try {
|
|
27
|
+
await this.driver.verifyConnectivity();
|
|
28
|
+
return true;
|
|
29
|
+
}
|
|
30
|
+
catch (error) {
|
|
31
|
+
console.error("Neo4j connectivity check failed:", error);
|
|
32
|
+
return false;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Inizializza gli indici e i vincoli del database
|
|
37
|
+
*/
|
|
38
|
+
async initializeSchema() {
|
|
39
|
+
const session = this.driver.session({ database: this.database });
|
|
40
|
+
try {
|
|
41
|
+
// Crea indice univoco per Entity.id
|
|
42
|
+
await session.executeWrite(async (tx) => {
|
|
43
|
+
await tx.run(`
|
|
44
|
+
CREATE INDEX entity_id_index IF NOT EXISTS
|
|
45
|
+
FOR (e:Entity) ON (e.id)
|
|
46
|
+
`);
|
|
47
|
+
});
|
|
48
|
+
// Crea indice per Entity.type
|
|
49
|
+
await session.executeWrite(async (tx) => {
|
|
50
|
+
await tx.run(`
|
|
51
|
+
CREATE INDEX entity_type_index IF NOT EXISTS
|
|
52
|
+
FOR (e:Entity) ON (e.type)
|
|
53
|
+
`);
|
|
54
|
+
});
|
|
55
|
+
// Crea indice per Relation.type
|
|
56
|
+
await session.executeWrite(async (tx) => {
|
|
57
|
+
await tx.run(`
|
|
58
|
+
CREATE INDEX relation_type_index IF NOT EXISTS
|
|
59
|
+
FOR ()-[r:RELATES_TO]-() ON (r.type)
|
|
60
|
+
`);
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
finally {
|
|
64
|
+
await session.close();
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Aggiunge un'entità al grafo
|
|
69
|
+
*/
|
|
70
|
+
async addEntity(entity) {
|
|
71
|
+
const session = this.driver.session({ database: this.database });
|
|
72
|
+
try {
|
|
73
|
+
await session.executeWrite(async (tx) => {
|
|
74
|
+
await tx.run(`
|
|
75
|
+
MERGE (e:Entity {id: $id})
|
|
76
|
+
SET e.name = $name,
|
|
77
|
+
e.type = $type,
|
|
78
|
+
e.properties = $properties,
|
|
79
|
+
e.updatedAt = datetime()
|
|
80
|
+
`, {
|
|
81
|
+
id: entity.id,
|
|
82
|
+
name: entity.name,
|
|
83
|
+
type: entity.type,
|
|
84
|
+
properties: JSON.stringify(entity.properties || {}),
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
finally {
|
|
89
|
+
await session.close();
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Aggiunge una relazione al grafo
|
|
94
|
+
*/
|
|
95
|
+
async addRelation(relation) {
|
|
96
|
+
const session = this.driver.session({ database: this.database });
|
|
97
|
+
try {
|
|
98
|
+
await session.executeWrite(async (tx) => {
|
|
99
|
+
await tx.run(`
|
|
100
|
+
MATCH (source:Entity {id: $sourceId})
|
|
101
|
+
MATCH (target:Entity {id: $targetId})
|
|
102
|
+
MERGE (source)-[r:RELATES_TO {id: $id}]->(target)
|
|
103
|
+
SET r.type = $type,
|
|
104
|
+
r.properties = $properties,
|
|
105
|
+
r.updatedAt = datetime()
|
|
106
|
+
`, {
|
|
107
|
+
id: relation.id,
|
|
108
|
+
sourceId: relation.source,
|
|
109
|
+
targetId: relation.target,
|
|
110
|
+
type: relation.type,
|
|
111
|
+
properties: JSON.stringify(relation.properties || {}),
|
|
112
|
+
});
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
finally {
|
|
116
|
+
await session.close();
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Recupera un'entità per ID
|
|
121
|
+
*/
|
|
122
|
+
async getEntity(id) {
|
|
123
|
+
const session = this.driver.session({ database: this.database });
|
|
124
|
+
try {
|
|
125
|
+
const result = await session.executeRead(async (tx) => {
|
|
126
|
+
return await tx.run(`
|
|
127
|
+
MATCH (e:Entity {id: $id})
|
|
128
|
+
RETURN e.id AS id, e.name AS name, e.type AS type, e.properties AS properties
|
|
129
|
+
`, { id });
|
|
130
|
+
});
|
|
131
|
+
if (result.records.length === 0) {
|
|
132
|
+
return undefined;
|
|
133
|
+
}
|
|
134
|
+
const record = result.records[0];
|
|
135
|
+
return {
|
|
136
|
+
id: record.get("id"),
|
|
137
|
+
name: record.get("name"),
|
|
138
|
+
type: record.get("type"),
|
|
139
|
+
properties: JSON.parse(record.get("properties") || "{}"),
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
finally {
|
|
143
|
+
await session.close();
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Recupera tutte le relazioni di un'entità
|
|
148
|
+
*/
|
|
149
|
+
async getRelations(entityId) {
|
|
150
|
+
const session = this.driver.session({ database: this.database });
|
|
151
|
+
try {
|
|
152
|
+
const result = await session.executeRead(async (tx) => {
|
|
153
|
+
return await tx.run(`
|
|
154
|
+
MATCH (e:Entity {id: $entityId})-[r:RELATES_TO]-(other:Entity)
|
|
155
|
+
RETURN r.id AS id,
|
|
156
|
+
r.type AS type,
|
|
157
|
+
r.properties AS properties,
|
|
158
|
+
startNode(r).id AS source,
|
|
159
|
+
endNode(r).id AS target
|
|
160
|
+
`, { entityId });
|
|
161
|
+
});
|
|
162
|
+
return result.records.map((record) => ({
|
|
163
|
+
id: record.get("id"),
|
|
164
|
+
type: record.get("type"),
|
|
165
|
+
properties: JSON.parse(record.get("properties") || "{}"),
|
|
166
|
+
source: record.get("source"),
|
|
167
|
+
target: record.get("target"),
|
|
168
|
+
}));
|
|
169
|
+
}
|
|
170
|
+
finally {
|
|
171
|
+
await session.close();
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Recupera tutte le entità connesse a un'entità fino a una certa profondità
|
|
176
|
+
*/
|
|
177
|
+
async getConnectedEntities(entityId, depth = 1) {
|
|
178
|
+
const session = this.driver.session({ database: this.database });
|
|
179
|
+
try {
|
|
180
|
+
const result = await session.executeRead(async (tx) => {
|
|
181
|
+
return await tx.run(`
|
|
182
|
+
MATCH path = (start:Entity {id: $entityId})-[:RELATES_TO*1..${depth}]-(connected:Entity)
|
|
183
|
+
WHERE connected.id <> $entityId
|
|
184
|
+
RETURN DISTINCT connected.id AS id,
|
|
185
|
+
connected.name AS name,
|
|
186
|
+
connected.type AS type,
|
|
187
|
+
connected.properties AS properties
|
|
188
|
+
`, { entityId });
|
|
189
|
+
});
|
|
190
|
+
return result.records.map((record) => ({
|
|
191
|
+
id: record.get("id"),
|
|
192
|
+
name: record.get("name"),
|
|
193
|
+
type: record.get("type"),
|
|
194
|
+
properties: JSON.parse(record.get("properties") || "{}"),
|
|
195
|
+
}));
|
|
196
|
+
}
|
|
197
|
+
finally {
|
|
198
|
+
await session.close();
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Cerca entità per nome o tipo
|
|
203
|
+
*/
|
|
204
|
+
async searchEntities(query) {
|
|
205
|
+
const session = this.driver.session({ database: this.database });
|
|
206
|
+
try {
|
|
207
|
+
const conditions = [];
|
|
208
|
+
const params = {};
|
|
209
|
+
if (query.name) {
|
|
210
|
+
conditions.push("e.name CONTAINS $name");
|
|
211
|
+
params.name = query.name;
|
|
212
|
+
}
|
|
213
|
+
if (query.type) {
|
|
214
|
+
conditions.push("e.type = $type");
|
|
215
|
+
params.type = query.type;
|
|
216
|
+
}
|
|
217
|
+
const whereClause = conditions.length > 0 ? `WHERE ${conditions.join(" AND ")}` : "";
|
|
218
|
+
const result = await session.executeRead(async (tx) => {
|
|
219
|
+
return await tx.run(`
|
|
220
|
+
MATCH (e:Entity)
|
|
221
|
+
${whereClause}
|
|
222
|
+
RETURN e.id AS id, e.name AS name, e.type AS type, e.properties AS properties
|
|
223
|
+
LIMIT 100
|
|
224
|
+
`, params);
|
|
225
|
+
});
|
|
226
|
+
return result.records.map((record) => ({
|
|
227
|
+
id: record.get("id"),
|
|
228
|
+
name: record.get("name"),
|
|
229
|
+
type: record.get("type"),
|
|
230
|
+
properties: JSON.parse(record.get("properties") || "{}"),
|
|
231
|
+
}));
|
|
232
|
+
}
|
|
233
|
+
finally {
|
|
234
|
+
await session.close();
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Elimina un'entità e tutte le sue relazioni
|
|
239
|
+
*/
|
|
240
|
+
async deleteEntity(entityId) {
|
|
241
|
+
const session = this.driver.session({ database: this.database });
|
|
242
|
+
try {
|
|
243
|
+
await session.executeWrite(async (tx) => {
|
|
244
|
+
await tx.run(`
|
|
245
|
+
MATCH (e:Entity {id: $entityId})
|
|
246
|
+
DETACH DELETE e
|
|
247
|
+
`, { entityId });
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
finally {
|
|
251
|
+
await session.close();
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* Elimina una relazione per ID
|
|
256
|
+
*/
|
|
257
|
+
async deleteRelation(relationId) {
|
|
258
|
+
const session = this.driver.session({ database: this.database });
|
|
259
|
+
try {
|
|
260
|
+
await session.executeWrite(async (tx) => {
|
|
261
|
+
await tx.run(`
|
|
262
|
+
MATCH ()-[r:RELATES_TO {id: $relationId}]-()
|
|
263
|
+
DELETE r
|
|
264
|
+
`, { relationId });
|
|
265
|
+
});
|
|
266
|
+
}
|
|
267
|
+
finally {
|
|
268
|
+
await session.close();
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
/**
|
|
272
|
+
* Recupera statistiche del grafo
|
|
273
|
+
*/
|
|
274
|
+
async getStats() {
|
|
275
|
+
const session = this.driver.session({ database: this.database });
|
|
276
|
+
try {
|
|
277
|
+
const entityResult = await session.executeRead(async (tx) => {
|
|
278
|
+
return await tx.run(`MATCH (e:Entity) RETURN count(e) AS count`);
|
|
279
|
+
});
|
|
280
|
+
const relationResult = await session.executeRead(async (tx) => {
|
|
281
|
+
return await tx.run(`MATCH ()-[r:RELATES_TO]-() RETURN count(r) AS count`);
|
|
282
|
+
});
|
|
283
|
+
return {
|
|
284
|
+
entityCount: entityResult.records[0].get("count").toNumber(),
|
|
285
|
+
relationCount: relationResult.records[0].get("count").toNumber(),
|
|
286
|
+
};
|
|
287
|
+
}
|
|
288
|
+
finally {
|
|
289
|
+
await session.close();
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
/**
|
|
293
|
+
* Pulisce completamente il grafo (elimina tutte le entità e relazioni)
|
|
294
|
+
*/
|
|
295
|
+
async clear() {
|
|
296
|
+
const session = this.driver.session({ database: this.database });
|
|
297
|
+
try {
|
|
298
|
+
await session.executeWrite(async (tx) => {
|
|
299
|
+
await tx.run(`MATCH (n) DETACH DELETE n`);
|
|
300
|
+
});
|
|
301
|
+
}
|
|
302
|
+
finally {
|
|
303
|
+
await session.close();
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
//# sourceMappingURL=neo4j-knowledge-graph.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"neo4j-knowledge-graph.js","sourceRoot":"","sources":["../src/neo4j-knowledge-graph.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"neo4j-knowledge-graph.test.d.ts","sourceRoot":"","sources":["../src/neo4j-knowledge-graph.test.ts"],"names":[],"mappings":""}
|