graphiti-core 0.16.0__py3-none-any.whl → 0.17.1__py3-none-any.whl

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.

Potentially problematic release.


This version of graphiti-core might be problematic. Click here for more details.

@@ -19,8 +19,6 @@ from abc import ABC, abstractmethod
19
19
  from collections.abc import Coroutine
20
20
  from typing import Any
21
21
 
22
- from graphiti_core.helpers import DEFAULT_DATABASE
23
-
24
22
  logger = logging.getLogger(__name__)
25
23
 
26
24
 
@@ -54,7 +52,7 @@ class GraphDriver(ABC):
54
52
  raise NotImplementedError()
55
53
 
56
54
  @abstractmethod
57
- def session(self, database: str) -> GraphDriverSession:
55
+ def session(self, database: str | None = None) -> GraphDriverSession:
58
56
  raise NotImplementedError()
59
57
 
60
58
  @abstractmethod
@@ -62,5 +60,5 @@ class GraphDriver(ABC):
62
60
  raise NotImplementedError()
63
61
 
64
62
  @abstractmethod
65
- def delete_all_indexes(self, database_: str = DEFAULT_DATABASE) -> Coroutine:
63
+ def delete_all_indexes(self, database_: str | None = None) -> Coroutine:
66
64
  raise NotImplementedError()
@@ -33,7 +33,6 @@ else:
33
33
  ) from None
34
34
 
35
35
  from graphiti_core.driver.driver import GraphDriver, GraphDriverSession
36
- from graphiti_core.helpers import DEFAULT_DATABASE
37
36
 
38
37
  logger = logging.getLogger(__name__)
39
38
 
@@ -81,6 +80,7 @@ class FalkorDriver(GraphDriver):
81
80
  username: str | None = None,
82
81
  password: str | None = None,
83
82
  falkor_db: FalkorDB | None = None,
83
+ database: str = 'default_db',
84
84
  ):
85
85
  """
86
86
  Initialize the FalkorDB driver.
@@ -95,15 +95,16 @@ class FalkorDriver(GraphDriver):
95
95
  self.client = falkor_db
96
96
  else:
97
97
  self.client = FalkorDB(host=host, port=port, username=username, password=password)
98
+ self._database = database
98
99
 
99
100
  def _get_graph(self, graph_name: str | None) -> FalkorGraph:
100
- # FalkorDB requires a non-None database name for multi-tenant graphs; the default is DEFAULT_DATABASE
101
+ # FalkorDB requires a non-None database name for multi-tenant graphs; the default is "default_db"
101
102
  if graph_name is None:
102
- graph_name = DEFAULT_DATABASE
103
+ graph_name = self._database
103
104
  return self.client.select_graph(graph_name)
104
105
 
105
106
  async def execute_query(self, cypher_query_, **kwargs: Any):
106
- graph_name = kwargs.pop('database_', DEFAULT_DATABASE)
107
+ graph_name = kwargs.pop('database_', self._database)
107
108
  graph = self._get_graph(graph_name)
108
109
 
109
110
  # Convert datetime objects to ISO strings (FalkorDB does not support datetime objects directly)
@@ -136,7 +137,7 @@ class FalkorDriver(GraphDriver):
136
137
 
137
138
  return records, header, None
138
139
 
139
- def session(self, database: str | None) -> GraphDriverSession:
140
+ def session(self, database: str | None = None) -> GraphDriverSession:
140
141
  return FalkorDriverSession(self._get_graph(database))
141
142
 
142
143
  async def close(self) -> None:
@@ -148,10 +149,11 @@ class FalkorDriver(GraphDriver):
148
149
  elif hasattr(self.client.connection, 'close'):
149
150
  await self.client.connection.close()
150
151
 
151
- async def delete_all_indexes(self, database_: str = DEFAULT_DATABASE) -> None:
152
+ async def delete_all_indexes(self, database_: str | None = None) -> None:
153
+ database = database_ or self._database
152
154
  await self.execute_query(
153
155
  'CALL db.indexes() YIELD name DROP INDEX name',
154
- database_=database_,
156
+ database_=database,
155
157
  )
156
158
 
157
159
 
@@ -22,7 +22,6 @@ from neo4j import AsyncGraphDatabase, EagerResult
22
22
  from typing_extensions import LiteralString
23
23
 
24
24
  from graphiti_core.driver.driver import GraphDriver, GraphDriverSession
25
- from graphiti_core.helpers import DEFAULT_DATABASE
26
25
 
27
26
  logger = logging.getLogger(__name__)
28
27
 
@@ -30,34 +29,36 @@ logger = logging.getLogger(__name__)
30
29
  class Neo4jDriver(GraphDriver):
31
30
  provider: str = 'neo4j'
32
31
 
33
- def __init__(
34
- self,
35
- uri: str,
36
- user: str | None,
37
- password: str | None,
38
- ):
32
+ def __init__(self, uri: str, user: str | None, password: str | None, database: str = 'neo4j'):
39
33
  super().__init__()
40
34
  self.client = AsyncGraphDatabase.driver(
41
35
  uri=uri,
42
36
  auth=(user or '', password or ''),
43
37
  )
38
+ self._database = database
44
39
 
45
40
  async def execute_query(self, cypher_query_: LiteralString, **kwargs: Any) -> EagerResult:
41
+ # Check if database_ is provided in kwargs.
42
+ # If not populated, set the value to retain backwards compatibility
46
43
  params = kwargs.pop('params', None)
44
+ if params is None:
45
+ params = {}
46
+ params.setdefault('database_', self._database)
47
+
47
48
  result = await self.client.execute_query(cypher_query_, parameters_=params, **kwargs)
48
49
 
49
50
  return result
50
51
 
51
- def session(self, database: str) -> GraphDriverSession:
52
- return self.client.session(database=database) # type: ignore
52
+ def session(self, database: str | None = None) -> GraphDriverSession:
53
+ _database = database or self._database
54
+ return self.client.session(database=_database) # type: ignore
53
55
 
54
56
  async def close(self) -> None:
55
57
  return await self.client.close()
56
58
 
57
- def delete_all_indexes(
58
- self, database_: str = DEFAULT_DATABASE
59
- ) -> Coroutine[Any, Any, EagerResult]:
59
+ def delete_all_indexes(self, database_: str | None = None) -> Coroutine[Any, Any, EagerResult]:
60
+ database = database_ or self._database
60
61
  return self.client.execute_query(
61
62
  'CALL db.indexes() YIELD name DROP INDEX name',
62
- database_=database_,
63
+ database_=database,
63
64
  )
graphiti_core/edges.py CHANGED
@@ -27,7 +27,7 @@ from typing_extensions import LiteralString
27
27
  from graphiti_core.driver.driver import GraphDriver
28
28
  from graphiti_core.embedder import EmbedderClient
29
29
  from graphiti_core.errors import EdgeNotFoundError, GroupsEdgesNotFoundError
30
- from graphiti_core.helpers import DEFAULT_DATABASE, parse_db_date
30
+ from graphiti_core.helpers import parse_db_date
31
31
  from graphiti_core.models.edges.edge_db_queries import (
32
32
  COMMUNITY_EDGE_SAVE,
33
33
  ENTITY_EDGE_SAVE,
@@ -71,7 +71,6 @@ class Edge(BaseModel, ABC):
71
71
  DELETE e
72
72
  """,
