@@ -47,7 +47,7 @@ func (fs *fileStore) Read() ([]byte, error) {
4747 data , err := os .ReadFile (fs .path )
4848 if err != nil {
4949 if os .IsNotExist (err ) {
50- return [] byte {} , nil
50+ return nil , nil
5151 }
5252 return nil , fmt .Errorf ("failed to read file %s: %w" , fs .path , err )
5353 }
@@ -98,10 +98,7 @@ func (k knowledgeBase) loadGraph() (KnowledgeGraph, error) {
9898 return KnowledgeGraph {}, fmt .Errorf ("failed to unmarshal from store: %w" , err )
9999 }
100100
101- graph := KnowledgeGraph {
102- Entities : []Entity {},
103- Relations : []Relation {},
104- }
101+ graph := KnowledgeGraph {}
105102
106103 for _ , item := range items {
107104 switch item .Type {
@@ -157,6 +154,7 @@ func (k knowledgeBase) saveGraph(graph KnowledgeGraph) error {
157154}
158155
159156// createEntities adds new entities to the graph, skipping duplicates by name.
157+ // Returns the new entities that were actually added.
160158func (k knowledgeBase ) createEntities (entities []Entity ) ([]Entity , error ) {
161159 graph , err := k .loadGraph ()
162160 if err != nil {
@@ -165,15 +163,7 @@ func (k knowledgeBase) createEntities(entities []Entity) ([]Entity, error) {
165163
166164 var newEntities []Entity
167165 for _ , entity := range entities {
168- exists := false
169- for _ , existingEntity := range graph .Entities {
170- if existingEntity .Name == entity .Name {
171- exists = true
172- break
173- }
174- }
175-
176- if ! exists {
166+ if ! slices .ContainsFunc (graph .Entities , func (e Entity ) bool { return e .Name == entity .Name }) {
177167 newEntities = append (newEntities , entity )
178168 graph .Entities = append (graph .Entities , entity )
179169 }
@@ -187,6 +177,7 @@ func (k knowledgeBase) createEntities(entities []Entity) ([]Entity, error) {
187177}
188178
189179// createRelations adds new relations to the graph, skipping exact duplicates.
180+ // Returns the new relations that were actually added.
190181func (k knowledgeBase ) createRelations (relations []Relation ) ([]Relation , error ) {
191182 graph , err := k .loadGraph ()
192183 if err != nil {
@@ -195,16 +186,11 @@ func (k knowledgeBase) createRelations(relations []Relation) ([]Relation, error)
195186
196187 var newRelations []Relation
197188 for _ , relation := range relations {
198- exists := false
199- for _ , existingRelation := range graph .Relations {
200- if existingRelation .From == relation .From &&
201- existingRelation .To == relation .To &&
202- existingRelation .RelationType == relation .RelationType {
203- exists = true
204- break
205- }
206- }
207-
189+ exists := slices .ContainsFunc (graph .Relations , func (r Relation ) bool {
190+ return r .From == relation .From &&
191+ r .To == relation .To &&
192+ r .RelationType == relation .RelationType
193+ })
208194 if ! exists {
209195 newRelations = append (newRelations , relation )
210196 graph .Relations = append (graph .Relations , relation )
@@ -219,6 +205,7 @@ func (k knowledgeBase) createRelations(relations []Relation) ([]Relation, error)
219205}
220206
221207// addObservations appends new observations to existing entities.
208+ // Returns the new observations that were actually added.
222209func (k knowledgeBase ) addObservations (observations []Observation ) ([]Observation , error ) {
223210 graph , err := k .loadGraph ()
224211 if err != nil {
@@ -228,23 +215,14 @@ func (k knowledgeBase) addObservations(observations []Observation) ([]Observatio
228215 var results []Observation
229216
230217 for _ , obs := range observations {
231- entityIndex := - 1
232- for i , entity := range graph .Entities {
233- if entity .Name == obs .EntityName {
234- entityIndex = i
235- break
236- }
237- }
238-
218+ entityIndex := slices .IndexFunc (graph .Entities , func (e Entity ) bool { return e .Name == obs .EntityName })
239219 if entityIndex == - 1 {
240220 return nil , fmt .Errorf ("entity with name %s not found" , obs .EntityName )
241221 }
242222
243223 var newObservations []string
244224 for _ , content := range obs .Contents {
245- exists := slices .Contains (graph .Entities [entityIndex ].Observations , content )
246-
247- if ! exists {
225+ if ! slices .Contains (graph .Entities [entityIndex ].Observations , content ) {
248226 newObservations = append (newObservations , content )
249227 graph .Entities [entityIndex ].Observations = append (graph .Entities [entityIndex ].Observations , content )
250228 }
@@ -276,23 +254,15 @@ func (k knowledgeBase) deleteEntities(entityNames []string) error {
276254 entitiesToDelete [name ] = true
277255 }
278256
279- // Filter entities
280- var filteredEntities []Entity
281- for _ , entity := range graph .Entities {
282- if ! entitiesToDelete [entity .Name ] {
283- filteredEntities = append (filteredEntities , entity )
284- }
285- }
286- graph .Entities = filteredEntities
257+ // Filter entities using slices.DeleteFunc
258+ graph .Entities = slices .DeleteFunc (graph .Entities , func (entity Entity ) bool {
259+ return entitiesToDelete [entity .Name ]
260+ })
287261
288- // Filter relations
289- var filteredRelations []Relation
290- for _ , relation := range graph .Relations {
291- if ! entitiesToDelete [relation .From ] && ! entitiesToDelete [relation .To ] {
292- filteredRelations = append (filteredRelations , relation )
293- }
294- }
295- graph .Relations = filteredRelations
262+ // Filter relations using slices.DeleteFunc
263+ graph .Relations = slices .DeleteFunc (graph .Relations , func (relation Relation ) bool {
264+ return entitiesToDelete [relation .From ] || entitiesToDelete [relation .To ]
265+ })
296266
297267 return k .saveGraph (graph )
298268}
@@ -305,26 +275,23 @@ func (k knowledgeBase) deleteObservations(deletions []Observation) error {
305275 }
306276
307277 for _ , deletion := range deletions {
308- for i , entity := range graph .Entities {
309- if entity .Name == deletion .EntityName {
310- // Create a map for quick lookup
311- observationsToDelete := make (map [string ]bool )
312- for _ , observation := range deletion .Observations {
313- observationsToDelete [observation ] = true
314- }
315-
316- // Filter observations
317- var filteredObservations []string
318- for _ , observation := range entity .Observations {
319- if ! observationsToDelete [observation ] {
320- filteredObservations = append (filteredObservations , observation )
321- }
322- }
323-
324- graph .Entities [i ].Observations = filteredObservations
325- break
326- }
278+ entityIndex := slices .IndexFunc (graph .Entities , func (e Entity ) bool {
279+ return e .Name == deletion .EntityName
280+ })
281+ if entityIndex == - 1 {
282+ continue
327283 }
284+
285+ // Create a map for quick lookup
286+ observationsToDelete := make (map [string ]bool )
287+ for _ , observation := range deletion .Observations {
288+ observationsToDelete [observation ] = true
289+ }
290+
291+ // Filter observations using slices.DeleteFunc
292+ graph .Entities [entityIndex ].Observations = slices .DeleteFunc (graph .Entities [entityIndex ].Observations , func (observation string ) bool {
293+ return observationsToDelete [observation ]
294+ })
328295 }
329296
330297 return k .saveGraph (graph )
@@ -337,25 +304,14 @@ func (k knowledgeBase) deleteRelations(relations []Relation) error {
337304 return err
338305 }
339306
340- var filteredRelations []Relation
341- for _ , existingRelation := range graph .Relations {
342- shouldKeep := true
343-
344- for _ , relationToDelete := range relations {
345- if existingRelation .From == relationToDelete .From &&
307+ // Filter relations using slices.DeleteFunc and slices.ContainsFunc
308+ graph .Relations = slices .DeleteFunc (graph .Relations , func (existingRelation Relation ) bool {
309+ return slices .ContainsFunc (relations , func (relationToDelete Relation ) bool {
310+ return existingRelation .From == relationToDelete .From &&
346311 existingRelation .To == relationToDelete .To &&
347- existingRelation .RelationType == relationToDelete .RelationType {
348- shouldKeep = false
349- break
350- }
351- }
352-
353- if shouldKeep {
354- filteredRelations = append (filteredRelations , existingRelation )
355- }
356- }
357-
358- graph .Relations = filteredRelations
312+ existingRelation .RelationType == relationToDelete .RelationType
313+ })
314+ })
359315 return k .saveGraph (graph )
360316}
361317
0 commit comments