From 97c9cf2d8a6584c37cee060932b97ac1b0de28ce Mon Sep 17 00:00:00 2001 From: vasilije Date: Tue, 6 Jan 2026 11:53:57 +0100 Subject: [PATCH 1/5] added minimal delete for relational --- cognee/modules/graph/methods/__init__.py | 6 +++ .../methods/delete_data_related_edges.py | 14 ++++++ .../methods/delete_data_related_nodes.py | 14 ++++++ .../methods/delete_dataset_related_edges.py | 14 ++++++ .../methods/delete_dataset_related_nodes.py | 14 ++++++ .../methods/test_delete_data_related_edges.py | 44 +++++++++++++++++++ .../methods/test_delete_data_related_nodes.py | 44 +++++++++++++++++++ .../test_delete_dataset_related_edges.py | 44 +++++++++++++++++++ .../test_delete_dataset_related_nodes.py | 44 +++++++++++++++++++ 9 files changed, 238 insertions(+) create mode 100644 cognee/modules/graph/methods/delete_data_related_edges.py create mode 100644 cognee/modules/graph/methods/delete_data_related_nodes.py create mode 100644 cognee/modules/graph/methods/delete_dataset_related_edges.py create mode 100644 cognee/modules/graph/methods/delete_dataset_related_nodes.py create mode 100644 cognee/tests/unit/modules/graph/methods/test_delete_data_related_edges.py create mode 100644 cognee/tests/unit/modules/graph/methods/test_delete_data_related_nodes.py create mode 100644 cognee/tests/unit/modules/graph/methods/test_delete_dataset_related_edges.py create mode 100644 cognee/tests/unit/modules/graph/methods/test_delete_dataset_related_nodes.py diff --git a/cognee/modules/graph/methods/__init__.py b/cognee/modules/graph/methods/__init__.py index e0752c6b0..920c66263 100644 --- a/cognee/modules/graph/methods/__init__.py +++ b/cognee/modules/graph/methods/__init__.py @@ -1 +1,7 @@ from .get_formatted_graph_data import get_formatted_graph_data + +from .delete_data_related_nodes import delete_data_related_nodes +from .delete_data_related_edges import delete_data_related_edges + +from .delete_dataset_related_nodes import delete_dataset_related_nodes +from .delete_dataset_related_edges import delete_dataset_related_edges diff --git a/cognee/modules/graph/methods/delete_data_related_edges.py b/cognee/modules/graph/methods/delete_data_related_edges.py new file mode 100644 index 000000000..374bde5f9 --- /dev/null +++ b/cognee/modules/graph/methods/delete_data_related_edges.py @@ -0,0 +1,14 @@ +from uuid import UUID +from sqlalchemy import delete, select +from sqlalchemy.ext.asyncio import AsyncSession + +from cognee.infrastructure.databases.relational import with_async_session +from cognee.modules.graph.models import Edge + + +@with_async_session +async def delete_data_related_edges(data_id: UUID, session: AsyncSession): + edges = (await session.scalars(select(Edge).where(Edge.data_id == data_id))).all() + + await session.execute(delete(Edge).where(Edge.id.in_([edge.id for edge in edges]))) + diff --git a/cognee/modules/graph/methods/delete_data_related_nodes.py b/cognee/modules/graph/methods/delete_data_related_nodes.py new file mode 100644 index 000000000..c6bb7c95d --- /dev/null +++ b/cognee/modules/graph/methods/delete_data_related_nodes.py @@ -0,0 +1,14 @@ +from uuid import UUID +from sqlalchemy import delete, select +from sqlalchemy.ext.asyncio import AsyncSession + +from cognee.infrastructure.databases.relational import with_async_session +from cognee.modules.graph.models import Node + + +@with_async_session +async def delete_data_related_nodes(data_id: UUID, session: AsyncSession): + nodes = (await session.scalars(select(Node).where(Node.data_id == data_id))).all() + + await session.execute(delete(Node).where(Node.id.in_([node.id for node in nodes]))) + diff --git a/cognee/modules/graph/methods/delete_dataset_related_edges.py b/cognee/modules/graph/methods/delete_dataset_related_edges.py new file mode 100644 index 000000000..8ac0c63f1 --- /dev/null +++ b/cognee/modules/graph/methods/delete_dataset_related_edges.py @@ -0,0 +1,14 @@ +from uuid import UUID +from sqlalchemy import delete, select +from sqlalchemy.ext.asyncio import AsyncSession + +from cognee.infrastructure.databases.relational import with_async_session +from cognee.modules.graph.models import Edge + + +@with_async_session +async def delete_dataset_related_edges(dataset_id: UUID, session: AsyncSession): + edges = (await session.scalars(select(Edge).where(Edge.dataset_id == dataset_id))).all() + + await session.execute(delete(Edge).where(Edge.id.in_([edge.id for edge in edges]))) + diff --git a/cognee/modules/graph/methods/delete_dataset_related_nodes.py b/cognee/modules/graph/methods/delete_dataset_related_nodes.py new file mode 100644 index 000000000..7e251189f --- /dev/null +++ b/cognee/modules/graph/methods/delete_dataset_related_nodes.py @@ -0,0 +1,14 @@ +from uuid import UUID +from sqlalchemy import delete, select +from sqlalchemy.ext.asyncio import AsyncSession + +from cognee.infrastructure.databases.relational import with_async_session +from cognee.modules.graph.models import Node + + +@with_async_session +async def delete_dataset_related_nodes(dataset_id: UUID, session: AsyncSession): + nodes = (await session.scalars(select(Node).where(Node.dataset_id == dataset_id))).all() + + await session.execute(delete(Node).where(Node.id.in_([node.id for node in nodes]))) + diff --git a/cognee/tests/unit/modules/graph/methods/test_delete_data_related_edges.py b/cognee/tests/unit/modules/graph/methods/test_delete_data_related_edges.py new file mode 100644 index 000000000..dca5c1558 --- /dev/null +++ b/cognee/tests/unit/modules/graph/methods/test_delete_data_related_edges.py @@ -0,0 +1,44 @@ +import pytest +from uuid import uuid4 +from types import SimpleNamespace +from unittest.mock import AsyncMock + +from cognee.modules.graph.methods import delete_data_related_edges + + +class DummyScalarResult: + def __init__(self, items): + self._items = items + + def all(self): + return self._items + + +class FakeEdge: + def __init__(self, edge_id): + self.id = edge_id + + +@pytest.mark.asyncio +async def test_delete_data_related_edges_deletes_found_rows(): + session = SimpleNamespace() + session.scalars = AsyncMock(return_value=DummyScalarResult([FakeEdge(1), FakeEdge(2)])) + session.execute = AsyncMock() + + await delete_data_related_edges(uuid4(), session=session) + + session.scalars.assert_awaited_once() + session.execute.assert_awaited_once() + + +@pytest.mark.asyncio +async def test_delete_data_related_edges_handles_empty_list(): + session = SimpleNamespace() + session.scalars = AsyncMock(return_value=DummyScalarResult([])) + session.execute = AsyncMock() + + await delete_data_related_edges(uuid4(), session=session) + + session.scalars.assert_awaited_once() + session.execute.assert_awaited_once() + diff --git a/cognee/tests/unit/modules/graph/methods/test_delete_data_related_nodes.py b/cognee/tests/unit/modules/graph/methods/test_delete_data_related_nodes.py new file mode 100644 index 000000000..44ef20476 --- /dev/null +++ b/cognee/tests/unit/modules/graph/methods/test_delete_data_related_nodes.py @@ -0,0 +1,44 @@ +import pytest +from uuid import uuid4 +from types import SimpleNamespace +from unittest.mock import AsyncMock + +from cognee.modules.graph.methods import delete_data_related_nodes + + +class DummyScalarResult: + def __init__(self, items): + self._items = items + + def all(self): + return self._items + + +class FakeNode: + def __init__(self, node_id): + self.id = node_id + + +@pytest.mark.asyncio +async def test_delete_data_related_nodes_deletes_found_rows(): + session = SimpleNamespace() + session.scalars = AsyncMock(return_value=DummyScalarResult([FakeNode(1), FakeNode(2)])) + session.execute = AsyncMock() + + await delete_data_related_nodes(uuid4(), session=session) + + session.scalars.assert_awaited_once() + session.execute.assert_awaited_once() + + +@pytest.mark.asyncio +async def test_delete_data_related_nodes_handles_empty_list(): + session = SimpleNamespace() + session.scalars = AsyncMock(return_value=DummyScalarResult([])) + session.execute = AsyncMock() + + await delete_data_related_nodes(uuid4(), session=session) + + session.scalars.assert_awaited_once() + session.execute.assert_awaited_once() + diff --git a/cognee/tests/unit/modules/graph/methods/test_delete_dataset_related_edges.py b/cognee/tests/unit/modules/graph/methods/test_delete_dataset_related_edges.py new file mode 100644 index 000000000..210a98bd5 --- /dev/null +++ b/cognee/tests/unit/modules/graph/methods/test_delete_dataset_related_edges.py @@ -0,0 +1,44 @@ +import pytest +from uuid import uuid4 +from types import SimpleNamespace +from unittest.mock import AsyncMock + +from cognee.modules.graph.methods import delete_dataset_related_edges + + +class DummyScalarResult: + def __init__(self, items): + self._items = items + + def all(self): + return self._items + + +class FakeEdge: + def __init__(self, edge_id): + self.id = edge_id + + +@pytest.mark.asyncio +async def test_delete_dataset_related_edges_deletes_found_rows(): + session = SimpleNamespace() + session.scalars = AsyncMock(return_value=DummyScalarResult([FakeEdge(1), FakeEdge(2)])) + session.execute = AsyncMock() + + await delete_dataset_related_edges(uuid4(), session=session) + + session.scalars.assert_awaited_once() + session.execute.assert_awaited_once() + + +@pytest.mark.asyncio +async def test_delete_dataset_related_edges_handles_empty_list(): + session = SimpleNamespace() + session.scalars = AsyncMock(return_value=DummyScalarResult([])) + session.execute = AsyncMock() + + await delete_dataset_related_edges(uuid4(), session=session) + + session.scalars.assert_awaited_once() + session.execute.assert_awaited_once() + diff --git a/cognee/tests/unit/modules/graph/methods/test_delete_dataset_related_nodes.py b/cognee/tests/unit/modules/graph/methods/test_delete_dataset_related_nodes.py new file mode 100644 index 000000000..f52ad58ce --- /dev/null +++ b/cognee/tests/unit/modules/graph/methods/test_delete_dataset_related_nodes.py @@ -0,0 +1,44 @@ +import pytest +from uuid import uuid4 +from types import SimpleNamespace +from unittest.mock import AsyncMock + +from cognee.modules.graph.methods import delete_dataset_related_nodes + + +class DummyScalarResult: + def __init__(self, items): + self._items = items + + def all(self): + return self._items + + +class FakeNode: + def __init__(self, node_id): + self.id = node_id + + +@pytest.mark.asyncio +async def test_delete_dataset_related_nodes_deletes_found_rows(): + session = SimpleNamespace() + session.scalars = AsyncMock(return_value=DummyScalarResult([FakeNode(1), FakeNode(2)])) + session.execute = AsyncMock() + + await delete_dataset_related_nodes(uuid4(), session=session) + + session.scalars.assert_awaited_once() + session.execute.assert_awaited_once() + + +@pytest.mark.asyncio +async def test_delete_dataset_related_nodes_handles_empty_list(): + session = SimpleNamespace() + session.scalars = AsyncMock(return_value=DummyScalarResult([])) + session.execute = AsyncMock() + + await delete_dataset_related_nodes(uuid4(), session=session) + + session.scalars.assert_awaited_once() + session.execute.assert_awaited_once() + From e20751688c13e31bd473103b31f9a60885a1f781 Mon Sep 17 00:00:00 2001 From: vasilije Date: Tue, 6 Jan 2026 11:55:36 +0100 Subject: [PATCH 2/5] reformat applied --- .../databases/vector/embeddings/LiteLLMEmbeddingEngine.py | 4 +++- cognee/modules/graph/methods/delete_data_related_edges.py | 1 - cognee/modules/graph/methods/delete_data_related_nodes.py | 1 - cognee/modules/graph/methods/delete_dataset_related_edges.py | 1 - cognee/modules/graph/methods/delete_dataset_related_nodes.py | 1 - cognee/modules/users/authentication/get_api_auth_backend.py | 2 +- .../modules/graph/methods/test_delete_data_related_edges.py | 1 - .../modules/graph/methods/test_delete_data_related_nodes.py | 1 - .../graph/methods/test_delete_dataset_related_edges.py | 1 - .../graph/methods/test_delete_dataset_related_nodes.py | 1 - 10 files changed, 4 insertions(+), 10 deletions(-) diff --git a/cognee/infrastructure/databases/vector/embeddings/LiteLLMEmbeddingEngine.py b/cognee/infrastructure/databases/vector/embeddings/LiteLLMEmbeddingEngine.py index 28fa22b4f..7a1306bf8 100644 --- a/cognee/infrastructure/databases/vector/embeddings/LiteLLMEmbeddingEngine.py +++ b/cognee/infrastructure/databases/vector/embeddings/LiteLLMEmbeddingEngine.py @@ -134,7 +134,9 @@ class LiteLLMEmbeddingEngine(EmbeddingEngine): litellm.aembedding( model=self.model, input=text, - api_key=self.api_key if self.api_key and self.api_key.strip() != "" else "EMPTY", + api_key=self.api_key + if self.api_key and self.api_key.strip() != "" + else "EMPTY", api_base=self.endpoint, api_version=self.api_version, ), diff --git a/cognee/modules/graph/methods/delete_data_related_edges.py b/cognee/modules/graph/methods/delete_data_related_edges.py index 374bde5f9..7e037ab7d 100644 --- a/cognee/modules/graph/methods/delete_data_related_edges.py +++ b/cognee/modules/graph/methods/delete_data_related_edges.py @@ -11,4 +11,3 @@ async def delete_data_related_edges(data_id: UUID, session: AsyncSession): edges = (await session.scalars(select(Edge).where(Edge.data_id == data_id))).all() await session.execute(delete(Edge).where(Edge.id.in_([edge.id for edge in edges]))) - diff --git a/cognee/modules/graph/methods/delete_data_related_nodes.py b/cognee/modules/graph/methods/delete_data_related_nodes.py index c6bb7c95d..adc8e8f20 100644 --- a/cognee/modules/graph/methods/delete_data_related_nodes.py +++ b/cognee/modules/graph/methods/delete_data_related_nodes.py @@ -11,4 +11,3 @@ async def delete_data_related_nodes(data_id: UUID, session: AsyncSession): nodes = (await session.scalars(select(Node).where(Node.data_id == data_id))).all() await session.execute(delete(Node).where(Node.id.in_([node.id for node in nodes]))) - diff --git a/cognee/modules/graph/methods/delete_dataset_related_edges.py b/cognee/modules/graph/methods/delete_dataset_related_edges.py index 8ac0c63f1..586d58ce9 100644 --- a/cognee/modules/graph/methods/delete_dataset_related_edges.py +++ b/cognee/modules/graph/methods/delete_dataset_related_edges.py @@ -11,4 +11,3 @@ async def delete_dataset_related_edges(dataset_id: UUID, session: AsyncSession): edges = (await session.scalars(select(Edge).where(Edge.dataset_id == dataset_id))).all() await session.execute(delete(Edge).where(Edge.id.in_([edge.id for edge in edges]))) - diff --git a/cognee/modules/graph/methods/delete_dataset_related_nodes.py b/cognee/modules/graph/methods/delete_dataset_related_nodes.py index 7e251189f..403f71430 100644 --- a/cognee/modules/graph/methods/delete_dataset_related_nodes.py +++ b/cognee/modules/graph/methods/delete_dataset_related_nodes.py @@ -11,4 +11,3 @@ async def delete_dataset_related_nodes(dataset_id: UUID, session: AsyncSession): nodes = (await session.scalars(select(Node).where(Node.dataset_id == dataset_id))).all() await session.execute(delete(Node).where(Node.id.in_([node.id for node in nodes]))) - diff --git a/cognee/modules/users/authentication/get_api_auth_backend.py b/cognee/modules/users/authentication/get_api_auth_backend.py index ffb591a9d..799d118f9 100644 --- a/cognee/modules/users/authentication/get_api_auth_backend.py +++ b/cognee/modules/users/authentication/get_api_auth_backend.py @@ -20,7 +20,7 @@ def get_api_auth_backend(): lifetime_seconds = int(os.getenv("JWT_LIFETIME_SECONDS", "3600")) except ValueError: lifetime_seconds = 3600 - + return APIJWTStrategy(secret, lifetime_seconds=lifetime_seconds) auth_backend = AuthenticationBackend( diff --git a/cognee/tests/unit/modules/graph/methods/test_delete_data_related_edges.py b/cognee/tests/unit/modules/graph/methods/test_delete_data_related_edges.py index dca5c1558..932f78975 100644 --- a/cognee/tests/unit/modules/graph/methods/test_delete_data_related_edges.py +++ b/cognee/tests/unit/modules/graph/methods/test_delete_data_related_edges.py @@ -41,4 +41,3 @@ async def test_delete_data_related_edges_handles_empty_list(): session.scalars.assert_awaited_once() session.execute.assert_awaited_once() - diff --git a/cognee/tests/unit/modules/graph/methods/test_delete_data_related_nodes.py b/cognee/tests/unit/modules/graph/methods/test_delete_data_related_nodes.py index 44ef20476..3159d5b10 100644 --- a/cognee/tests/unit/modules/graph/methods/test_delete_data_related_nodes.py +++ b/cognee/tests/unit/modules/graph/methods/test_delete_data_related_nodes.py @@ -41,4 +41,3 @@ async def test_delete_data_related_nodes_handles_empty_list(): session.scalars.assert_awaited_once() session.execute.assert_awaited_once() - diff --git a/cognee/tests/unit/modules/graph/methods/test_delete_dataset_related_edges.py b/cognee/tests/unit/modules/graph/methods/test_delete_dataset_related_edges.py index 210a98bd5..5320ad4e0 100644 --- a/cognee/tests/unit/modules/graph/methods/test_delete_dataset_related_edges.py +++ b/cognee/tests/unit/modules/graph/methods/test_delete_dataset_related_edges.py @@ -41,4 +41,3 @@ async def test_delete_dataset_related_edges_handles_empty_list(): session.scalars.assert_awaited_once() session.execute.assert_awaited_once() - diff --git a/cognee/tests/unit/modules/graph/methods/test_delete_dataset_related_nodes.py b/cognee/tests/unit/modules/graph/methods/test_delete_dataset_related_nodes.py index f52ad58ce..bc9d1d136 100644 --- a/cognee/tests/unit/modules/graph/methods/test_delete_dataset_related_nodes.py +++ b/cognee/tests/unit/modules/graph/methods/test_delete_dataset_related_nodes.py @@ -41,4 +41,3 @@ async def test_delete_dataset_related_nodes_handles_empty_list(): session.scalars.assert_awaited_once() session.execute.assert_awaited_once() - From 69e963fd6ffbf2bd0b2f155d86c3ae0c25885f8c Mon Sep 17 00:00:00 2001 From: vasilije Date: Tue, 6 Jan 2026 12:03:37 +0100 Subject: [PATCH 3/5] added basis --- cognee/modules/graph/models/Edge.py | 58 ++++++++++++++++++++++++ cognee/modules/graph/models/Node.py | 0 cognee/modules/graph/models/Untitled | 59 +++++++++++++++++++++++++ cognee/modules/graph/models/__init__.py | 2 + 4 files changed, 119 insertions(+) create mode 100644 cognee/modules/graph/models/Edge.py create mode 100644 cognee/modules/graph/models/Node.py create mode 100644 cognee/modules/graph/models/Untitled create mode 100644 cognee/modules/graph/models/__init__.py diff --git a/cognee/modules/graph/models/Edge.py b/cognee/modules/graph/models/Edge.py new file mode 100644 index 000000000..51cc4cbd2 --- /dev/null +++ b/cognee/modules/graph/models/Edge.py @@ -0,0 +1,58 @@ +from datetime import datetime, timezone +from sqlalchemy import ( + # event, + DateTime, + JSON, + UUID, + Text, +) + +# from sqlalchemy.schema import DDL +from sqlalchemy.orm import Mapped, mapped_column + +from cognee.infrastructure.databases.relational import Base + + +class Edge(Base): + __tablename__ = "edges" + + id: Mapped[UUID] = mapped_column(UUID(as_uuid=True), primary_key=True) + + slug: Mapped[UUID] = mapped_column(UUID(as_uuid=True), nullable=False) + + user_id: Mapped[UUID] = mapped_column(UUID(as_uuid=True), nullable=False) + + data_id: Mapped[UUID] = mapped_column(UUID(as_uuid=True), index=True, nullable=False) + + dataset_id: Mapped[UUID] = mapped_column(UUID(as_uuid=True), index=True, nullable=False) + + source_node_id: Mapped[UUID] = mapped_column(UUID(as_uuid=True), nullable=False) + destination_node_id: Mapped[UUID] = mapped_column(UUID(as_uuid=True), nullable=False) + + relationship_name: Mapped[str] = mapped_column(Text, nullable=False) + + label: Mapped[str | None] = mapped_column(Text) + attributes: Mapped[dict | None] = mapped_column(JSON) + + created_at: Mapped[datetime] = mapped_column( + DateTime(timezone=True), default=lambda: datetime.now(timezone.utc), nullable=False + ) + + # __table_args__ = ( + # {"postgresql_partition_by": "HASH (user_id)"}, # partitioning by user + # ) + + +# Enable row-level security (RLS) for edges +# enable_edge_rls = DDL(""" +# ALTER TABLE edges ENABLE ROW LEVEL SECURITY; +# """) +# create_user_isolation_policy = DDL(""" +# CREATE POLICY user_isolation_policy +# ON edges +# USING (user_id = current_setting('app.current_user_id')::uuid) +# WITH CHECK (user_id = current_setting('app.current_user_id')::uuid); +# """) + +# event.listen(Edge.__table__, "after_create", enable_edge_rls) +# event.listen(Edge.__table__, "after_create", create_user_isolation_policy) diff --git a/cognee/modules/graph/models/Node.py b/cognee/modules/graph/models/Node.py new file mode 100644 index 000000000..e69de29bb diff --git a/cognee/modules/graph/models/Untitled b/cognee/modules/graph/models/Untitled new file mode 100644 index 000000000..3616f65f0 --- /dev/null +++ b/cognee/modules/graph/models/Untitled @@ -0,0 +1,59 @@ +from datetime import datetime, timezone +from sqlalchemy import ( + DateTime, + Index, + # event, + String, + JSON, + UUID, +) + +# from sqlalchemy.schema import DDL +from sqlalchemy.orm import Mapped, mapped_column + +from cognee.infrastructure.databases.relational import Base + + +class Node(Base): + __tablename__ = "nodes" + + id: Mapped[UUID] = mapped_column(UUID(as_uuid=True), primary_key=True) + + slug: Mapped[UUID] = mapped_column(UUID(as_uuid=True), nullable=False) + + user_id: Mapped[UUID] = mapped_column(UUID(as_uuid=True), nullable=False) + + data_id: Mapped[UUID] = mapped_column(UUID(as_uuid=True), nullable=False) + + dataset_id: Mapped[UUID] = mapped_column(UUID(as_uuid=True), index=True, nullable=False) + + label: Mapped[str | None] = mapped_column(String(255)) + type: Mapped[str] = mapped_column(String(255), nullable=False) + indexed_fields: Mapped[list] = mapped_column(JSON, nullable=False) + + attributes: Mapped[dict | None] = mapped_column(JSON) + + created_at: Mapped[datetime] = mapped_column( + DateTime(timezone=True), default=lambda: datetime.now(timezone.utc), nullable=False + ) + + __table_args__ = ( + Index("index_node_dataset_slug", "dataset_id", "slug"), + Index("index_node_dataset_data", "dataset_id", "data_id"), + # {"postgresql_partition_by": "HASH (user_id)"}, # HASH partitioning on user_id + ) + + +# Enable row-level security (RLS) for nodes +# enable_node_rls = DDL(""" +# ALTER TABLE nodes ENABLE ROW LEVEL SECURITY; +# """) +# create_user_isolation_policy = DDL(""" +# CREATE POLICY user_isolation_policy +# ON nodes +# USING (user_id = current_setting('app.current_user_id')::uuid) +# WITH CHECK (user_id = current_setting('app.current_user_id')::uuid); +# """) + +# event.listen(Node.__table__, "after_create", enable_node_rls) +# event.listen(Node.__table__, "after_create", create_user_isolation_policy) \ No newline at end of file diff --git a/cognee/modules/graph/models/__init__.py b/cognee/modules/graph/models/__init__.py new file mode 100644 index 000000000..5920e89c4 --- /dev/null +++ b/cognee/modules/graph/models/__init__.py @@ -0,0 +1,2 @@ +from .Edge import Edge +from .Node import Node From eaf7d4885a607dcbb6f2394ce24dc2853388b39a Mon Sep 17 00:00:00 2001 From: vasilije Date: Tue, 6 Jan 2026 12:04:06 +0100 Subject: [PATCH 4/5] added fixes --- cognee/modules/graph/models/Untitled | 59 ---------------------------- 1 file changed, 59 deletions(-) delete mode 100644 cognee/modules/graph/models/Untitled diff --git a/cognee/modules/graph/models/Untitled b/cognee/modules/graph/models/Untitled deleted file mode 100644 index 3616f65f0..000000000 --- a/cognee/modules/graph/models/Untitled +++ /dev/null @@ -1,59 +0,0 @@ -from datetime import datetime, timezone -from sqlalchemy import ( - DateTime, - Index, - # event, - String, - JSON, - UUID, -) - -# from sqlalchemy.schema import DDL -from sqlalchemy.orm import Mapped, mapped_column - -from cognee.infrastructure.databases.relational import Base - - -class Node(Base): - __tablename__ = "nodes" - - id: Mapped[UUID] = mapped_column(UUID(as_uuid=True), primary_key=True) - - slug: Mapped[UUID] = mapped_column(UUID(as_uuid=True), nullable=False) - - user_id: Mapped[UUID] = mapped_column(UUID(as_uuid=True), nullable=False) - - data_id: Mapped[UUID] = mapped_column(UUID(as_uuid=True), nullable=False) - - dataset_id: Mapped[UUID] = mapped_column(UUID(as_uuid=True), index=True, nullable=False) - - label: Mapped[str | None] = mapped_column(String(255)) - type: Mapped[str] = mapped_column(String(255), nullable=False) - indexed_fields: Mapped[list] = mapped_column(JSON, nullable=False) - - attributes: Mapped[dict | None] = mapped_column(JSON) - - created_at: Mapped[datetime] = mapped_column( - DateTime(timezone=True), default=lambda: datetime.now(timezone.utc), nullable=False - ) - - __table_args__ = ( - Index("index_node_dataset_slug", "dataset_id", "slug"), - Index("index_node_dataset_data", "dataset_id", "data_id"), - # {"postgresql_partition_by": "HASH (user_id)"}, # HASH partitioning on user_id - ) - - -# Enable row-level security (RLS) for nodes -# enable_node_rls = DDL(""" -# ALTER TABLE nodes ENABLE ROW LEVEL SECURITY; -# """) -# create_user_isolation_policy = DDL(""" -# CREATE POLICY user_isolation_policy -# ON nodes -# USING (user_id = current_setting('app.current_user_id')::uuid) -# WITH CHECK (user_id = current_setting('app.current_user_id')::uuid); -# """) - -# event.listen(Node.__table__, "after_create", enable_node_rls) -# event.listen(Node.__table__, "after_create", create_user_isolation_policy) \ No newline at end of file From 78d9d2081551011e98fe04354d021f2b98f40dca Mon Sep 17 00:00:00 2001 From: vasilije Date: Tue, 6 Jan 2026 12:19:33 +0100 Subject: [PATCH 5/5] added missing node def --- cognee/modules/graph/models/Node.py | 59 +++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) diff --git a/cognee/modules/graph/models/Node.py b/cognee/modules/graph/models/Node.py index e69de29bb..662365264 100644 --- a/cognee/modules/graph/models/Node.py +++ b/cognee/modules/graph/models/Node.py @@ -0,0 +1,59 @@ +from datetime import datetime, timezone +from sqlalchemy import ( + DateTime, + Index, + # event, + String, + JSON, + UUID, +) + +# from sqlalchemy.schema import DDL +from sqlalchemy.orm import Mapped, mapped_column + +from cognee.infrastructure.databases.relational import Base + + +class Node(Base): + __tablename__ = "nodes" + + id: Mapped[UUID] = mapped_column(UUID(as_uuid=True), primary_key=True) + + slug: Mapped[UUID] = mapped_column(UUID(as_uuid=True), nullable=False) + + user_id: Mapped[UUID] = mapped_column(UUID(as_uuid=True), nullable=False) + + data_id: Mapped[UUID] = mapped_column(UUID(as_uuid=True), nullable=False) + + dataset_id: Mapped[UUID] = mapped_column(UUID(as_uuid=True), index=True, nullable=False) + + label: Mapped[str | None] = mapped_column(String(255)) + type: Mapped[str] = mapped_column(String(255), nullable=False) + indexed_fields: Mapped[list] = mapped_column(JSON, nullable=False) + + attributes: Mapped[dict | None] = mapped_column(JSON) + + created_at: Mapped[datetime] = mapped_column( + DateTime(timezone=True), default=lambda: datetime.now(timezone.utc), nullable=False + ) + + __table_args__ = ( + Index("index_node_dataset_slug", "dataset_id", "slug"), + Index("index_node_dataset_data", "dataset_id", "data_id"), + # {"postgresql_partition_by": "HASH (user_id)"}, # HASH partitioning on user_id + ) + + +# Enable row-level security (RLS) for nodes +# enable_node_rls = DDL(""" +# ALTER TABLE nodes ENABLE ROW LEVEL SECURITY; +# """) +# create_user_isolation_policy = DDL(""" +# CREATE POLICY user_isolation_policy +# ON nodes +# USING (user_id = current_setting('app.current_user_id')::uuid) +# WITH CHECK (user_id = current_setting('app.current_user_id')::uuid); +# """) + +# event.listen(Node.__table__, "after_create", enable_node_rls) +# event.listen(Node.__table__, "after_create", create_user_isolation_policy)