73
73
  uuid=self.uuid,
74
- database_=DEFAULT_DATABASE,
75
74
  )
76
75
 
77
76
  logger.debug(f'Deleted Edge: {self.uuid}')
@@ -99,7 +98,6 @@ class EpisodicEdge(Edge):
99
98
  uuid=self.uuid,
100
99
  group_id=self.group_id,
101
100
  created_at=self.created_at,
102
- database_=DEFAULT_DATABASE,
103
101
  )
104
102
 
105
103
  logger.debug(f'Saved edge to Graph: {self.uuid}')
@@ -119,7 +117,6 @@ class EpisodicEdge(Edge):
119
117
  e.created_at AS created_at
120
118
  """,
121
119
  uuid=uuid,
122
- database_=DEFAULT_DATABASE,
123
120
  routing_='r',
124
121
  )
125
122
 
@@ -143,7 +140,6 @@ class EpisodicEdge(Edge):
143
140
  e.created_at AS created_at
144
141
  """,
145
142
  uuids=uuids,
146
- database_=DEFAULT_DATABASE,
147
143
  routing_='r',
148
144
  )
149
145
 
@@ -183,7 +179,6 @@ class EpisodicEdge(Edge):
183
179
  group_ids=group_ids,
184
180
  uuid=uuid_cursor,
185
181
  limit=limit,
186
- database_=DEFAULT_DATABASE,
187
182
  routing_='r',
188
183
  )
189
184
 
@@ -231,9 +226,7 @@ class EntityEdge(Edge):
231
226
  MATCH (n:Entity)-[e:RELATES_TO {uuid: $uuid}]->(m:Entity)
232
227
  RETURN e.fact_embedding AS fact_embedding
233
228
  """
234
- records, _, _ = await driver.execute_query(
235
- query, uuid=self.uuid, database_=DEFAULT_DATABASE, routing_='r'
236
- )
229
+ records, _, _ = await driver.execute_query(query, uuid=self.uuid, routing_='r')
237
230
 
238
231
  if len(records) == 0:
239
232
  raise EdgeNotFoundError(self.uuid)
@@ -261,7 +254,6 @@ class EntityEdge(Edge):
261
254
  result = await driver.execute_query(
262
255
  ENTITY_EDGE_SAVE,
263
256
  edge_data=edge_data,
264
- database_=DEFAULT_DATABASE,
265
257
  )
266
258
 
267
259
  logger.debug(f'Saved edge to Graph: {self.uuid}')
@@ -276,7 +268,6 @@ class EntityEdge(Edge):
276
268
  """
277
269
  + ENTITY_EDGE_RETURN,
278
270
  uuid=uuid,
279
- database_=DEFAULT_DATABASE,
280
271
  routing_='r',
281
272
  )
282
273
 
@@ -298,7 +289,6 @@ class EntityEdge(Edge):
298
289
  """
299
290
  + ENTITY_EDGE_RETURN,
300
291
  uuids=uuids,
301
- database_=DEFAULT_DATABASE,
302
292
  routing_='r',
303
293
  )
304
294
 
@@ -331,7 +321,6 @@ class EntityEdge(Edge):
331
321
  group_ids=group_ids,
332
322
  uuid=uuid_cursor,
333
323
  limit=limit,
334
- database_=DEFAULT_DATABASE,
335
324
  routing_='r',
336
325
  )
337
326
 
@@ -349,9 +338,7 @@ class EntityEdge(Edge):
349
338
  """
350
339
  + ENTITY_EDGE_RETURN
351
340
  )
352
- records, _, _ = await driver.execute_query(
353
- query, node_uuid=node_uuid, database_=DEFAULT_DATABASE, routing_='r'
354
- )
341
+ records, _, _ = await driver.execute_query(query, node_uuid=node_uuid, routing_='r')
355
342
 
356
343
  edges = [get_entity_edge_from_record(record) for record in records]
357
344
 
@@ -367,7 +354,6 @@ class CommunityEdge(Edge):
367
354
  uuid=self.uuid,
368
355
  group_id=self.group_id,
369
356
  created_at=self.created_at,
370
- database_=DEFAULT_DATABASE,
371
357
  )
372
358
 
373
359
  logger.debug(f'Saved edge to Graph: {self.uuid}')
@@ -387,7 +373,6 @@ class CommunityEdge(Edge):
387
373
  e.created_at AS created_at
388
374
  """,
389
375
  uuid=uuid,
390
- database_=DEFAULT_DATABASE,
391
376
  routing_='r',
392
377
  )
393
378
 
@@ -409,7 +394,6 @@ class CommunityEdge(Edge):
409
394
  e.created_at AS created_at
410
395
  """,
411
396
  uuids=uuids,
