Files
wehub-resource-sync c889a57b6b
Test Suites / Build CI Environment (push) Has been cancelled
Test Suites / Basic Tests (push) Has been cancelled
Test Suites / End-to-End Tests (push) Has been cancelled
Test Suites / CLI Tests (push) Has been cancelled
Test Suites / Slow End-to-End Tests (push) Has been cancelled
Test Suites / Graph Database Tests (push) Has been cancelled
Test Suites / Vector DB Tests (push) Has been cancelled
Test Suites / Temporal Graph Test (push) Has been cancelled
Test Suites / Search Test on Different DBs (push) Has been cancelled
Test Suites / Example Tests (push) Has been cancelled
Test Suites / Notebook Tests (push) Has been cancelled
Test Suites / OS and Python Tests Ubuntu (push) Has been cancelled
Test Suites / OS and Python Tests Extended (push) Has been cancelled
Test Suites / LLM Test Suite (push) Has been cancelled
Test Suites / S3 File Storage Test (push) Has been cancelled
Test Suites / Run Integration Tests (push) Has been cancelled
Test Suites / MCP Tests (push) Has been cancelled
Test Suites / Docker Compose Test (push) Has been cancelled
Test Suites / Docker CI test (push) Has been cancelled
Test Suites / Relational DB Migration Tests (push) Has been cancelled
Test Suites / Distributed Cognee Test (push) Has been cancelled
Test Suites / DB Examples Tests (push) Has been cancelled
Test Suites / Test Completion Status (push) Has been cancelled
Test Suites / Claude Code Review (push) Has been cancelled
Test Suites / basic checks (push) Has been cancelled
build | Build and Push Cognee MCP Docker Image to dockerhub / docker-build-and-push (push) Has been cancelled
Scorecard supply-chain security / Scorecard analysis (push) Has been cancelled
build | Build and Push Docker Image to dockerhub / docker-build-and-push (push) Has been cancelled
Weighted Edges Tests / Test Weighted Edges Core Functionality (3.11) (push) Has been cancelled
Weighted Edges Tests / Test Weighted Edges Core Functionality (3.12) (push) Has been cancelled
Weighted Edges Tests / Test Weighted Edges with Different Graph Databases (kuzu, kuzu) (push) Has been cancelled
Weighted Edges Tests / Test Weighted Edges with Different Graph Databases (neo4j, neo4j) (push) Has been cancelled
Weighted Edges Tests / Test Weighted Edges Examples (push) Has been cancelled
Weighted Edges Tests / Code Quality for Weighted Edges (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 13:02:24 +08:00

160 lines
6.5 KiB
Python

"""Shared graph database backend test.
Exercises the full add -> cognify -> search pipeline against whichever
graph backend is configured via `provider`. Requires:
- A working LLM API key (LLM_API_KEY in .env)
- A working vector database (default LanceDB is fine)
- For postgres: DB_PROVIDER=postgres with valid connection credentials
"""
import os
import shutil
import pathlib
import cognee
from cognee.infrastructure.files.storage import get_storage_config
from cognee.modules.engine.models import NodeSet
from cognee.modules.retrieval.graph_completion_retriever import GraphCompletionRetriever
from cognee.modules.search.types import SearchType
from cognee.modules.search.operations import get_history
from cognee.modules.users.methods import get_default_user
from cognee.shared.logging_utils import get_logger
logger = get_logger()
TEST_DATA_DIR = pathlib.Path(__file__).parents[2] / "test_data"
async def run_graph_db_test(provider: str):
"""Run the full graph DB integration test for the given provider."""
# Set up isolated directories for this test run
base = pathlib.Path(__file__).parent
data_dir = str((base / f".data_storage/test_{provider}").resolve())
system_dir = str((base / f".cognee_system/test_{provider}").resolve())
# Capture current config so we can restore after the test
from cognee.infrastructure.databases.graph.config import get_graph_config
from cognee.base_config import get_base_config
graph_config = get_graph_config()
base_config = get_base_config()
prev_provider = graph_config.graph_database_provider
prev_data_root = base_config.data_root_directory
prev_system_root = base_config.system_root_directory
try:
cognee.config.set_graph_database_provider(provider)
cognee.config.data_root_directory(data_dir)
cognee.config.system_root_directory(system_dir)
# Clean slate
await cognee.prune.prune_data()
await cognee.prune.prune_system(metadata=True)
dataset_name = "cs_explanations"
# Add first document
nlp_path = str(TEST_DATA_DIR / "Natural_language_processing.txt")
await cognee.add([nlp_path], dataset_name)
# Add second document
quantum_path = str(TEST_DATA_DIR / "Quantum_computers.txt")
from cognee.infrastructure.databases.graph import get_graph_engine
graph_engine = await get_graph_engine()
# Graph should be empty before cognify
is_empty = await graph_engine.is_empty()
assert is_empty, f"{provider}: graph should be empty before cognify"
await cognee.add([quantum_path], dataset_name)
is_empty = await graph_engine.is_empty()
assert is_empty, f"{provider}: graph should still be empty before cognify"
# Run cognify (LLM extraction -> graph + vector indexing)
await cognee.cognify([dataset_name])
is_empty = await graph_engine.is_empty()
assert not is_empty, f"{provider}: graph should not be empty after cognify"
# Search via vector to get a node name for graph queries
from cognee.infrastructure.databases.vector import get_vector_engine_async
vector_engine = await get_vector_engine_async()
random_node = (
await vector_engine.search("Entity_name", "Quantum computer", include_payload=True)
)[0]
random_node_name = random_node.payload["text"]
# Test GRAPH_COMPLETION search (exercises graph adapter)
search_results = await cognee.search(
query_type=SearchType.GRAPH_COMPLETION, query_text=random_node_name
)
assert len(search_results) != 0, f"{provider}: GRAPH_COMPLETION returned no results"
# Test CHUNKS search (vector-only, but confirms pipeline integrity)
search_results = await cognee.search(
query_type=SearchType.CHUNKS, query_text=random_node_name
)
assert len(search_results) != 0, f"{provider}: CHUNKS returned no results"
# Test SUMMARIES search
search_results = await cognee.search(
query_type=SearchType.SUMMARIES, query_text=random_node_name
)
assert len(search_results) != 0, f"{provider}: SUMMARIES returned no results"
# Check search history: 3 searches x 2 entries each (query + result) = 6
user = await get_default_user()
history = await get_history(user.id)
assert len(history) == 6, f"{provider}: expected 6 history entries, got {len(history)}"
# Test nodeset filtering via GraphCompletionRetriever
nodeset_text = "Neo4j is a graph database that supports cypher."
await cognee.add([nodeset_text], dataset_name, node_set=["first"])
await cognee.cognify([dataset_name])
# Existing nodeset should return results
graph_retriever = GraphCompletionRetriever(node_type=NodeSet, node_name=["first"])
objects = await graph_retriever.get_retrieved_objects("What is in the context?")
context_nonempty = await graph_retriever.get_context_from_objects(
query="What is in the context?", retrieved_objects=objects
)
# Nonexistent nodeset should return empty
graph_retriever = GraphCompletionRetriever(node_type=NodeSet, node_name=["nonexistent"])
objects = await graph_retriever.get_retrieved_objects("What is in the context?")
context_empty = await graph_retriever.get_context_from_objects(
query="What is in the context?", retrieved_objects=objects
)
assert isinstance(context_nonempty, str) and context_nonempty != "", (
f"{provider}: expected non-empty context for existing nodeset, got: {context_nonempty!r}"
)
assert context_empty == "", (
f"{provider}: expected empty context for nonexistent nodeset, got: {context_empty!r}"
)
# Clean up and verify
await cognee.prune.prune_data()
data_root_directory = get_storage_config()["data_root_directory"]
assert not os.path.isdir(data_root_directory), f"{provider}: local data files not deleted"
await cognee.prune.prune_system(metadata=True)
is_empty = await graph_engine.is_empty()
assert is_empty, f"{provider}: graph should be empty after prune"
finally:
# Restore previous config
cognee.config.set_graph_database_provider(prev_provider)
cognee.config.data_root_directory(prev_data_root)
cognee.config.system_root_directory(prev_system_root)
for path in [data_dir, system_dir]:
if os.path.exists(path):
shutil.rmtree(path)