@carlonicora/nestjs-neo4jsonapi 1.4.1 → 1.5.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/dist/agents/agents.modules.d.ts.map +1 -1
- package/dist/agents/agents.modules.js +21 -2
- package/dist/agents/agents.modules.js.map +1 -1
- package/dist/agents/community.detector/community.detector.module.d.ts +3 -0
- package/dist/agents/community.detector/community.detector.module.d.ts.map +1 -0
- package/dist/agents/community.detector/community.detector.module.js +25 -0
- package/dist/agents/community.detector/community.detector.module.js.map +1 -0
- package/dist/agents/community.detector/services/community.detector.service.d.ts +63 -0
- package/dist/agents/community.detector/services/community.detector.service.d.ts.map +1 -0
- package/dist/agents/community.detector/services/community.detector.service.js +343 -0
- package/dist/agents/community.detector/services/community.detector.service.js.map +1 -0
- package/dist/agents/community.summariser/community.summariser.module.d.ts +3 -0
- package/dist/agents/community.summariser/community.summariser.module.d.ts.map +1 -0
- package/dist/agents/community.summariser/community.summariser.module.js +33 -0
- package/dist/agents/community.summariser/community.summariser.module.js.map +1 -0
- package/dist/agents/community.summariser/processors/community.summariser.processor.d.ts +21 -0
- package/dist/agents/community.summariser/processors/community.summariser.processor.d.ts.map +1 -0
- package/dist/agents/community.summariser/processors/community.summariser.processor.js +70 -0
- package/dist/agents/community.summariser/processors/community.summariser.processor.js.map +1 -0
- package/dist/agents/community.summariser/services/community.summariser.service.d.ts +26 -0
- package/dist/agents/community.summariser/services/community.summariser.service.d.ts.map +1 -0
- package/dist/agents/community.summariser/services/community.summariser.service.js +155 -0
- package/dist/agents/community.summariser/services/community.summariser.service.js.map +1 -0
- package/dist/agents/drift/contexts/drift.context.d.ts +56 -0
- package/dist/agents/drift/contexts/drift.context.d.ts.map +1 -0
- package/dist/agents/drift/contexts/drift.context.js +91 -0
- package/dist/agents/drift/contexts/drift.context.js.map +1 -0
- package/dist/agents/drift/drift.module.d.ts +3 -0
- package/dist/agents/drift/drift.module.d.ts.map +1 -0
- package/dist/agents/drift/drift.module.js +44 -0
- package/dist/agents/drift/drift.module.js.map +1 -0
- package/dist/agents/drift/nodes/community.search.node.service.d.ts +12 -0
- package/dist/agents/drift/nodes/community.search.node.service.d.ts.map +1 -0
- package/dist/agents/drift/nodes/community.search.node.service.js +57 -0
- package/dist/agents/drift/nodes/community.search.node.service.js.map +1 -0
- package/dist/agents/drift/nodes/followup.node.service.d.ts +28 -0
- package/dist/agents/drift/nodes/followup.node.service.d.ts.map +1 -0
- package/dist/agents/drift/nodes/followup.node.service.js +174 -0
- package/dist/agents/drift/nodes/followup.node.service.js.map +1 -0
- package/dist/agents/drift/nodes/hyde.node.service.d.ts +21 -0
- package/dist/agents/drift/nodes/hyde.node.service.d.ts.map +1 -0
- package/dist/agents/drift/nodes/hyde.node.service.js +114 -0
- package/dist/agents/drift/nodes/hyde.node.service.js.map +1 -0
- package/dist/agents/drift/nodes/primer.answer.node.service.d.ts +17 -0
- package/dist/agents/drift/nodes/primer.answer.node.service.d.ts.map +1 -0
- package/dist/agents/drift/nodes/primer.answer.node.service.js +108 -0
- package/dist/agents/drift/nodes/primer.answer.node.service.js.map +1 -0
- package/dist/agents/drift/nodes/synthesis.node.service.d.ts +17 -0
- package/dist/agents/drift/nodes/synthesis.node.service.d.ts.map +1 -0
- package/dist/agents/drift/nodes/synthesis.node.service.js +105 -0
- package/dist/agents/drift/nodes/synthesis.node.service.js.map +1 -0
- package/dist/agents/drift/services/drift.migration.service.d.ts +47 -0
- package/dist/agents/drift/services/drift.migration.service.d.ts.map +1 -0
- package/dist/agents/drift/services/drift.migration.service.js +114 -0
- package/dist/agents/drift/services/drift.migration.service.js.map +1 -0
- package/dist/agents/drift/services/drift.search.service.d.ts +52 -0
- package/dist/agents/drift/services/drift.search.service.d.ts.map +1 -0
- package/dist/agents/drift/services/drift.search.service.js +185 -0
- package/dist/agents/drift/services/drift.search.service.js.map +1 -0
- package/dist/agents/graph.creator/interfaces/chunk.analysis.interface.d.ts +4 -0
- package/dist/agents/graph.creator/interfaces/chunk.analysis.interface.d.ts.map +1 -1
- package/dist/agents/graph.creator/services/graph.creator.service.d.ts +1 -1
- package/dist/agents/graph.creator/services/graph.creator.service.d.ts.map +1 -1
- package/dist/agents/graph.creator/services/graph.creator.service.js +43 -0
- package/dist/agents/graph.creator/services/graph.creator.service.js.map +1 -1
- package/dist/agents/index.d.ts +8 -0
- package/dist/agents/index.d.ts.map +1 -1
- package/dist/agents/index.js +18 -1
- package/dist/agents/index.js.map +1 -1
- package/dist/agents/responder/contexts/responder.context.d.ts +3 -0
- package/dist/agents/responder/contexts/responder.context.d.ts.map +1 -1
- package/dist/agents/responder/contexts/responder.context.js +8 -0
- package/dist/agents/responder/contexts/responder.context.js.map +1 -1
- package/dist/agents/responder/factories/responder.context.factory.d.ts +1 -0
- package/dist/agents/responder/factories/responder.context.factory.d.ts.map +1 -1
- package/dist/agents/responder/factories/responder.context.factory.js +2 -0
- package/dist/agents/responder/factories/responder.context.factory.js.map +1 -1
- package/dist/agents/responder/nodes/responder.answer.node.service.d.ts +22 -0
- package/dist/agents/responder/nodes/responder.answer.node.service.d.ts.map +1 -1
- package/dist/agents/responder/nodes/responder.answer.node.service.js +155 -0
- package/dist/agents/responder/nodes/responder.answer.node.service.js.map +1 -1
- package/dist/agents/responder/responder.module.d.ts.map +1 -1
- package/dist/agents/responder/responder.module.js +2 -1
- package/dist/agents/responder/responder.module.js.map +1 -1
- package/dist/agents/responder/services/responder.service.d.ts +17 -1
- package/dist/agents/responder/services/responder.service.d.ts.map +1 -1
- package/dist/agents/responder/services/responder.service.js +49 -5
- package/dist/agents/responder/services/responder.service.js.map +1 -1
- package/dist/common/interfaces/agents/graph.creator.interface.d.ts +4 -0
- package/dist/common/interfaces/agents/graph.creator.interface.d.ts.map +1 -1
- package/dist/config/enums/queue.id.d.ts +2 -1
- package/dist/config/enums/queue.id.d.ts.map +1 -1
- package/dist/config/enums/queue.id.js +1 -0
- package/dist/config/enums/queue.id.js.map +1 -1
- package/dist/config/interfaces/config.prompts.interface.d.ts +5 -0
- package/dist/config/interfaces/config.prompts.interface.d.ts.map +1 -1
- package/dist/foundations/chunk/services/chunk.service.d.ts.map +1 -1
- package/dist/foundations/chunk/services/chunk.service.js +8 -0
- package/dist/foundations/chunk/services/chunk.service.js.map +1 -1
- package/dist/foundations/community/community.module.d.ts +5 -0
- package/dist/foundations/community/community.module.d.ts.map +1 -0
- package/dist/foundations/community/community.module.js +29 -0
- package/dist/foundations/community/community.module.js.map +1 -0
- package/dist/foundations/community/entities/community.entity.d.ts +18 -0
- package/dist/foundations/community/entities/community.entity.d.ts.map +1 -0
- package/dist/foundations/community/entities/community.entity.js +3 -0
- package/dist/foundations/community/entities/community.entity.js.map +1 -0
- package/dist/foundations/community/entities/community.map.d.ts +8 -0
- package/dist/foundations/community/entities/community.map.d.ts.map +1 -0
- package/dist/foundations/community/entities/community.map.js +23 -0
- package/dist/foundations/community/entities/community.map.js.map +1 -0
- package/dist/foundations/community/entities/community.meta.d.ts +3 -0
- package/dist/foundations/community/entities/community.meta.d.ts.map +1 -0
- package/dist/foundations/community/entities/community.meta.js +10 -0
- package/dist/foundations/community/entities/community.meta.js.map +1 -0
- package/dist/foundations/community/entities/community.model.d.ts +4 -0
- package/dist/foundations/community/entities/community.model.d.ts.map +1 -0
- package/dist/foundations/community/entities/community.model.js +15 -0
- package/dist/foundations/community/entities/community.model.js.map +1 -0
- package/dist/foundations/community/repositories/community.repository.d.ts +138 -0
- package/dist/foundations/community/repositories/community.repository.d.ts.map +1 -0
- package/dist/foundations/community/repositories/community.repository.js +446 -0
- package/dist/foundations/community/repositories/community.repository.js.map +1 -0
- package/dist/foundations/community/services/community.service.d.ts +8 -0
- package/dist/foundations/community/services/community.service.d.ts.map +1 -0
- package/dist/foundations/community/services/community.service.js +28 -0
- package/dist/foundations/community/services/community.service.js.map +1 -0
- package/dist/foundations/keyconcept/entities/key.concept.entity.d.ts +1 -0
- package/dist/foundations/keyconcept/entities/key.concept.entity.d.ts.map +1 -1
- package/dist/foundations/keyconcept/entities/key.concept.map.d.ts.map +1 -1
- package/dist/foundations/keyconcept/entities/key.concept.map.js +1 -0
- package/dist/foundations/keyconcept/entities/key.concept.map.js.map +1 -1
- package/dist/foundations/keyconcept/repositories/keyconcept.repository.d.ts +13 -2
- package/dist/foundations/keyconcept/repositories/keyconcept.repository.d.ts.map +1 -1
- package/dist/foundations/keyconcept/repositories/keyconcept.repository.js +22 -2
- package/dist/foundations/keyconcept/repositories/keyconcept.repository.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,446 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.CommunityRepository = void 0;
|
|
13
|
+
const common_1 = require("@nestjs/common");
|
|
14
|
+
const crypto_1 = require("crypto");
|
|
15
|
+
const core_1 = require("../../../core");
|
|
16
|
+
const neo4j_service_1 = require("../../../core/neo4j/services/neo4j.service");
|
|
17
|
+
const security_service_1 = require("../../../core/security/services/security.service");
|
|
18
|
+
const community_model_1 = require("../entities/community.model");
|
|
19
|
+
let CommunityRepository = class CommunityRepository {
|
|
20
|
+
constructor(neo4j, embedderService, modelService, securityService) {
|
|
21
|
+
this.neo4j = neo4j;
|
|
22
|
+
this.embedderService = embedderService;
|
|
23
|
+
this.modelService = modelService;
|
|
24
|
+
this.securityService = securityService;
|
|
25
|
+
}
|
|
26
|
+
async onModuleInit() {
|
|
27
|
+
await this.neo4j.writeOne({
|
|
28
|
+
query: `CREATE CONSTRAINT community_id IF NOT EXISTS FOR (community:Community) REQUIRE community.id IS UNIQUE`,
|
|
29
|
+
});
|
|
30
|
+
const dimensions = this.modelService.getEmbedderDimensions();
|
|
31
|
+
await this.neo4j.writeOne({
|
|
32
|
+
query: `
|
|
33
|
+
CREATE VECTOR INDEX communities IF NOT EXISTS
|
|
34
|
+
FOR (community:Community)
|
|
35
|
+
ON community.embedding
|
|
36
|
+
OPTIONS { indexConfig: {
|
|
37
|
+
\`vector.dimensions\`: ${dimensions},
|
|
38
|
+
\`vector.similarity_function\`: 'cosine'
|
|
39
|
+
}};
|
|
40
|
+
`,
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Create a new community node with BELONGS_TO company relationship
|
|
45
|
+
* Uses companyId from CLS (current request context)
|
|
46
|
+
*/
|
|
47
|
+
async createCommunity(params) {
|
|
48
|
+
const query = this.neo4j.initQuery({ serialiser: community_model_1.CommunityModel });
|
|
49
|
+
const id = (0, crypto_1.randomUUID)();
|
|
50
|
+
query.queryParams = {
|
|
51
|
+
...query.queryParams,
|
|
52
|
+
id,
|
|
53
|
+
name: params.name,
|
|
54
|
+
level: params.level,
|
|
55
|
+
memberCount: params.memberCount,
|
|
56
|
+
rating: params.rating ?? 0,
|
|
57
|
+
};
|
|
58
|
+
query.query += `
|
|
59
|
+
CREATE (community:Community {
|
|
60
|
+
id: $id,
|
|
61
|
+
name: $name,
|
|
62
|
+
level: $level,
|
|
63
|
+
memberCount: $memberCount,
|
|
64
|
+
rating: $rating,
|
|
65
|
+
isStale: true,
|
|
66
|
+
staleSince: datetime(),
|
|
67
|
+
createdAt: datetime(),
|
|
68
|
+
updatedAt: datetime()
|
|
69
|
+
})
|
|
70
|
+
CREATE (community)-[:BELONGS_TO]->(company)
|
|
71
|
+
RETURN community
|
|
72
|
+
`;
|
|
73
|
+
return this.neo4j.writeOne(query);
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Update community members (HAS_MEMBER relationships to KeyConcepts)
|
|
77
|
+
*/
|
|
78
|
+
async updateCommunityMembers(params) {
|
|
79
|
+
// First, remove existing HAS_MEMBER relationships
|
|
80
|
+
const removeQuery = this.neo4j.initQuery();
|
|
81
|
+
removeQuery.queryParams = { ...removeQuery.queryParams, communityId: params.communityId };
|
|
82
|
+
removeQuery.query += `
|
|
83
|
+
MATCH (community:Community {id: $communityId})-[r:HAS_MEMBER]->()
|
|
84
|
+
DELETE r
|
|
85
|
+
`;
|
|
86
|
+
await this.neo4j.writeOne(removeQuery);
|
|
87
|
+
// Then, create new HAS_MEMBER relationships
|
|
88
|
+
if (params.keyConceptIds.length > 0) {
|
|
89
|
+
const addQuery = this.neo4j.initQuery();
|
|
90
|
+
addQuery.queryParams = {
|
|
91
|
+
...addQuery.queryParams,
|
|
92
|
+
communityId: params.communityId,
|
|
93
|
+
keyConceptIds: params.keyConceptIds,
|
|
94
|
+
};
|
|
95
|
+
addQuery.query += `
|
|
96
|
+
MATCH (community:Community {id: $communityId})
|
|
97
|
+
MATCH (keyconcept:KeyConcept) WHERE keyconcept.id IN $keyConceptIds
|
|
98
|
+
MERGE (community)-[:HAS_MEMBER]->(keyconcept)
|
|
99
|
+
`;
|
|
100
|
+
await this.neo4j.writeOne(addQuery);
|
|
101
|
+
// Update memberCount
|
|
102
|
+
const updateCountQuery = this.neo4j.initQuery();
|
|
103
|
+
updateCountQuery.queryParams = {
|
|
104
|
+
...updateCountQuery.queryParams,
|
|
105
|
+
communityId: params.communityId,
|
|
106
|
+
memberCount: params.keyConceptIds.length,
|
|
107
|
+
};
|
|
108
|
+
updateCountQuery.query += `
|
|
109
|
+
MATCH (community:Community {id: $communityId})
|
|
110
|
+
SET community.memberCount = $memberCount
|
|
111
|
+
`;
|
|
112
|
+
await this.neo4j.writeOne(updateCountQuery);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Set PARENT_OF relationship between communities (hierarchy)
|
|
117
|
+
*/
|
|
118
|
+
async setParentCommunity(params) {
|
|
119
|
+
const query = this.neo4j.initQuery();
|
|
120
|
+
query.queryParams = {
|
|
121
|
+
...query.queryParams,
|
|
122
|
+
childCommunityId: params.childCommunityId,
|
|
123
|
+
parentCommunityId: params.parentCommunityId,
|
|
124
|
+
};
|
|
125
|
+
query.query += `
|
|
126
|
+
MATCH (parent:Community {id: $parentCommunityId})
|
|
127
|
+
MATCH (child:Community {id: $childCommunityId})
|
|
128
|
+
MERGE (parent)-[:PARENT_OF]->(child)
|
|
129
|
+
`;
|
|
130
|
+
await this.neo4j.writeOne(query);
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Mark communities as stale (needs reprocessing)
|
|
134
|
+
*/
|
|
135
|
+
async markAsStale(communityIds) {
|
|
136
|
+
if (communityIds.length === 0)
|
|
137
|
+
return;
|
|
138
|
+
const query = this.neo4j.initQuery();
|
|
139
|
+
query.queryParams = {
|
|
140
|
+
...query.queryParams,
|
|
141
|
+
communityIds,
|
|
142
|
+
};
|
|
143
|
+
query.query += `
|
|
144
|
+
MATCH (community:Community) WHERE community.id IN $communityIds
|
|
145
|
+
SET community.isStale = true, community.staleSince = datetime(), community.updatedAt = datetime()
|
|
146
|
+
`;
|
|
147
|
+
await this.neo4j.writeOne(query);
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Find stale communities for cron job processing (oldest first)
|
|
151
|
+
* Filters by company from CLS context
|
|
152
|
+
*/
|
|
153
|
+
async findStaleCommunities(limit) {
|
|
154
|
+
const query = this.neo4j.initQuery({ serialiser: community_model_1.CommunityModel });
|
|
155
|
+
query.queryParams = { ...query.queryParams, limit: Number(limit) };
|
|
156
|
+
query.query += `
|
|
157
|
+
MATCH (community:Community {isStale: true})-[:BELONGS_TO]->(company)
|
|
158
|
+
RETURN community
|
|
159
|
+
ORDER BY community.staleSince ASC
|
|
160
|
+
LIMIT toInteger($limit)
|
|
161
|
+
`;
|
|
162
|
+
const result = await this.neo4j.readMany(query);
|
|
163
|
+
return result ?? [];
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Update community summary, embedding, and mark as not stale
|
|
167
|
+
*/
|
|
168
|
+
async updateSummary(params) {
|
|
169
|
+
const query = this.neo4j.initQuery();
|
|
170
|
+
query.queryParams = {
|
|
171
|
+
...query.queryParams,
|
|
172
|
+
communityId: params.communityId,
|
|
173
|
+
name: params.name,
|
|
174
|
+
summary: params.summary,
|
|
175
|
+
embedding: params.embedding,
|
|
176
|
+
rating: params.rating,
|
|
177
|
+
};
|
|
178
|
+
query.query += `
|
|
179
|
+
MATCH (community:Community {id: $communityId})
|
|
180
|
+
SET community.name = $name,
|
|
181
|
+
community.summary = $summary,
|
|
182
|
+
community.embedding = $embedding,
|
|
183
|
+
community.rating = $rating,
|
|
184
|
+
community.isStale = false,
|
|
185
|
+
community.staleSince = null,
|
|
186
|
+
community.lastProcessedAt = datetime(),
|
|
187
|
+
community.updatedAt = datetime()
|
|
188
|
+
`;
|
|
189
|
+
await this.neo4j.writeOne(query);
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Find communities by vector similarity search
|
|
193
|
+
* Filters by company from CLS context
|
|
194
|
+
*/
|
|
195
|
+
async findByVector(params) {
|
|
196
|
+
const query = this.neo4j.initQuery({ serialiser: community_model_1.CommunityModel });
|
|
197
|
+
query.queryParams = {
|
|
198
|
+
...query.queryParams,
|
|
199
|
+
embedding: params.embedding,
|
|
200
|
+
topK: params.topK,
|
|
201
|
+
level: params.level,
|
|
202
|
+
};
|
|
203
|
+
let whereClause = "WHERE community.embedding IS NOT NULL AND community.isStale = false";
|
|
204
|
+
if (params.level !== undefined) {
|
|
205
|
+
whereClause += " AND community.level = $level";
|
|
206
|
+
}
|
|
207
|
+
query.query += `
|
|
208
|
+
CALL db.index.vector.queryNodes('communities', $topK * 2, $embedding)
|
|
209
|
+
YIELD node AS community, score
|
|
210
|
+
MATCH (community)-[:BELONGS_TO]->(company)
|
|
211
|
+
${whereClause}
|
|
212
|
+
RETURN community, score
|
|
213
|
+
ORDER BY score DESC
|
|
214
|
+
LIMIT toInteger($topK)
|
|
215
|
+
`;
|
|
216
|
+
return this.neo4j.readMany(query);
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Find communities by hierarchy level
|
|
220
|
+
* Filters by company from CLS context
|
|
221
|
+
*/
|
|
222
|
+
async findByLevel(params) {
|
|
223
|
+
const query = this.neo4j.initQuery({ serialiser: community_model_1.CommunityModel });
|
|
224
|
+
query.queryParams = {
|
|
225
|
+
...query.queryParams,
|
|
226
|
+
level: params.level,
|
|
227
|
+
};
|
|
228
|
+
query.query += `
|
|
229
|
+
MATCH (community:Community)-[:BELONGS_TO]->(company)
|
|
230
|
+
WHERE community.level = $level
|
|
231
|
+
RETURN community
|
|
232
|
+
ORDER BY community.rating DESC
|
|
233
|
+
`;
|
|
234
|
+
return this.neo4j.readMany(query);
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* Find member KeyConcepts for a community
|
|
238
|
+
*/
|
|
239
|
+
async findMemberKeyConcepts(communityId) {
|
|
240
|
+
const query = this.neo4j.initQuery();
|
|
241
|
+
query.queryParams = { ...query.queryParams, communityId };
|
|
242
|
+
query.query += `
|
|
243
|
+
MATCH (community:Community {id: $communityId})-[:HAS_MEMBER]->(keyconcept:KeyConcept)
|
|
244
|
+
RETURN keyconcept.id AS id, keyconcept.value AS value, keyconcept.description AS description
|
|
245
|
+
`;
|
|
246
|
+
// Use raw read() to avoid entity serialization - we just need properties
|
|
247
|
+
const result = await this.neo4j.read(query.query, query.queryParams);
|
|
248
|
+
return result.records.map((record) => ({
|
|
249
|
+
id: record.get("id"),
|
|
250
|
+
value: record.get("value"),
|
|
251
|
+
description: record.get("description") ?? undefined,
|
|
252
|
+
}));
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* Get KeyConceptRelationships between community members
|
|
256
|
+
*/
|
|
257
|
+
async findMemberRelationships(communityId) {
|
|
258
|
+
const query = this.neo4j.initQuery();
|
|
259
|
+
query.queryParams = { ...query.queryParams, communityId };
|
|
260
|
+
query.query += `
|
|
261
|
+
MATCH (community:Community {id: $communityId})-[:HAS_MEMBER]->(kc1:KeyConcept)
|
|
262
|
+
MATCH (community)-[:HAS_MEMBER]->(kc2:KeyConcept)
|
|
263
|
+
MATCH (kc1)<-[:RELATES_TO]-(rel:KeyConceptRelationship)-[:RELATES_TO]->(kc2)
|
|
264
|
+
WHERE kc1.value < kc2.value
|
|
265
|
+
RETURN kc1.value AS keyConcept1, kc2.value AS keyConcept2, rel.weight AS weight
|
|
266
|
+
`;
|
|
267
|
+
// Use raw read() to avoid entity serialization - we just need properties
|
|
268
|
+
const result = await this.neo4j.read(query.query, query.queryParams);
|
|
269
|
+
return result.records.map((record) => {
|
|
270
|
+
const weight = record.get("weight");
|
|
271
|
+
return {
|
|
272
|
+
keyConcept1: record.get("keyConcept1"),
|
|
273
|
+
keyConcept2: record.get("keyConcept2"),
|
|
274
|
+
weight: weight?.toNumber?.() ?? weight ?? 1.0,
|
|
275
|
+
};
|
|
276
|
+
});
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* Get parent community chain (hierarchy)
|
|
280
|
+
*/
|
|
281
|
+
async getHierarchy(communityId) {
|
|
282
|
+
const query = this.neo4j.initQuery({ serialiser: community_model_1.CommunityModel });
|
|
283
|
+
query.queryParams = { ...query.queryParams, communityId };
|
|
284
|
+
query.query += `
|
|
285
|
+
MATCH (child:Community {id: $communityId})
|
|
286
|
+
MATCH path = (parent:Community)-[:PARENT_OF*]->(child)
|
|
287
|
+
UNWIND nodes(path) AS community
|
|
288
|
+
RETURN DISTINCT community
|
|
289
|
+
ORDER BY community.level DESC
|
|
290
|
+
`;
|
|
291
|
+
return this.neo4j.readMany(query);
|
|
292
|
+
}
|
|
293
|
+
/**
|
|
294
|
+
* Get child communities
|
|
295
|
+
*/
|
|
296
|
+
async getChildren(communityId) {
|
|
297
|
+
const query = this.neo4j.initQuery({ serialiser: community_model_1.CommunityModel });
|
|
298
|
+
query.queryParams = { ...query.queryParams, communityId };
|
|
299
|
+
query.query += `
|
|
300
|
+
MATCH (parent:Community {id: $communityId})-[:PARENT_OF]->(child:Community)
|
|
301
|
+
RETURN child AS community
|
|
302
|
+
ORDER BY child.rating DESC
|
|
303
|
+
`;
|
|
304
|
+
return this.neo4j.readMany(query);
|
|
305
|
+
}
|
|
306
|
+
/**
|
|
307
|
+
* Delete a community and its relationships
|
|
308
|
+
*/
|
|
309
|
+
async deleteCommunity(communityId) {
|
|
310
|
+
const query = this.neo4j.initQuery();
|
|
311
|
+
query.queryParams = { ...query.queryParams, communityId };
|
|
312
|
+
query.query += `
|
|
313
|
+
MATCH (community:Community {id: $communityId})
|
|
314
|
+
DETACH DELETE community
|
|
315
|
+
`;
|
|
316
|
+
await this.neo4j.writeOne(query);
|
|
317
|
+
}
|
|
318
|
+
/**
|
|
319
|
+
* Delete all communities for the current company (from CLS)
|
|
320
|
+
*/
|
|
321
|
+
async deleteAllCommunities() {
|
|
322
|
+
const query = this.neo4j.initQuery();
|
|
323
|
+
query.query += `
|
|
324
|
+
MATCH (community:Community)-[:BELONGS_TO]->(company)
|
|
325
|
+
DETACH DELETE community
|
|
326
|
+
`;
|
|
327
|
+
await this.neo4j.writeOne(query);
|
|
328
|
+
}
|
|
329
|
+
/**
|
|
330
|
+
* Find communities that contain a specific KeyConcept
|
|
331
|
+
*/
|
|
332
|
+
async findCommunitiesByKeyConcept(keyConceptId) {
|
|
333
|
+
const query = this.neo4j.initQuery({ serialiser: community_model_1.CommunityModel });
|
|
334
|
+
query.queryParams = { ...query.queryParams, keyConceptId };
|
|
335
|
+
query.query += `
|
|
336
|
+
MATCH (community:Community)-[:HAS_MEMBER]->(keyconcept:KeyConcept {id: $keyConceptId})
|
|
337
|
+
MATCH (community)-[:BELONGS_TO]->(company)
|
|
338
|
+
RETURN community
|
|
339
|
+
ORDER BY community.level ASC
|
|
340
|
+
`;
|
|
341
|
+
return this.neo4j.readMany(query);
|
|
342
|
+
}
|
|
343
|
+
/**
|
|
344
|
+
* Count communities by level for the current company (from CLS)
|
|
345
|
+
*/
|
|
346
|
+
async countByLevel() {
|
|
347
|
+
const query = this.neo4j.initQuery();
|
|
348
|
+
query.query += `
|
|
349
|
+
MATCH (community:Community)-[:BELONGS_TO]->(company)
|
|
350
|
+
RETURN community.level AS level, COUNT(community) AS count
|
|
351
|
+
ORDER BY level ASC
|
|
352
|
+
`;
|
|
353
|
+
// Use raw read() to avoid entity serialization - we just need counts
|
|
354
|
+
const result = await this.neo4j.read(query.query, query.queryParams);
|
|
355
|
+
return result.records.map((record) => {
|
|
356
|
+
const level = record.get("level");
|
|
357
|
+
const count = record.get("count");
|
|
358
|
+
return {
|
|
359
|
+
level: level?.toNumber?.() ?? level ?? 0,
|
|
360
|
+
count: count?.toNumber?.() ?? count ?? 0,
|
|
361
|
+
};
|
|
362
|
+
});
|
|
363
|
+
}
|
|
364
|
+
/**
|
|
365
|
+
* Find community by ID with company scope from CLS
|
|
366
|
+
*/
|
|
367
|
+
async findById(communityId) {
|
|
368
|
+
const query = this.neo4j.initQuery({ serialiser: community_model_1.CommunityModel });
|
|
369
|
+
query.queryParams = { ...query.queryParams, communityId };
|
|
370
|
+
query.query += `
|
|
371
|
+
MATCH (community:Community {id: $communityId})-[:BELONGS_TO]->(company)
|
|
372
|
+
RETURN community
|
|
373
|
+
`;
|
|
374
|
+
return this.neo4j.readOne(query);
|
|
375
|
+
}
|
|
376
|
+
/**
|
|
377
|
+
* Find communities that contain KeyConcepts related to a given KeyConcept
|
|
378
|
+
* Returns affinity scores based on relationship count and weight
|
|
379
|
+
*/
|
|
380
|
+
async findCommunitiesByRelatedKeyConcepts(keyConceptId) {
|
|
381
|
+
const query = this.neo4j.initQuery();
|
|
382
|
+
query.queryParams = { ...query.queryParams, keyConceptId };
|
|
383
|
+
query.query += `
|
|
384
|
+
MATCH (kc:KeyConcept {id: $keyConceptId})
|
|
385
|
+
MATCH (kc)<-[:RELATES_TO]-(rel:KeyConceptRelationship)-[:RELATES_TO]->(relatedKc:KeyConcept)
|
|
386
|
+
MATCH (community:Community)-[:HAS_MEMBER]->(relatedKc)
|
|
387
|
+
MATCH (community)-[:BELONGS_TO]->(company)
|
|
388
|
+
WITH community, rel, relatedKc
|
|
389
|
+
RETURN community.id AS communityId,
|
|
390
|
+
community.memberCount AS memberCount,
|
|
391
|
+
count(DISTINCT relatedKc) AS relationshipCount,
|
|
392
|
+
sum(coalesce(rel.weight, 1.0)) AS totalWeight
|
|
393
|
+
ORDER BY totalWeight DESC
|
|
394
|
+
`;
|
|
395
|
+
const result = await this.neo4j.read(query.query, query.queryParams);
|
|
396
|
+
return result.records.map((record) => {
|
|
397
|
+
const relationshipCount = record.get("relationshipCount");
|
|
398
|
+
const totalWeight = record.get("totalWeight");
|
|
399
|
+
const memberCount = record.get("memberCount");
|
|
400
|
+
return {
|
|
401
|
+
communityId: record.get("communityId"),
|
|
402
|
+
memberCount: memberCount?.toNumber?.() ?? memberCount ?? 0,
|
|
403
|
+
relationshipCount: relationshipCount?.toNumber?.() ?? relationshipCount ?? 0,
|
|
404
|
+
totalWeight: totalWeight?.toNumber?.() ?? totalWeight ?? 0,
|
|
405
|
+
};
|
|
406
|
+
});
|
|
407
|
+
}
|
|
408
|
+
/**
|
|
409
|
+
* Add a single KeyConcept to an existing community
|
|
410
|
+
*/
|
|
411
|
+
async addMemberToCommunity(communityId, keyConceptId) {
|
|
412
|
+
const query = this.neo4j.initQuery();
|
|
413
|
+
query.queryParams = { ...query.queryParams, communityId, keyConceptId };
|
|
414
|
+
query.query += `
|
|
415
|
+
MATCH (community:Community {id: $communityId})
|
|
416
|
+
MATCH (keyconcept:KeyConcept {id: $keyConceptId})
|
|
417
|
+
MERGE (community)-[:HAS_MEMBER]->(keyconcept)
|
|
418
|
+
SET community.memberCount = community.memberCount + 1,
|
|
419
|
+
community.updatedAt = datetime()
|
|
420
|
+
`;
|
|
421
|
+
await this.neo4j.writeOne(query);
|
|
422
|
+
}
|
|
423
|
+
/**
|
|
424
|
+
* Find KeyConcepts from a content that are not in any community
|
|
425
|
+
*/
|
|
426
|
+
async findOrphanKeyConceptsForContent(contentId, label) {
|
|
427
|
+
const query = this.neo4j.initQuery();
|
|
428
|
+
query.queryParams = { ...query.queryParams, contentId };
|
|
429
|
+
query.query += `
|
|
430
|
+
MATCH (content:${label} {id: $contentId})-[:HAS_CHUNK]->()-[:HAS_ATOMIC_FACT]->()-[:HAS_KEY_CONCEPT]->(kc:KeyConcept)
|
|
431
|
+
WHERE NOT EXISTS { (kc)<-[:HAS_MEMBER]-(:Community) }
|
|
432
|
+
RETURN DISTINCT kc.id AS keyConceptId
|
|
433
|
+
`;
|
|
434
|
+
const result = await this.neo4j.read(query.query, query.queryParams);
|
|
435
|
+
return result.records.map((record) => record.get("keyConceptId"));
|
|
436
|
+
}
|
|
437
|
+
};
|
|
438
|
+
exports.CommunityRepository = CommunityRepository;
|
|
439
|
+
exports.CommunityRepository = CommunityRepository = __decorate([
|
|
440
|
+
(0, common_1.Injectable)(),
|
|
441
|
+
__metadata("design:paramtypes", [neo4j_service_1.Neo4jService,
|
|
442
|
+
core_1.EmbedderService,
|
|
443
|
+
core_1.ModelService,
|
|
444
|
+
security_service_1.SecurityService])
|
|
445
|
+
], CommunityRepository);
|
|
446
|
+
//# sourceMappingURL=community.repository.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"community.repository.js","sourceRoot":"","sources":["../../../../src/foundations/community/repositories/community.repository.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { JsonApiService } from "../../../core/jsonapi/services/jsonapi.service";
|
|
2
|
+
import { CommunityRepository } from "../repositories/community.repository";
|
|
3
|
+
export declare class CommunityService {
|
|
4
|
+
private readonly builder;
|
|
5
|
+
private readonly communityRepository;
|
|
6
|
+
constructor(builder: JsonApiService, communityRepository: CommunityRepository);
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=community.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"community.service.d.ts","sourceRoot":"","sources":["../../../../src/foundations/community/services/community.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,gDAAgD,CAAC;AAChF,OAAO,EAAE,mBAAmB,EAAE,MAAM,sCAAsC,CAAC;AAE3E,qBACa,gBAAgB;IAEzB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,mBAAmB;gBADnB,OAAO,EAAE,cAAc,EACvB,mBAAmB,EAAE,mBAAmB;CAE5D"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.CommunityService = void 0;
|
|
13
|
+
const common_1 = require("@nestjs/common");
|
|
14
|
+
const jsonapi_service_1 = require("../../../core/jsonapi/services/jsonapi.service");
|
|
15
|
+
const community_repository_1 = require("../repositories/community.repository");
|
|
16
|
+
let CommunityService = class CommunityService {
|
|
17
|
+
constructor(builder, communityRepository) {
|
|
18
|
+
this.builder = builder;
|
|
19
|
+
this.communityRepository = communityRepository;
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
exports.CommunityService = CommunityService;
|
|
23
|
+
exports.CommunityService = CommunityService = __decorate([
|
|
24
|
+
(0, common_1.Injectable)(),
|
|
25
|
+
__metadata("design:paramtypes", [jsonapi_service_1.JsonApiService,
|
|
26
|
+
community_repository_1.CommunityRepository])
|
|
27
|
+
], CommunityService);
|
|
28
|
+
//# sourceMappingURL=community.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"community.service.js","sourceRoot":"","sources":["../../../../src/foundations/community/services/community.service.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAA4C;AAC5C,oFAAgF;AAChF,+EAA2E;AAGpE,IAAM,gBAAgB,GAAtB,MAAM,gBAAgB;IAC3B,YACmB,OAAuB,EACvB,mBAAwC;QADxC,YAAO,GAAP,OAAO,CAAgB;QACvB,wBAAmB,GAAnB,mBAAmB,CAAqB;IACxD,CAAC;CACL,CAAA;AALY,4CAAgB;2BAAhB,gBAAgB;IAD5B,IAAA,mBAAU,GAAE;qCAGiB,gCAAc;QACF,0CAAmB;GAHhD,gBAAgB,CAK5B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"key.concept.entity.d.ts","sourceRoot":"","sources":["../../../../src/foundations/keyconcept/entities/key.concept.entity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,kCAAkC,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,8CAA8C,CAAC;AAE1E,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,GAAG,CAAC;IAEhB,UAAU,EAAE,UAAU,CAAC;CACxB,CAAC"}
|
|
1
|
+
{"version":3,"file":"key.concept.entity.d.ts","sourceRoot":"","sources":["../../../../src/foundations/keyconcept/entities/key.concept.entity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,kCAAkC,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,8CAA8C,CAAC;AAE1E,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,GAAG,CAAC;IAEhB,UAAU,EAAE,UAAU,CAAC;CACxB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"key.concept.map.d.ts","sourceRoot":"","sources":["../../../../src/foundations/keyconcept/entities/key.concept.map.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,8CAA8C,CAAC;AAC7E,OAAO,EAAE,UAAU,EAAE,MAAM,8CAA8C,CAAC;AAE1E,eAAO,MAAM,aAAa,GAAI,QAAQ;IAAE,IAAI,EAAE,GAAG,CAAC;IAAC,MAAM,EAAE,GAAG,CAAC;IAAC,aAAa,EAAE,aAAa,CAAA;CAAE,KAAG,
|
|
1
|
+
{"version":3,"file":"key.concept.map.d.ts","sourceRoot":"","sources":["../../../../src/foundations/keyconcept/entities/key.concept.map.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,8CAA8C,CAAC;AAC7E,OAAO,EAAE,UAAU,EAAE,MAAM,8CAA8C,CAAC;AAE1E,eAAO,MAAM,aAAa,GAAI,QAAQ;IAAE,IAAI,EAAE,GAAG,CAAC;IAAC,MAAM,EAAE,GAAG,CAAC;IAAC,aAAa,EAAE,aAAa,CAAA;CAAE,KAAG,UAQhG,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"key.concept.map.js","sourceRoot":"","sources":["../../../../src/foundations/keyconcept/entities/key.concept.map.ts"],"names":[],"mappings":";;;AAAA,6DAA6D;AAItD,MAAM,aAAa,GAAG,CAAC,MAAgE,EAAc,EAAE;IAC5G,OAAO;QACL,GAAG,IAAA,kBAAS,EAAC,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC;QACrC,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK;QACxB,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,SAAS;QAChC,UAAU,EAAE,SAAS;KACtB,CAAC;AACJ,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"key.concept.map.js","sourceRoot":"","sources":["../../../../src/foundations/keyconcept/entities/key.concept.map.ts"],"names":[],"mappings":";;;AAAA,6DAA6D;AAItD,MAAM,aAAa,GAAG,CAAC,MAAgE,EAAc,EAAE;IAC5G,OAAO;QACL,GAAG,IAAA,kBAAS,EAAC,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC;QACrC,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK;QACxB,WAAW,EAAE,MAAM,CAAC,IAAI,CAAC,WAAW;QACpC,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,SAAS;QAChC,UAAU,EAAE,SAAS;KACtB,CAAC;AACJ,CAAC,CAAC;AARW,QAAA,aAAa,iBAQxB"}
|
|
@@ -1,16 +1,17 @@
|
|
|
1
1
|
import { OnModuleInit } from "@nestjs/common";
|
|
2
2
|
import { ClsService } from "nestjs-cls";
|
|
3
3
|
import { DataLimits } from "../../../common/types/data.limits";
|
|
4
|
-
import { EmbedderService } from "../../../core";
|
|
4
|
+
import { EmbedderService, ModelService } from "../../../core";
|
|
5
5
|
import { Neo4jService } from "../../../core/neo4j/services/neo4j.service";
|
|
6
6
|
import { SecurityService } from "../../../core/security/services/security.service";
|
|
7
7
|
import { KeyConcept } from "../../keyconcept/entities/key.concept.entity";
|
|
8
8
|
export declare class KeyConceptRepository implements OnModuleInit {
|
|
9
9
|
private readonly neo4j;
|
|
10
10
|
private readonly embedderService;
|
|
11
|
+
private readonly modelService;
|
|
11
12
|
private readonly securityService;
|
|
12
13
|
private readonly clsService;
|
|
13
|
-
constructor(neo4j: Neo4jService, embedderService: EmbedderService, securityService: SecurityService, clsService: ClsService);
|
|
14
|
+
constructor(neo4j: Neo4jService, embedderService: EmbedderService, modelService: ModelService, securityService: SecurityService, clsService: ClsService);
|
|
14
15
|
onModuleInit(): Promise<void>;
|
|
15
16
|
findNeighboursByKeyConcepts(params: {
|
|
16
17
|
keyConcepts: string[];
|
|
@@ -30,6 +31,16 @@ export declare class KeyConceptRepository implements OnModuleInit {
|
|
|
30
31
|
createOrphanKeyConcepts(params: {
|
|
31
32
|
keyConceptValues: string[];
|
|
32
33
|
}): Promise<void>;
|
|
34
|
+
/**
|
|
35
|
+
* Update descriptions for existing KeyConcepts (only if they don't have a description yet)
|
|
36
|
+
* This preserves existing descriptions and only adds new ones
|
|
37
|
+
*/
|
|
38
|
+
updateKeyConceptDescriptions(params: {
|
|
39
|
+
descriptions: {
|
|
40
|
+
keyConcept: string;
|
|
41
|
+
description: string;
|
|
42
|
+
}[];
|
|
43
|
+
}): Promise<void>;
|
|
33
44
|
createKeyConcept(params: {
|
|
34
45
|
keyConceptValue: string;
|
|
35
46
|
atomicFactId: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"keyconcept.repository.d.ts","sourceRoot":"","sources":["../../../../src/foundations/keyconcept/repositories/keyconcept.repository.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE1D,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAExC,OAAO,EAAE,UAAU,EAAE,MAAM,mCAAmC,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"keyconcept.repository.d.ts","sourceRoot":"","sources":["../../../../src/foundations/keyconcept/repositories/keyconcept.repository.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE1D,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAExC,OAAO,EAAE,UAAU,EAAE,MAAM,mCAAmC,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,4CAA4C,CAAC;AAC1E,OAAO,EAAE,eAAe,EAAE,MAAM,kDAAkD,CAAC;AACnF,OAAO,EAAE,UAAU,EAAE,MAAM,8CAA8C,CAAC;AAI1E,qBACa,oBAAqB,YAAW,YAAY;IAErD,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,eAAe;IAChC,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,eAAe;IAChC,OAAO,CAAC,QAAQ,CAAC,UAAU;gBAJV,KAAK,EAAE,YAAY,EACnB,eAAe,EAAE,eAAe,EAChC,YAAY,EAAE,YAAY,EAC1B,eAAe,EAAE,eAAe,EAChC,UAAU,EAAE,UAAU;IAGnC,YAAY;IAuBZ,2BAA2B,CAAC,MAAM,EAAE;QAAE,WAAW,EAAE,MAAM,EAAE,CAAC;QAAC,UAAU,EAAE,UAAU,CAAA;KAAE,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAoC7G,wBAAwB,CAAC,MAAM,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,UAAU,CAAA;KAAE,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAkCrG,6BAA6B,IAAI,OAAO,CAAC,IAAI,CAAC;IAuB9C,qBAAqB,CAAC,MAAM,EAAE;QAAE,eAAe,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,UAAU,CAAC;IAgB/E,uBAAuB,CAAC,MAAM,EAAE;QAAE,gBAAgB,EAAE,MAAM,EAAE,CAAA;KAAE,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAgBtF,uBAAuB,CAAC,MAAM,EAAE;QAAE,gBAAgB,EAAE,MAAM,EAAE,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAWpF;;;OAGG;IACG,4BAA4B,CAAC,MAAM,EAAE;QACzC,YAAY,EAAE;YAAE,UAAU,EAAE,MAAM,CAAC;YAAC,WAAW,EAAE,MAAM,CAAA;SAAE,EAAE,CAAC;KAC7D,GAAG,OAAO,CAAC,IAAI,CAAC;IAeX,gBAAgB,CAAC,MAAM,EAAE;QAAE,eAAe,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAwC1F,wBAAwB,CAAC,MAAM,EAAE;QAAE,eAAe,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBlG,qCAAqC,CAAC,MAAM,EAAE;QAClD,SAAS,EAAE,MAAM,CAAC;QAClB,OAAO,EAAE,MAAM,CAAC;QAChB,aAAa,EAAE;YACb,WAAW,EAAE,MAAM,CAAC;YACpB,WAAW,EAAE,MAAM,CAAC;YACpB,YAAY,EAAE,MAAM,CAAC;SACtB,EAAE,CAAC;KACL,GAAG,OAAO,CAAC,IAAI,CAAC;IA6EX,kDAAkD,CAAC,MAAM,EAAE;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;CAsBrG"}
|
|
@@ -20,9 +20,10 @@ const security_service_1 = require("../../../core/security/services/security.ser
|
|
|
20
20
|
const key_concept_meta_1 = require("../../keyconcept/entities/key.concept.meta");
|
|
21
21
|
const key_concept_model_1 = require("../../keyconcept/entities/key.concept.model");
|
|
22
22
|
let KeyConceptRepository = class KeyConceptRepository {
|
|
23
|
-
constructor(neo4j, embedderService, securityService, clsService) {
|
|
23
|
+
constructor(neo4j, embedderService, modelService, securityService, clsService) {
|
|
24
24
|
this.neo4j = neo4j;
|
|
25
25
|
this.embedderService = embedderService;
|
|
26
|
+
this.modelService = modelService;
|
|
26
27
|
this.securityService = securityService;
|
|
27
28
|
this.clsService = clsService;
|
|
28
29
|
}
|
|
@@ -33,13 +34,14 @@ let KeyConceptRepository = class KeyConceptRepository {
|
|
|
33
34
|
await this.neo4j.writeOne({
|
|
34
35
|
query: `CREATE CONSTRAINT keyconcept_value IF NOT EXISTS FOR (keyconcept:KeyConcept) REQUIRE keyconcept.value IS UNIQUE`,
|
|
35
36
|
});
|
|
37
|
+
const dimensions = this.modelService.getEmbedderDimensions();
|
|
36
38
|
await this.neo4j.writeOne({
|
|
37
39
|
query: `
|
|
38
40
|
CREATE VECTOR INDEX keyconcepts IF NOT EXISTS
|
|
39
41
|
FOR (keyconcept:KeyConcept)
|
|
40
42
|
ON keyconcept.embedding
|
|
41
43
|
OPTIONS { indexConfig: {
|
|
42
|
-
\`vector.dimensions\`:
|
|
44
|
+
\`vector.dimensions\`: ${dimensions},
|
|
43
45
|
\`vector.similarity_function\`: 'cosine'
|
|
44
46
|
}};
|
|
45
47
|
`,
|
|
@@ -157,6 +159,23 @@ let KeyConceptRepository = class KeyConceptRepository {
|
|
|
157
159
|
}));
|
|
158
160
|
await this.neo4j.executeInTransaction(data);
|
|
159
161
|
}
|
|
162
|
+
/**
|
|
163
|
+
* Update descriptions for existing KeyConcepts (only if they don't have a description yet)
|
|
164
|
+
* This preserves existing descriptions and only adds new ones
|
|
165
|
+
*/
|
|
166
|
+
async updateKeyConceptDescriptions(params) {
|
|
167
|
+
if (params.descriptions.length === 0)
|
|
168
|
+
return;
|
|
169
|
+
const data = params.descriptions.map((item) => ({
|
|
170
|
+
query: `
|
|
171
|
+
MATCH (keyconcept:KeyConcept {value: $keyConceptValue})
|
|
172
|
+
WHERE keyconcept.description IS NULL OR keyconcept.description = ""
|
|
173
|
+
SET keyconcept.description = $description
|
|
174
|
+
`,
|
|
175
|
+
params: { keyConceptValue: item.keyConcept, description: item.description },
|
|
176
|
+
}));
|
|
177
|
+
await this.neo4j.executeInTransaction(data);
|
|
178
|
+
}
|
|
160
179
|
async createKeyConcept(params) {
|
|
161
180
|
const queryCheck = this.neo4j.initQuery({ serialiser: key_concept_model_1.KeyConceptModel, fetchAll: true });
|
|
162
181
|
queryCheck.queryParams = {
|
|
@@ -284,6 +303,7 @@ exports.KeyConceptRepository = KeyConceptRepository = __decorate([
|
|
|
284
303
|
(0, common_1.Injectable)(),
|
|
285
304
|
__metadata("design:paramtypes", [neo4j_service_1.Neo4jService,
|
|
286
305
|
core_1.EmbedderService,
|
|
306
|
+
core_1.ModelService,
|
|
287
307
|
security_service_1.SecurityService,
|
|
288
308
|
nestjs_cls_1.ClsService])
|
|
289
309
|
], KeyConceptRepository);
|