412
- database_=DEFAULT_DATABASE,
413
397
  routing_='r',
414
398
  )
415
399
 
@@ -447,7 +431,6 @@ class CommunityEdge(Edge):
447
431
  group_ids=group_ids,
448
432
  uuid=uuid_cursor,
449
433
  limit=limit,
450
- database_=DEFAULT_DATABASE,
451
434
  routing_='r',
452
435
  )
453
436
 
graphiti_core/graphiti.py CHANGED
@@ -30,7 +30,6 @@ from graphiti_core.edges import EntityEdge, EpisodicEdge
30
30
  from graphiti_core.embedder import EmbedderClient, OpenAIEmbedder
31
31
  from graphiti_core.graphiti_types import GraphitiClients
32
32
  from graphiti_core.helpers import (
33
- DEFAULT_DATABASE,
34
33
  semaphore_gather,
35
34
  validate_excluded_entity_types,
36
35
  validate_group_id,
@@ -168,7 +167,6 @@ class Graphiti:
168
167
  raise ValueError('uri must be provided when graph_driver is None')
169
168
  self.driver = Neo4jDriver(uri, user, password)
170
169
 
171
- self.database = DEFAULT_DATABASE
172
170
  self.store_raw_episode_content = store_raw_episode_content
173
171
  self.max_coroutines = max_coroutines
174
172
  if llm_client:
@@ -921,9 +919,7 @@ class Graphiti:
921
919
  nodes_to_delete: list[EntityNode] = []
922
920
  for node in nodes:
923
921
  query: LiteralString = 'MATCH (e:Episodic)-[:MENTIONS]->(n:Entity {uuid: $uuid}) RETURN count(*) AS episode_count'
924
- records, _, _ = await self.driver.execute_query(
925
- query, uuid=node.uuid, database_=DEFAULT_DATABASE, routing_='r'
926
- )
922
+ records, _, _ = await self.driver.execute_query(query, uuid=node.uuid, routing_='r')
927
923
 
928
924
  for record in records:
929
925
  if record['episode_count'] == 1:
graphiti_core/helpers.py CHANGED
@@ -32,7 +32,6 @@ from graphiti_core.errors import GroupIdValidationError
32
32
 
33
33
  load_dotenv()
34
34
 
35
- DEFAULT_DATABASE = os.getenv('DEFAULT_DATABASE', 'default_db')
36
35
  USE_PARALLEL_RUNTIME = bool(os.getenv('USE_PARALLEL_RUNTIME', False))
37
36
  SEMAPHORE_LIMIT = int(os.getenv('SEMAPHORE_LIMIT', 20))
38
37
  MAX_REFLEXION_ITERATIONS = int(os.getenv('MAX_REFLEXION_ITERATIONS', 0))
graphiti_core/nodes.py CHANGED
@@ -28,7 +28,7 @@ from typing_extensions import LiteralString
28
28
  from graphiti_core.driver.driver import GraphDriver
29
29
  from graphiti_core.embedder import EmbedderClient
30
30
  from graphiti_core.errors import NodeNotFoundError
31
- from graphiti_core.helpers import DEFAULT_DATABASE, parse_db_date
31
+ from graphiti_core.helpers import parse_db_date
32
32
  from graphiti_core.models.nodes.node_db_queries import (
33
33
  COMMUNITY_NODE_SAVE,
34
34
  ENTITY_NODE_SAVE,
@@ -103,7 +103,6 @@ class Node(BaseModel, ABC):
103
103
  DETACH DELETE n
104
104
  """,
105
105
  uuid=self.uuid,
106
- database_=DEFAULT_DATABASE,
107
106
  )
108
107
 
109
108
  logger.debug(f'Deleted Node: {self.uuid}')
@@ -126,7 +125,6 @@ class Node(BaseModel, ABC):
126
125
  DETACH DELETE n
127
126
  """,
128
127
  group_id=group_id,
129
- database_=DEFAULT_DATABASE,
130
128
  )
131
129
 
132
130
  return 'SUCCESS'
@@ -162,7 +160,6 @@ class EpisodicNode(Node):
162
160
  created_at=self.created_at,
163
161
  valid_at=self.valid_at,
164
162
  source=self.source.value,
165
- database_=DEFAULT_DATABASE,
166
163
  )
167
164
 
168
165
  logger.debug(f'Saved Node to Graph: {self.uuid}')
@@ -185,7 +182,6 @@ class EpisodicNode(Node):
185
182
  e.entity_edges AS entity_edges
186
183
  """,
187
184
  uuid=uuid,
188
- database_=DEFAULT_DATABASE,
189
185
  routing_='r',
190
186
  )
191
187
 
@@ -213,7 +209,6 @@ class EpisodicNode(Node):
213
209
  e.entity_edges AS entity_edges
214
210
  """,
215
211
  uuids=uuids,
216
- database_=DEFAULT_DATABASE,
217
212
  routing_='r',
218
213
  )
219
214
 
@@ -254,7 +249,6 @@ class EpisodicNode(Node):
254
249
  group_ids=group_ids,
255
250
  uuid=uuid_cursor,
256
251
  limit=limit,
257
- database_=DEFAULT_DATABASE,
258
252
  routing_='r',
259
253
  )
260
254
 
@@ -279,7 +273,6 @@ class EpisodicNode(Node):
279
273
  e.entity_edges AS entity_edges
280
274
  """,
281
275
  entity_node_uuid=entity_node_uuid,
282
- database_=DEFAULT_DATABASE,
283
276
  routing_='r',
284
277
  )
285
278
 
@@ -309,9 +302,7 @@ class EntityNode(Node):
309
302
  MATCH (n:Entity {uuid: $uuid})
310
303
  RETURN n.name_embedding AS name_embedding
311
304
  """
312
- records, _, _ = await driver.execute_query(
313
- query, uuid=self.uuid, database_=DEFAULT_DATABASE, routing_='r'
314
- )
305
+ records, _, _ = await driver.execute_query(query, uuid=self.uuid, routing_='r')
315
306
 
