@eucoder/rag 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +90 -10
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -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/types.d.ts +19 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +3 -2
- package/src/index.ts +5 -0
- package/src/neo4j-knowledge-graph.test.ts +267 -0
- package/src/neo4j-knowledge-graph.ts +357 -0
- package/src/types.ts +14 -0
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
import { describe, it, expect, beforeAll, afterAll } from "vitest";
|
|
2
|
+
import { Neo4jKnowledgeGraph } from "./neo4j-knowledge-graph.js";
|
|
3
|
+
// Configurazione Neo4j per test (richiede Neo4j in esecuzione)
|
|
4
|
+
const testConfig = {
|
|
5
|
+
uri: process.env.NEO4J_URI || "bolt://localhost:7687",
|
|
6
|
+
username: process.env.NEO4J_USER || "neo4j",
|
|
7
|
+
password: process.env.NEO4J_PASSWORD || "test1234",
|
|
8
|
+
database: "neo4j",
|
|
9
|
+
};
|
|
10
|
+
// Verifica se Neo4j è disponibile prima di eseguire i test
|
|
11
|
+
let neo4jAvailable = false;
|
|
12
|
+
describe("Neo4jKnowledgeGraph", () => {
|
|
13
|
+
let graph;
|
|
14
|
+
beforeAll(async () => {
|
|
15
|
+
graph = new Neo4jKnowledgeGraph(testConfig);
|
|
16
|
+
// Verifica connessione con timeout
|
|
17
|
+
try {
|
|
18
|
+
const connected = await Promise.race([
|
|
19
|
+
graph.verifyConnectivity(),
|
|
20
|
+
new Promise((_, reject) => setTimeout(() => reject(new Error("Timeout")), 3000)),
|
|
21
|
+
]);
|
|
22
|
+
neo4jAvailable = connected === true;
|
|
23
|
+
if (!neo4jAvailable) {
|
|
24
|
+
console.log("⚠️ Neo4j non disponibile, test skippati");
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
// Inizializza schema
|
|
28
|
+
await graph.initializeSchema();
|
|
29
|
+
// Pulisci grafo prima dei test
|
|
30
|
+
await graph.clear();
|
|
31
|
+
}
|
|
32
|
+
catch (error) {
|
|
33
|
+
console.log("⚠️ Neo4j non raggiungibile, test skippati");
|
|
34
|
+
neo4jAvailable = false;
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
afterAll(async () => {
|
|
38
|
+
if (!neo4jAvailable)
|
|
39
|
+
return;
|
|
40
|
+
// Pulisci grafo dopo i test
|
|
41
|
+
await graph.clear();
|
|
42
|
+
await graph.close();
|
|
43
|
+
});
|
|
44
|
+
it("should add and retrieve an entity", async () => {
|
|
45
|
+
if (!neo4jAvailable) {
|
|
46
|
+
console.log("⏭️ Test skippato: Neo4j non disponibile");
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
const entity = {
|
|
50
|
+
id: "user-1",
|
|
51
|
+
name: "Alice",
|
|
52
|
+
type: "User",
|
|
53
|
+
properties: { age: 30, role: "developer" },
|
|
54
|
+
};
|
|
55
|
+
await graph.addEntity(entity);
|
|
56
|
+
const retrieved = await graph.getEntity("user-1");
|
|
57
|
+
expect(retrieved).toBeDefined();
|
|
58
|
+
expect(retrieved?.id).toBe("user-1");
|
|
59
|
+
expect(retrieved?.name).toBe("Alice");
|
|
60
|
+
expect(retrieved?.type).toBe("User");
|
|
61
|
+
expect(retrieved?.properties.age).toBe(30);
|
|
62
|
+
});
|
|
63
|
+
it("should add and retrieve a relation", async () => {
|
|
64
|
+
if (!neo4jAvailable) {
|
|
65
|
+
console.log("⏭️ Test skippato: Neo4j non disponibile");
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
const user1 = {
|
|
69
|
+
id: "user-2",
|
|
70
|
+
name: "Bob",
|
|
71
|
+
type: "User",
|
|
72
|
+
properties: {},
|
|
73
|
+
};
|
|
74
|
+
const user2 = {
|
|
75
|
+
id: "user-3",
|
|
76
|
+
name: "Charlie",
|
|
77
|
+
type: "User",
|
|
78
|
+
properties: {},
|
|
79
|
+
};
|
|
80
|
+
await graph.addEntity(user1);
|
|
81
|
+
await graph.addEntity(user2);
|
|
82
|
+
const relation = {
|
|
83
|
+
id: "rel-1",
|
|
84
|
+
source: "user-2",
|
|
85
|
+
target: "user-3",
|
|
86
|
+
type: "KNOWS",
|
|
87
|
+
properties: { since: 2020 },
|
|
88
|
+
};
|
|
89
|
+
await graph.addRelation(relation);
|
|
90
|
+
const relations = await graph.getRelations("user-2");
|
|
91
|
+
expect(relations).toHaveLength(1);
|
|
92
|
+
expect(relations[0].type).toBe("KNOWS");
|
|
93
|
+
expect(relations[0].properties.since).toBe(2020);
|
|
94
|
+
});
|
|
95
|
+
it("should retrieve connected entities", async () => {
|
|
96
|
+
if (!neo4jAvailable) {
|
|
97
|
+
console.log("⏭️ Test skippato: Neo4j non disponibile");
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
const user1 = {
|
|
101
|
+
id: "user-4",
|
|
102
|
+
name: "David",
|
|
103
|
+
type: "User",
|
|
104
|
+
properties: {},
|
|
105
|
+
};
|
|
106
|
+
const user2 = {
|
|
107
|
+
id: "user-5",
|
|
108
|
+
name: "Eve",
|
|
109
|
+
type: "User",
|
|
110
|
+
properties: {},
|
|
111
|
+
};
|
|
112
|
+
const user3 = {
|
|
113
|
+
id: "user-6",
|
|
114
|
+
name: "Frank",
|
|
115
|
+
type: "User",
|
|
116
|
+
properties: {},
|
|
117
|
+
};
|
|
118
|
+
await graph.addEntity(user1);
|
|
119
|
+
await graph.addEntity(user2);
|
|
120
|
+
await graph.addEntity(user3);
|
|
121
|
+
await graph.addRelation({
|
|
122
|
+
id: "rel-2",
|
|
123
|
+
source: "user-4",
|
|
124
|
+
target: "user-5",
|
|
125
|
+
type: "KNOWS",
|
|
126
|
+
properties: {},
|
|
127
|
+
});
|
|
128
|
+
await graph.addRelation({
|
|
129
|
+
id: "rel-3",
|
|
130
|
+
source: "user-5",
|
|
131
|
+
target: "user-6",
|
|
132
|
+
type: "KNOWS",
|
|
133
|
+
properties: {},
|
|
134
|
+
});
|
|
135
|
+
// Depth 1: solo user-5
|
|
136
|
+
const connected1 = await graph.getConnectedEntities("user-4", 1);
|
|
137
|
+
expect(connected1).toHaveLength(1);
|
|
138
|
+
expect(connected1[0].id).toBe("user-5");
|
|
139
|
+
// Depth 2: user-5 e user-6
|
|
140
|
+
const connected2 = await graph.getConnectedEntities("user-4", 2);
|
|
141
|
+
expect(connected2).toHaveLength(2);
|
|
142
|
+
expect(connected2.map((e) => e.id)).toContain("user-5");
|
|
143
|
+
expect(connected2.map((e) => e.id)).toContain("user-6");
|
|
144
|
+
});
|
|
145
|
+
it("should search entities by name", async () => {
|
|
146
|
+
if (!neo4jAvailable) {
|
|
147
|
+
console.log("⏭️ Test skippato: Neo4j non disponibile");
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
const results = await graph.searchEntities({ name: "Alice" });
|
|
151
|
+
expect(results.length).toBeGreaterThan(0);
|
|
152
|
+
expect(results.some((e) => e.name === "Alice")).toBe(true);
|
|
153
|
+
});
|
|
154
|
+
it("should search entities by type", async () => {
|
|
155
|
+
if (!neo4jAvailable) {
|
|
156
|
+
console.log("⏭️ Test skippato: Neo4j non disponibile");
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
const results = await graph.searchEntities({ type: "User" });
|
|
160
|
+
expect(results.length).toBeGreaterThan(0);
|
|
161
|
+
expect(results.every((e) => e.type === "User")).toBe(true);
|
|
162
|
+
});
|
|
163
|
+
it("should delete an entity and its relations", async () => {
|
|
164
|
+
if (!neo4jAvailable) {
|
|
165
|
+
console.log("⏭️ Test skippato: Neo4j non disponibile");
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
const entity = {
|
|
169
|
+
id: "user-to-delete",
|
|
170
|
+
name: "ToDelete",
|
|
171
|
+
type: "User",
|
|
172
|
+
properties: {},
|
|
173
|
+
};
|
|
174
|
+
await graph.addEntity(entity);
|
|
175
|
+
await graph.deleteEntity("user-to-delete");
|
|
176
|
+
const retrieved = await graph.getEntity("user-to-delete");
|
|
177
|
+
expect(retrieved).toBeUndefined();
|
|
178
|
+
});
|
|
179
|
+
it("should delete a relation", async () => {
|
|
180
|
+
if (!neo4jAvailable) {
|
|
181
|
+
console.log("⏭️ Test skippato: Neo4j non disponibile");
|
|
182
|
+
return;
|
|
183
|
+
}
|
|
184
|
+
const user1 = {
|
|
185
|
+
id: "user-7",
|
|
186
|
+
name: "Grace",
|
|
187
|
+
type: "User",
|
|
188
|
+
properties: {},
|
|
189
|
+
};
|
|
190
|
+
const user2 = {
|
|
191
|
+
id: "user-8",
|
|
192
|
+
name: "Henry",
|
|
193
|
+
type: "User",
|
|
194
|
+
properties: {},
|
|
195
|
+
};
|
|
196
|
+
await graph.addEntity(user1);
|
|
197
|
+
await graph.addEntity(user2);
|
|
198
|
+
await graph.addRelation({
|
|
199
|
+
id: "rel-to-delete",
|
|
200
|
+
source: "user-7",
|
|
201
|
+
target: "user-8",
|
|
202
|
+
type: "KNOWS",
|
|
203
|
+
properties: {},
|
|
204
|
+
});
|
|
205
|
+
await graph.deleteRelation("rel-to-delete");
|
|
206
|
+
const relations = await graph.getRelations("user-7");
|
|
207
|
+
expect(relations.find((r) => r.id === "rel-to-delete")).toBeUndefined();
|
|
208
|
+
});
|
|
209
|
+
it("should get graph statistics", async () => {
|
|
210
|
+
if (!neo4jAvailable) {
|
|
211
|
+
console.log("⏭️ Test skippato: Neo4j non disponibile");
|
|
212
|
+
return;
|
|
213
|
+
}
|
|
214
|
+
const stats = await graph.getStats();
|
|
215
|
+
expect(stats.entityCount).toBeGreaterThan(0);
|
|
216
|
+
expect(stats.relationCount).toBeGreaterThan(0);
|
|
217
|
+
});
|
|
218
|
+
});
|
|
219
|
+
//# sourceMappingURL=neo4j-knowledge-graph.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"neo4j-knowledge-graph.test.js","sourceRoot":"","sources":["../src/neo4j-knowledge-graph.test.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -72,6 +72,25 @@ export interface KnowledgeGraph {
|
|
|
72
72
|
getRelations(entityId: string): Relation[];
|
|
73
73
|
getConnectedEntities(entityId: string, depth?: number): Entity[];
|
|
74
74
|
}
|
|
75
|
+
export interface AsyncKnowledgeGraph {
|
|
76
|
+
addEntity(entity: Entity): Promise<void>;
|
|
77
|
+
addRelation(relation: Relation): Promise<void>;
|
|
78
|
+
getEntity(id: string): Promise<Entity | undefined>;
|
|
79
|
+
getRelations(entityId: string): Promise<Relation[]>;
|
|
80
|
+
getConnectedEntities(entityId: string, depth?: number): Promise<Entity[]>;
|
|
81
|
+
searchEntities(query: {
|
|
82
|
+
name?: string;
|
|
83
|
+
type?: string;
|
|
84
|
+
}): Promise<Entity[]>;
|
|
85
|
+
deleteEntity(entityId: string): Promise<void>;
|
|
86
|
+
deleteRelation(relationId: string): Promise<void>;
|
|
87
|
+
getStats(): Promise<{
|
|
88
|
+
entityCount: number;
|
|
89
|
+
relationCount: number;
|
|
90
|
+
}>;
|
|
91
|
+
clear(): Promise<void>;
|
|
92
|
+
close(): Promise<void>;
|
|
93
|
+
}
|
|
75
94
|
export interface EntityExtractor {
|
|
76
95
|
extract(text: string): Promise<Entity[]>;
|
|
77
96
|
}
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@eucoder/rag",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"description": "Advanced RAG module with Corrective RAG, Hybrid Search, Knowledge Graph, Agentic RAG, and Self-Improving capabilities",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -32,7 +32,8 @@
|
|
|
32
32
|
"license": "Apache-2.0",
|
|
33
33
|
"dependencies": {
|
|
34
34
|
"@eucode/indexer": "workspace:*",
|
|
35
|
-
"@eucode/llm": "workspace:*"
|
|
35
|
+
"@eucode/llm": "workspace:*",
|
|
36
|
+
"neo4j-driver": "^6.0.1"
|
|
36
37
|
},
|
|
37
38
|
"devDependencies": {
|
|
38
39
|
"@types/node": "^22.10.5",
|
package/src/index.ts
CHANGED
|
@@ -11,6 +11,10 @@ export { ABTestFramework } from "./ab-testing.js";
|
|
|
11
11
|
export { ParameterOptimizer } from "./optimizer.js";
|
|
12
12
|
export { SelfImprovingRag } from "./self-improving.js";
|
|
13
13
|
|
|
14
|
+
// Fase 5: Knowledge Graph Persistente
|
|
15
|
+
export { Neo4jKnowledgeGraph } from "./neo4j-knowledge-graph.js";
|
|
16
|
+
export type { Neo4jConfig } from "./neo4j-knowledge-graph.js";
|
|
17
|
+
|
|
14
18
|
export type { LlmProvider } from "./llm-grader.js";
|
|
15
19
|
export type {
|
|
16
20
|
Retriever,
|
|
@@ -26,6 +30,7 @@ export type {
|
|
|
26
30
|
Entity,
|
|
27
31
|
Relation,
|
|
28
32
|
KnowledgeGraph,
|
|
33
|
+
AsyncKnowledgeGraph,
|
|
29
34
|
EntityExtractor,
|
|
30
35
|
RelationExtractor,
|
|
31
36
|
KnowledgeGraphRagOptions,
|
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
import { describe, it, expect, beforeAll, afterAll } from "vitest";
|
|
2
|
+
import { Neo4jKnowledgeGraph } from "./neo4j-knowledge-graph.js";
|
|
3
|
+
import type { Neo4jConfig } from "./neo4j-knowledge-graph.js";
|
|
4
|
+
|
|
5
|
+
// Configurazione Neo4j per test (richiede Neo4j in esecuzione)
|
|
6
|
+
const testConfig: Neo4jConfig = {
|
|
7
|
+
uri: process.env.NEO4J_URI || "bolt://localhost:7687",
|
|
8
|
+
username: process.env.NEO4J_USER || "neo4j",
|
|
9
|
+
password: process.env.NEO4J_PASSWORD || "test1234",
|
|
10
|
+
database: "neo4j",
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
// Verifica se Neo4j è disponibile prima di eseguire i test
|
|
14
|
+
let neo4jAvailable = false;
|
|
15
|
+
|
|
16
|
+
describe("Neo4jKnowledgeGraph", () => {
|
|
17
|
+
let graph: Neo4jKnowledgeGraph;
|
|
18
|
+
|
|
19
|
+
beforeAll(async () => {
|
|
20
|
+
graph = new Neo4jKnowledgeGraph(testConfig);
|
|
21
|
+
|
|
22
|
+
// Verifica connessione con timeout
|
|
23
|
+
try {
|
|
24
|
+
const connected = await Promise.race([
|
|
25
|
+
graph.verifyConnectivity(),
|
|
26
|
+
new Promise<boolean>((_, reject) =>
|
|
27
|
+
setTimeout(() => reject(new Error("Timeout")), 3000)
|
|
28
|
+
),
|
|
29
|
+
]);
|
|
30
|
+
|
|
31
|
+
neo4jAvailable = connected === true;
|
|
32
|
+
|
|
33
|
+
if (!neo4jAvailable) {
|
|
34
|
+
console.log("⚠️ Neo4j non disponibile, test skippati");
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// Inizializza schema
|
|
39
|
+
await graph.initializeSchema();
|
|
40
|
+
|
|
41
|
+
// Pulisci grafo prima dei test
|
|
42
|
+
await graph.clear();
|
|
43
|
+
} catch (error) {
|
|
44
|
+
console.log("⚠️ Neo4j non raggiungibile, test skippati");
|
|
45
|
+
neo4jAvailable = false;
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
afterAll(async () => {
|
|
50
|
+
if (!neo4jAvailable) return;
|
|
51
|
+
|
|
52
|
+
// Pulisci grafo dopo i test
|
|
53
|
+
await graph.clear();
|
|
54
|
+
await graph.close();
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
it("should add and retrieve an entity", async () => {
|
|
58
|
+
if (!neo4jAvailable) {
|
|
59
|
+
console.log("⏭️ Test skippato: Neo4j non disponibile");
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
const entity = {
|
|
64
|
+
id: "user-1",
|
|
65
|
+
name: "Alice",
|
|
66
|
+
type: "User",
|
|
67
|
+
properties: { age: 30, role: "developer" },
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
await graph.addEntity(entity);
|
|
71
|
+
const retrieved = await graph.getEntity("user-1");
|
|
72
|
+
|
|
73
|
+
expect(retrieved).toBeDefined();
|
|
74
|
+
expect(retrieved?.id).toBe("user-1");
|
|
75
|
+
expect(retrieved?.name).toBe("Alice");
|
|
76
|
+
expect(retrieved?.type).toBe("User");
|
|
77
|
+
expect(retrieved?.properties.age).toBe(30);
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
it("should add and retrieve a relation", async () => {
|
|
81
|
+
if (!neo4jAvailable) {
|
|
82
|
+
console.log("⏭️ Test skippato: Neo4j non disponibile");
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
const user1 = {
|
|
87
|
+
id: "user-2",
|
|
88
|
+
name: "Bob",
|
|
89
|
+
type: "User",
|
|
90
|
+
properties: {},
|
|
91
|
+
};
|
|
92
|
+
|
|
93
|
+
const user2 = {
|
|
94
|
+
id: "user-3",
|
|
95
|
+
name: "Charlie",
|
|
96
|
+
type: "User",
|
|
97
|
+
properties: {},
|
|
98
|
+
};
|
|
99
|
+
|
|
100
|
+
await graph.addEntity(user1);
|
|
101
|
+
await graph.addEntity(user2);
|
|
102
|
+
|
|
103
|
+
const relation = {
|
|
104
|
+
id: "rel-1",
|
|
105
|
+
source: "user-2",
|
|
106
|
+
target: "user-3",
|
|
107
|
+
type: "KNOWS",
|
|
108
|
+
properties: { since: 2020 },
|
|
109
|
+
};
|
|
110
|
+
|
|
111
|
+
await graph.addRelation(relation);
|
|
112
|
+
|
|
113
|
+
const relations = await graph.getRelations("user-2");
|
|
114
|
+
expect(relations).toHaveLength(1);
|
|
115
|
+
expect(relations[0].type).toBe("KNOWS");
|
|
116
|
+
expect(relations[0].properties.since).toBe(2020);
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
it("should retrieve connected entities", async () => {
|
|
120
|
+
if (!neo4jAvailable) {
|
|
121
|
+
console.log("⏭️ Test skippato: Neo4j non disponibile");
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
const user1 = {
|
|
126
|
+
id: "user-4",
|
|
127
|
+
name: "David",
|
|
128
|
+
type: "User",
|
|
129
|
+
properties: {},
|
|
130
|
+
};
|
|
131
|
+
|
|
132
|
+
const user2 = {
|
|
133
|
+
id: "user-5",
|
|
134
|
+
name: "Eve",
|
|
135
|
+
type: "User",
|
|
136
|
+
properties: {},
|
|
137
|
+
};
|
|
138
|
+
|
|
139
|
+
const user3 = {
|
|
140
|
+
id: "user-6",
|
|
141
|
+
name: "Frank",
|
|
142
|
+
type: "User",
|
|
143
|
+
properties: {},
|
|
144
|
+
};
|
|
145
|
+
|
|
146
|
+
await graph.addEntity(user1);
|
|
147
|
+
await graph.addEntity(user2);
|
|
148
|
+
await graph.addEntity(user3);
|
|
149
|
+
|
|
150
|
+
await graph.addRelation({
|
|
151
|
+
id: "rel-2",
|
|
152
|
+
source: "user-4",
|
|
153
|
+
target: "user-5",
|
|
154
|
+
type: "KNOWS",
|
|
155
|
+
properties: {},
|
|
156
|
+
});
|
|
157
|
+
|
|
158
|
+
await graph.addRelation({
|
|
159
|
+
id: "rel-3",
|
|
160
|
+
source: "user-5",
|
|
161
|
+
target: "user-6",
|
|
162
|
+
type: "KNOWS",
|
|
163
|
+
properties: {},
|
|
164
|
+
});
|
|
165
|
+
|
|
166
|
+
// Depth 1: solo user-5
|
|
167
|
+
const connected1 = await graph.getConnectedEntities("user-4", 1);
|
|
168
|
+
expect(connected1).toHaveLength(1);
|
|
169
|
+
expect(connected1[0].id).toBe("user-5");
|
|
170
|
+
|
|
171
|
+
// Depth 2: user-5 e user-6
|
|
172
|
+
const connected2 = await graph.getConnectedEntities("user-4", 2);
|
|
173
|
+
expect(connected2).toHaveLength(2);
|
|
174
|
+
expect(connected2.map((e) => e.id)).toContain("user-5");
|
|
175
|
+
expect(connected2.map((e) => e.id)).toContain("user-6");
|
|
176
|
+
});
|
|
177
|
+
|
|
178
|
+
it("should search entities by name", async () => {
|
|
179
|
+
if (!neo4jAvailable) {
|
|
180
|
+
console.log("⏭️ Test skippato: Neo4j non disponibile");
|
|
181
|
+
return;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
const results = await graph.searchEntities({ name: "Alice" });
|
|
185
|
+
expect(results.length).toBeGreaterThan(0);
|
|
186
|
+
expect(results.some((e) => e.name === "Alice")).toBe(true);
|
|
187
|
+
});
|
|
188
|
+
|
|
189
|
+
it("should search entities by type", async () => {
|
|
190
|
+
if (!neo4jAvailable) {
|
|
191
|
+
console.log("⏭️ Test skippato: Neo4j non disponibile");
|
|
192
|
+
return;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
const results = await graph.searchEntities({ type: "User" });
|
|
196
|
+
expect(results.length).toBeGreaterThan(0);
|
|
197
|
+
expect(results.every((e) => e.type === "User")).toBe(true);
|
|
198
|
+
});
|
|
199
|
+
|
|
200
|
+
it("should delete an entity and its relations", async () => {
|
|
201
|
+
if (!neo4jAvailable) {
|
|
202
|
+
console.log("⏭️ Test skippato: Neo4j non disponibile");
|
|
203
|
+
return;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
const entity = {
|
|
207
|
+
id: "user-to-delete",
|
|
208
|
+
name: "ToDelete",
|
|
209
|
+
type: "User",
|
|
210
|
+
properties: {},
|
|
211
|
+
};
|
|
212
|
+
|
|
213
|
+
await graph.addEntity(entity);
|
|
214
|
+
await graph.deleteEntity("user-to-delete");
|
|
215
|
+
|
|
216
|
+
const retrieved = await graph.getEntity("user-to-delete");
|
|
217
|
+
expect(retrieved).toBeUndefined();
|
|
218
|
+
});
|
|
219
|
+
|
|
220
|
+
it("should delete a relation", async () => {
|
|
221
|
+
if (!neo4jAvailable) {
|
|
222
|
+
console.log("⏭️ Test skippato: Neo4j non disponibile");
|
|
223
|
+
return;
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
const user1 = {
|
|
227
|
+
id: "user-7",
|
|
228
|
+
name: "Grace",
|
|
229
|
+
type: "User",
|
|
230
|
+
properties: {},
|
|
231
|
+
};
|
|
232
|
+
|
|
233
|
+
const user2 = {
|
|
234
|
+
id: "user-8",
|
|
235
|
+
name: "Henry",
|
|
236
|
+
type: "User",
|
|
237
|
+
properties: {},
|
|
238
|
+
};
|
|
239
|
+
|
|
240
|
+
await graph.addEntity(user1);
|
|
241
|
+
await graph.addEntity(user2);
|
|
242
|
+
|
|
243
|
+
await graph.addRelation({
|
|
244
|
+
id: "rel-to-delete",
|
|
245
|
+
source: "user-7",
|
|
246
|
+
target: "user-8",
|
|
247
|
+
type: "KNOWS",
|
|
248
|
+
properties: {},
|
|
249
|
+
});
|
|
250
|
+
|
|
251
|
+
await graph.deleteRelation("rel-to-delete");
|
|
252
|
+
|
|
253
|
+
const relations = await graph.getRelations("user-7");
|
|
254
|
+
expect(relations.find((r) => r.id === "rel-to-delete")).toBeUndefined();
|
|
255
|
+
});
|
|
256
|
+
|
|
257
|
+
it("should get graph statistics", async () => {
|
|
258
|
+
if (!neo4jAvailable) {
|
|
259
|
+
console.log("⏭️ Test skippato: Neo4j non disponibile");
|
|
260
|
+
return;
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
const stats = await graph.getStats();
|
|
264
|
+
expect(stats.entityCount).toBeGreaterThan(0);
|
|
265
|
+
expect(stats.relationCount).toBeGreaterThan(0);
|
|
266
|
+
});
|
|
267
|
+
});
|