316
307
  if len(records) == 0:
317
308
  raise NodeNotFoundError(self.uuid)
@@ -334,7 +325,6 @@ class EntityNode(Node):
334
325
  ENTITY_NODE_SAVE,
335
326
  labels=self.labels + ['Entity'],
336
327
  entity_data=entity_data,
337
- database_=DEFAULT_DATABASE,
338
328
  )
339
329
 
340
330
  logger.debug(f'Saved Node to Graph: {self.uuid}')
@@ -352,7 +342,6 @@ class EntityNode(Node):
352
342
  records, _, _ = await driver.execute_query(
353
343
  query,
354
344
  uuid=uuid,
355
- database_=DEFAULT_DATABASE,
356
345
  routing_='r',
357
346
  )
358
347
 
@@ -371,7 +360,6 @@ class EntityNode(Node):
371
360
  """
372
361
  + ENTITY_NODE_RETURN,
373
362
  uuids=uuids,
374
- database_=DEFAULT_DATABASE,
375
363
  routing_='r',
376
364
  )
377
365
 
@@ -403,7 +391,6 @@ class EntityNode(Node):
403
391
  group_ids=group_ids,
404
392
  uuid=uuid_cursor,
405
393
  limit=limit,
406
- database_=DEFAULT_DATABASE,
407
394
  routing_='r',
408
395
  )
409
396
 
@@ -425,7 +412,6 @@ class CommunityNode(Node):
425
412
  summary=self.summary,
426
413
  name_embedding=self.name_embedding,
427
414
  created_at=self.created_at,
428
- database_=DEFAULT_DATABASE,
429
415
  )
430
416
 
431
417
  logger.debug(f'Saved Node to Graph: {self.uuid}')
@@ -446,9 +432,7 @@ class CommunityNode(Node):
446
432
  MATCH (c:Community {uuid: $uuid})
447
433
  RETURN c.name_embedding AS name_embedding
448
434
  """
449
- records, _, _ = await driver.execute_query(
450
- query, uuid=self.uuid, database_=DEFAULT_DATABASE, routing_='r'
451
- )
435
+ records, _, _ = await driver.execute_query(query, uuid=self.uuid, routing_='r')
452
436
 
453
437
  if len(records) == 0:
454
438
  raise NodeNotFoundError(self.uuid)
@@ -468,7 +452,6 @@ class CommunityNode(Node):
468
452
  n.summary AS summary
469
453
  """,
470
454
  uuid=uuid,
471
- database_=DEFAULT_DATABASE,
472
455
  routing_='r',
473
456
  )
474
457
 
@@ -492,7 +475,6 @@ class CommunityNode(Node):
492
475
  n.summary AS summary
493
476
  """,
494
477
  uuids=uuids,
495
- database_=DEFAULT_DATABASE,
496
478
  routing_='r',
497
479
  )
498
480
 
@@ -529,7 +511,6 @@ class CommunityNode(Node):
529
511
  group_ids=group_ids,
530
512
  uuid=uuid_cursor,
531
513
  limit=limit,
532
- database_=DEFAULT_DATABASE,
533
514
  routing_='r',
534
515
  )
535
516
 
@@ -157,7 +157,7 @@ def edge_search_filter_query_constructor(
157
157
  filter_query += created_at_filter
158
158
 
159
159
  if filters.expired_at is not None:
160
- expired_at_filter = 'AND ('
160
+ expired_at_filter = ' AND ('
161
161
  for i, or_list in enumerate(filters.expired_at):
162
162
  for j, date_filter in enumerate(or_list):
163
163
  filter_params['expired_at_' + str(j)] = date_filter.date
@@ -31,7 +31,6 @@ from graphiti_core.graph_queries import (
31
31
  get_vector_cosine_func_query,
32
32
  )
33
33
  from graphiti_core.helpers import (
34
- DEFAULT_DATABASE,
35
34
  RUNTIME_QUERY,
36
35
  lucene_sanitize,
37
36
  normalize_l2,
@@ -116,7 +115,6 @@ async def get_mentioned_nodes(
116
115
  records, _, _ = await driver.execute_query(
117
116
  query,
118
117
  uuids=episode_uuids,
119
- database_=DEFAULT_DATABASE,
120
118
  routing_='r',
121
119
  )
122
120
 
@@ -143,7 +141,6 @@ async def get_communities_by_nodes(
143
141
  records, _, _ = await driver.execute_query(
144
142
  query,
145
143
  uuids=node_uuids,
146
- database_=DEFAULT_DATABASE,
147
144
  routing_='r',
148
145
  )
149
146
 
@@ -198,7 +195,6 @@ async def edge_fulltext_search(
198
195
  query=fuzzy_query,
199
196
  group_ids=group_ids,
200
197
  limit=limit,
201
- database_=DEFAULT_DATABASE,
202
198
  routing_='r',
203
199
  )
204
200
 
@@ -274,7 +270,6 @@ async def edge_similarity_search(
274
270
  group_ids=group_ids,
275
271
  limit=limit,
276
272
  min_score=min_score,
277
- database_=DEFAULT_DATABASE,
278
273
  routing_='r',
279
274
  )
280
275
 
@@ -329,7 +324,6 @@ async def edge_bfs_search(
329
324
  bfs_origin_node_uuids=bfs_origin_node_uuids,
330
325
  depth=bfs_max_depth,
331
326
  limit=limit,
332
- database_=DEFAULT_DATABASE,
333
327
  routing_='r',
334
328
  )
335
329
 
@@ -371,7 +365,6 @@ async def node_fulltext_search(
371
365
  query=fuzzy_query,
372
366
  group_ids=group_ids,
373
367
  limit=limit,
374
- database_=DEFAULT_DATABASE,
375
368
  routing_='r',
376
369
  )
377
370
 
@@ -425,7 +418,6 @@ async def node_similarity_search(
425
418
  group_ids=group_ids,
426
419
  limit=limit,
427
420
  min_score=min_score,
428
- database_=DEFAULT_DATABASE,
429
421
  routing_='r',
430
422
  )
431
423
 
@@ -465,7 +457,6 @@ async def node_bfs_search(
465
457
  bfs_origin_node_uuids=bfs_origin_node_uuids,
466
458
  depth=bfs_max_depth,
467
459
  limit=limit,
468
- database_=DEFAULT_DATABASE,
469
460
  routing_='r',
470
461
  )
471
462
  nodes = [get_entity_node_from_record(record) for record in records]
@@ -511,7 +502,6 @@ async def episode_fulltext_search(
511
502
  query=fuzzy_query,
512
503
  group_ids=group_ids,
513
504
  limit=limit,
514
- database_=DEFAULT_DATABASE,
515
505
  routing_='r',
516
506
  )
517
507
  episodes = [get_episodic_node_from_record(record) for record in records]
@@ -551,7 +541,6 @@ async def community_fulltext_search(
551
541
  query=fuzzy_query,
552
542
  group_ids=group_ids,
553
543
  limit=limit,
554
- database_=DEFAULT_DATABASE,
555
544
  routing_='r',
556
545
  )
557
546
  communities = [get_community_node_from_record(record) for record in records]
@@ -603,7 +592,6 @@ async def community_similarity_search(
603
592
  group_ids=group_ids,
604
593
  limit=limit,
605
594
  min_score=min_score,
606
- database_=DEFAULT_DATABASE,
607
595
  routing_='r',
608
596
  )
609
597
  communities = [get_community_node_from_record(record) for record in records]
@@ -764,7 +752,6 @@ async def get_relevant_nodes(
764
752
  group_id=group_id,
765
753
  limit=limit,
766
754
  min_score=min_score,
767
- database_=DEFAULT_DATABASE,
768
755
  routing_='r',
769
756
  )
770
757
 
@@ -834,7 +821,6 @@ async def get_relevant_edges(
834
821
  edges=[edge.model_dump() for edge in edges],
835
822
  limit=limit,
836
823
  min_score=min_score,
837
- database_=DEFAULT_DATABASE,
838
824
  routing_='r',
839
825
  )
840
826
 
@@ -905,7 +891,6 @@ async def get_edge_invalidation_candidates(
905
891
  edges=[edge.model_dump() for edge in edges],
906
892
  limit=limit,
907
893
  min_score=min_score,
908
- database_=DEFAULT_DATABASE,
909
894
  routing_='r',
910
895
  )
911
896
  invalidation_edges_dict: dict[str, list[EntityEdge]] = {
@@ -955,7 +940,6 @@ async def node_distance_reranker(
955
940
  query,
956
941
  node_uuids=filtered_uuids,
957
942
  center_uuid=center_node_uuid,
958
- database_=DEFAULT_DATABASE,
959
943
  routing_='r',
960
944
  )
961
945
  if driver.provider == 'falkordb':
@@ -997,7 +981,6 @@ async def episode_mentions_reranker(
997
981
  results, _, _ = await driver.execute_query(
998
982
  query,
999
983
  node_uuids=sorted_uuids,
1000
- database_=DEFAULT_DATABASE,
1001
984
  routing_='r',
1002
985
  )
1003
986
 
@@ -1060,7 +1043,7 @@ async def get_embeddings_for_nodes(
1060
1043
  """
1061
1044
 
1062
1045
  results, _, _ = await driver.execute_query(
1063
- query, node_uuids=[node.uuid for node in nodes], database_=DEFAULT_DATABASE, routing_='r'
1046
+ query, node_uuids=[node.uuid for node in nodes], routing_='r'
1064
1047
  )
1065
1048
 
1066
1049
  embeddings_dict: dict[str, list[float]] = {}
@@ -1086,7 +1069,6 @@ async def get_embeddings_for_communities(
1086
1069
  results, _, _ = await driver.execute_query(
1087
1070
  query,
1088
1071
  community_uuids=[community.uuid for community in communities],
1089
- database_=DEFAULT_DATABASE,
1090
1072
  routing_='r',
1091
1073
  )
1092
1074
 
@@ -1113,7 +1095,6 @@ async def get_embeddings_for_edges(
1113
1095
  results, _, _ = await driver.execute_query(
1114
1096
  query,
1115
1097
  edge_uuids=[edge.uuid for edge in edges],
1116
- database_=DEFAULT_DATABASE,
1117
1098
  routing_='r',
1118
1099
  )
1119
1100
 
@@ -30,7 +30,7 @@ from graphiti_core.graph_queries import (
30
30
  get_entity_node_save_bulk_query,
31
31
  )
32
32
  from graphiti_core.graphiti_types import GraphitiClients
33
- from graphiti_core.helpers import DEFAULT_DATABASE, normalize_l2, semaphore_gather
33
+ from graphiti_core.helpers import normalize_l2, semaphore_gather
34
34
  from graphiti_core.models.edges.edge_db_queries import (
35
35
  EPISODIC_EDGE_SAVE_BULK,
36
36
  )
@@ -91,7 +91,7 @@ async def add_nodes_and_edges_bulk(
91
91
  entity_edges: list[EntityEdge],
92
92
  embedder: EmbedderClient,
93
93
  ):
94
- session = driver.session(database=DEFAULT_DATABASE)
94
+ session = driver.session()
95
95
  try:
96
96
  await session.execute_write(
97
97
  add_nodes_and_edges_bulk_tx,
@@ -7,7 +7,7 @@ from pydantic import BaseModel
7
7
  from graphiti_core.driver.driver import GraphDriver
8
8
  from graphiti_core.edges import CommunityEdge
9
9
  from graphiti_core.embedder import EmbedderClient
10
- from graphiti_core.helpers import DEFAULT_DATABASE, semaphore_gather
10
+ from graphiti_core.helpers import semaphore_gather
11
11
  from graphiti_core.llm_client import LLMClient
12
12
  from graphiti_core.nodes import CommunityNode, EntityNode, get_community_node_from_record
13
13
  from graphiti_core.prompts import prompt_library
@@ -37,7 +37,6 @@ async def get_community_clusters(
37
37
  RETURN
38
38
  collect(DISTINCT n.group_id) AS group_ids
39
39
  """,
40
- database_=DEFAULT_DATABASE,
41
40
  )
42
41
 
43
42
  group_ids = group_id_values[0]['group_ids'] if group_id_values else []
@@ -56,7 +55,6 @@ async def get_community_clusters(
56
55
  """,
57
56
  uuid=node.uuid,
58
57
  group_id=group_id,
59
- database_=DEFAULT_DATABASE,
60
58
  )
61
59
 
62
60
  projection[node.uuid] = [
@@ -224,7 +222,6 @@ async def remove_communities(driver: GraphDriver):
224
222
  MATCH (c:Community)
225
223
  DETACH DELETE c
226
224
  """,
227
- database_=DEFAULT_DATABASE,
228
225
  )
229
226
 
230
227
 
@@ -243,7 +240,6 @@ async def determine_entity_community(
243
240
  c.summary AS summary
244
241
  """,
245
242
  entity_uuid=entity.uuid,
246
- database_=DEFAULT_DATABASE,
247
243
  )
248
244
 
249
245
  if len(records) > 0:
@@ -261,7 +257,6 @@ async def determine_entity_community(
261
257
  c.summary AS summary
262
258
  """,
263
259
  entity_uuid=entity.uuid,
264
- database_=DEFAULT_DATABASE,
265
260
  )
266
261
 
267
262
  communities: list[CommunityNode] = [
@@ -29,7 +29,7 @@ from graphiti_core.edges import (
29
29
  create_entity_edge_embeddings,
30
30
  )
31
31
  from graphiti_core.graphiti_types import GraphitiClients
32
- from graphiti_core.helpers import DEFAULT_DATABASE, MAX_REFLEXION_ITERATIONS, semaphore_gather
32
+ from graphiti_core.helpers import MAX_REFLEXION_ITERATIONS, semaphore_gather
33
33
  from graphiti_core.llm_client import LLMClient
34
34
  from graphiti_core.llm_client.config import ModelSize
35
35
  from graphiti_core.nodes import CommunityNode, EntityNode, EpisodicNode
@@ -539,7 +539,6 @@ async def filter_existing_duplicate_of_edges(
539
539
  records, _, _ = await driver.execute_query(
540
540
  query,
541
541
  duplicate_node_uuids=list(duplicate_nodes_map.keys()),
542
- database_=DEFAULT_DATABASE,
543
542
  routing_='r',
544
543
  )
545
544
 
@@ -21,7 +21,7 @@ from typing_extensions import LiteralString
21
21
 
22
22
  from graphiti_core.driver.driver import GraphDriver
23
23
  from graphiti_core.graph_queries import get_fulltext_indices, get_range_indices
24
- from graphiti_core.helpers import DEFAULT_DATABASE, parse_db_date, semaphore_gather
24
+ from graphiti_core.helpers import parse_db_date, semaphore_gather
25
25
  from graphiti_core.nodes import EpisodeType, EpisodicNode
26
26
 
27
27
  EPISODE_WINDOW_LEN = 3
@@ -35,7 +35,6 @@ async def build_indices_and_constraints(driver: GraphDriver, delete_existing: bo
35
35
  """
36
36
  SHOW INDEXES YIELD name
37
37
  """,
38
- database_=DEFAULT_DATABASE,
39
38
  )
40
39
  index_names = [record['name'] for record in records]
41
40
  await semaphore_gather(
@@ -43,7 +42,6 @@ async def build_indices_and_constraints(driver: GraphDriver, delete_existing: bo
43
42
  driver.execute_query(
44
43
  """DROP INDEX $name""",
45
44
  name=name,
46
- database_=DEFAULT_DATABASE,
47
45
  )
48
46
  for name in index_names
49
47
  ]
@@ -58,7 +56,6 @@ async def build_indices_and_constraints(driver: GraphDriver, delete_existing: bo
58
56
  *[
59
57
  driver.execute_query(
60
58
  query,
61
- database_=DEFAULT_DATABASE,
62
59
  )
63
60
  for query in index_queries
64
61
  ]
@@ -66,7 +63,7 @@ async def build_indices_and_constraints(driver: GraphDriver, delete_existing: bo
66
63
 
67
64
 
68
65
  async def clear_data(driver: GraphDriver, group_ids: list[str] | None = None):
69
- async with driver.session(database=DEFAULT_DATABASE) as session:
66
+ async with driver.session() as session:
70
67
 
71
68
  async def delete_all(tx):
72
69
  await tx.run('MATCH (n) DETACH DELETE n')
@@ -134,7 +131,6 @@ async def retrieve_episodes(
134
131
  source=source.name if source is not None else None,
135
132
  num_episodes=last_n,
136
133
  group_ids=group_ids,
137
- database_=DEFAULT_DATABASE,
138
134
  )
139
135
 
140
136
  episodes = [
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: graphiti-core
3
- Version: 0.16.0
3
+ Version: 0.17.1
4
4
  Summary: A temporal graph building library
5
5
  Project-URL: Homepage, https://help.getzep.com/graphiti/graphiti/overview
6
6
  Project-URL: Repository, https://github.com/getzep/graphiti
@@ -267,24 +267,51 @@ must be set.
267
267
 
268
268
  ### Database Configuration
269
269
 
270
- `DEFAULT_DATABASE` specifies the database name to use for graph operations. This is particularly important for Neo4j 5+ users:
270
+ Database names are configured directly in the driver constructors:
271
271
 
272
- - **Neo4j 5+**: The default database name is `neo4j` (not `default_db`)
273
- - **Neo4j 4**: The default database name is `default_db`
274
- - **FalkorDB**: The default graph name is `default_db`
272
+ - **Neo4j**: Database name defaults to `neo4j` (hardcoded in Neo4jDriver)
273
+ - **FalkorDB**: Database name defaults to `default_db` (hardcoded in FalkorDriver)
275
274
 
276
- If you encounter the error `Graph not found: default_db` when using Neo4j 5, set:
275
+ As of v0.17.0, if you need to customize your database configuration, you can instantiate a database driver and pass it to the Graphiti constructor using the `graph_driver` parameter.
277
276
 
278
- ```bash
279
- export DEFAULT_DATABASE=neo4j
280
- ```
277
+ #### Neo4j with Custom Database Name
281
278
 
282
- Or add to your `.env` file:
279
+ ```python
280
+ from graphiti_core import Graphiti
281
+ from graphiti_core.driver.neo4j_driver import Neo4jDriver
282
+
283
+ # Create a Neo4j driver with custom database name
284
+ driver = Neo4jDriver(
285
+ uri="bolt://localhost:7687",
286
+ user="neo4j",
287
+ password="password",
288
+ database="my_custom_database" # Custom database name
289
+ )
283
290
 
291
+ # Pass the driver to Graphiti
292
+ graphiti = Graphiti(graph_driver=driver)
284
293
  ```
285
- DEFAULT_DATABASE=neo4j
294
+
295
+ #### FalkorDB with Custom Database Name
296
+
297
+ ```python
298
+ from graphiti_core import Graphiti
299
+ from graphiti_core.driver.falkordb_driver import FalkorDriver
300
+
301
+ # Create a FalkorDB driver with custom database name
302
+ driver = FalkorDriver(
303
+ host="localhost",
304
+ port=6379,
305
+ username="falkor_user", # Optional
306
+ password="falkor_password", # Optional
307
+ database="my_custom_graph" # Custom database name
308
+ )
309
+
310
+ # Pass the driver to Graphiti
311
+ graphiti = Graphiti(graph_driver=driver)
286
312
  ```
287
313
 
314
+
288
315
  ### Performance Configuration
289
316
 
290
317
  `USE_PARALLEL_RUNTIME` is an optional boolean variable that can be set to true if you wish
@@ -1,11 +1,11 @@
1
1
  graphiti_core/__init__.py,sha256=e5SWFkRiaUwfprYIeIgVIh7JDedNiloZvd3roU-0aDY,55
2
- graphiti_core/edges.py,sha256=h67vyXYhZYqlwaOmaqjHiGns6nEjuBVSIAFBMveNVo8,16257
2
+ graphiti_core/edges.py,sha256=oo9PUxH8QJ09IByl91bbmez4lXIVTD7pvZvIEg6jOgg,15619
3
3
  graphiti_core/errors.py,sha256=cH_v9TPgEPeQE6GFOHIg5TvejpUCBddGarMY2Whxbwc,2707
4
4
  graphiti_core/graph_queries.py,sha256=KfWDp8xDnPa9bcHskw8NeMpeeHBtZWBCosVdu1Iwv34,7076
5
- graphiti_core/graphiti.py,sha256=pSgJ7F0vb-avsPnE5ELqdPCs8jSJpG9_L5hrQkEbchg,35257
5
+ graphiti_core/graphiti.py,sha256=xRtP6ko7OSByBwgMQcx2X4WFoW5zr_ciiCz2xMhlfrk,35136
6
6
  graphiti_core/graphiti_types.py,sha256=rL-9bvnLobunJfXU4hkD6mAj14pofKp_wq8QsFDZwDU,1035
7
- graphiti_core/helpers.py,sha256=ixUOfWN_GJVRvdiK-RzgAYJD18nM1CLmLBDNmVrIboQ,4948
8
- graphiti_core/nodes.py,sha256=mRK5QaTzYzznAx4OSHKFFOoiyAUKJmXbjWv3ovDJ6z8,18994
7
+ graphiti_core/helpers.py,sha256=b4998WOrqgzesNyMlw7UKIdo3x3uo_BwheztqMblwzE,4885
8
+ graphiti_core/nodes.py,sha256=X1mv0PQ5DKPWAzodc1Xiafv-zDDhNQSuF6wpfB3I7vE,18276
9
9
  graphiti_core/py.typed,sha256=vlmmzQOt7bmeQl9L3XJP4W6Ry0iiELepnOrinKz5KQg,79
10
10
  graphiti_core/cross_encoder/__init__.py,sha256=hry59vz21x-AtGZ0MJ7ugw0HTwJkXiddpp_Yqnwsen0,723
11
11
  graphiti_core/cross_encoder/bge_reranker_client.py,sha256=y3TfFxZh0Yvj6HUShmfUm6MC7OPXwWUlv1Qe5HF3S3I,1797
@@ -13,9 +13,9 @@ graphiti_core/cross_encoder/client.py,sha256=KLsbfWKOEaAV3adFe3XZlAeb-gje9_sVKCV
13
13
  graphiti_core/cross_encoder/gemini_reranker_client.py,sha256=hmITG5YIib52nrKvINwRi4xTfAO1U4jCCaEVIwImHw0,6208
14
14
  graphiti_core/cross_encoder/openai_reranker_client.py,sha256=hoaGyu9nCNMJyP8si0Bha5Q9CFszfiHQmLgE9IsX7sY,4653
15
15
  graphiti_core/driver/__init__.py,sha256=kCWimqQU19airu5gKwCmZtZuXkDfaQfKSUhMDoL-rTA,626
16
- graphiti_core/driver/driver.py,sha256=-FHAA2gM8FA0re-q6udmjQ6pNFdFGRQrMRuAiqX_1A4,1829
17
- graphiti_core/driver/falkordb_driver.py,sha256=9VnZwAgv0YzpFK5g-nS7YiqOOp3zxaiCW1y2etSYt3w,6331
18
- graphiti_core/driver/neo4j_driver.py,sha256=f8cSkcaCDyQLyI85JBprw0rdrarpd5Tq1mlX-Mz3kls,1962
16
+ graphiti_core/driver/driver.py,sha256=UGnsRFqRXndMe_QC72NOG6oJlP4p3NyvCM9ufn6zTLE,1786
17
+ graphiti_core/driver/falkordb_driver.py,sha256=vTbbYsv-ruRd9TxifJUbfkt8UGcEuFLAHtBCpI9_vSc,6396
18
+ graphiti_core/driver/neo4j_driver.py,sha256=0MCAWAPay0LdcqrFSkY91GooUtrn1yX1CTKuE4Lj_Po,2255
19
19
  graphiti_core/embedder/__init__.py,sha256=EL564ZuE-DZjcuKNUK_exMn_XHXm2LdO9fzdXePVKL4,179
20
20
  graphiti_core/embedder/azure_openai.py,sha256=OyomPwC1fIsddI-3n6g00kQFdQznZorBhHwkQKCLUok,2384
21
21
  graphiti_core/embedder/client.py,sha256=qEpSHceL_Gc4QQPJWIOnuNLemNuR_TYA4r28t2Vldbg,1115
@@ -55,23 +55,23 @@ graphiti_core/search/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hS
55
55
  graphiti_core/search/search.py,sha256=bJCFaNApu5396pXTa-xciu8ORDdRFJqfE3j2ieRVd7Y,15162
56
56
  graphiti_core/search/search_config.py,sha256=VvKg6AB_RPhoe56DBBXHRBXHThAVJ_OLFCyq_yKof-A,3765
57
57
  graphiti_core/search/search_config_recipes.py,sha256=4GquRphHhJlpXQhAZOySYnCzBWYoTwxlJj44eTOavZQ,7443
58
- graphiti_core/search/search_filters.py,sha256=H7Vgob2SvwsG56qiTDXDhI4R4MMY40TVpphY5KHPwYU,6382
58
+ graphiti_core/search/search_filters.py,sha256=cxiFkqB-r7QzVMh8nmujECLhzgsbeCpBHUQqDXnCQ3A,6383
59
59
  graphiti_core/search/search_helpers.py,sha256=G5Ceaq5Pfgx0Weelqgeylp_pUHwiBnINaUYsDbURJbE,2636
60
- graphiti_core/search/search_utils.py,sha256=2g5xL11IUhG2tce2hVwN1bPYWFFxuB3jJh8G-aOdYzg,34724
60
+ graphiti_core/search/search_utils.py,sha256=616pGqC95PgW7DljgP5TDybzDKyO6IqrSPEEWQ87Pw0,34026
61
61
  graphiti_core/telemetry/__init__.py,sha256=5kALLDlU9bb2v19CdN7qVANsJWyfnL9E60J6FFgzm3o,226
62
62
  graphiti_core/telemetry/telemetry.py,sha256=47LrzOVBCcZxsYPsnSxWFiztHoxYKKxPwyRX0hnbDGc,3230
63
63
  graphiti_core/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
64
- graphiti_core/utils/bulk_utils.py,sha256=T8E_b1Jqe5Ipt-bRoF2q5kKJxIF-b6bDydJYnfL8g4M,15416
64
+ graphiti_core/utils/bulk_utils.py,sha256=lab0gN6ZucNRitk7SyDMfw4eSis7nxIeupsJDy_FHEw,15373
65
65
  graphiti_core/utils/datetime_utils.py,sha256=Ti-2tnrDFRzBsbfblzsHybsM3jaDLP4-VT2t0VhpIzU,1357
66
66
  graphiti_core/utils/maintenance/__init__.py,sha256=vW4H1KyapTl-OOz578uZABYcpND4wPx3Vt6aAPaXh78,301
67
- graphiti_core/utils/maintenance/community_operations.py,sha256=AimQzT7wr4M3ofsUetHa1cPEmhsngqJoNWm3Q-3Hwww,10115
68
- graphiti_core/utils/maintenance/edge_operations.py,sha256=RQ9wtxky4JXUtRzc0KUznY03Ebi1-y9Zn_BJztbSD4o,19219
69
- graphiti_core/utils/maintenance/graph_data_operations.py,sha256=NH1FLwVKqnDdt2JKa38g_y2lG08ID5cAR-GPTQccxC4,5403
67
+ graphiti_core/utils/maintenance/community_operations.py,sha256=ROKo9_5Jj3RqfTrD9wJjlDRSF6iUyXUY4czkc9RGVdw,9905
68
+ graphiti_core/utils/maintenance/edge_operations.py,sha256=dgzji7AU6ucOWwj32eAsYAm-hloa1Xd0MKvDTHLG7Rg,19165
69
+ graphiti_core/utils/maintenance/graph_data_operations.py,sha256=4czJPiHZpaqhKYYcXonErYQV2tV86ai2H-cg6dK8u60,5192
70
70
  graphiti_core/utils/maintenance/node_operations.py,sha256=4jMlmbB3zwK9KzIm2QXRxzA4HAn-SJiNhWMeCacwHh8,14467
71
71
  graphiti_core/utils/maintenance/temporal_operations.py,sha256=mJkw9xLB4W2BsLfC5POr0r-PHWL9SIfNj_l_xu0B5ug,3410
72
72
  graphiti_core/utils/maintenance/utils.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
73
73
  graphiti_core/utils/ontology_utils/entity_types_utils.py,sha256=QJX5cG0GSSNF_Mm_yrldr69wjVAbN_MxLhOSznz85Hk,1279
74
- graphiti_core-0.16.0.dist-info/METADATA,sha256=DE6cwPaJL6L0jsmH2Vyeu7fK_vELK7HlksmcP9BoKIU,22973
75
- graphiti_core-0.16.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
76
- graphiti_core-0.16.0.dist-info/licenses/LICENSE,sha256=KCUwCyDXuVEgmDWkozHyniRyWjnWUWjkuDHfU6o3JlA,11325
77
- graphiti_core-0.16.0.dist-info/RECORD,,
74
+ graphiti_core-0.17.1.dist-info/METADATA,sha256=U4lMqT6JebOB4Rcxvlym2Gb3f1U3RexyG4jU2mhY9UU,23791
75
+ graphiti_core-0.17.1.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
76
+ graphiti_core-0.17.1.dist-info/licenses/LICENSE,sha256=KCUwCyDXuVEgmDWkozHyniRyWjnWUWjkuDHfU6o3JlA,11325
77
+ graphiti_core-0.17.1.dist-info/RECORD,,