From 007c7d403e2a405cb9d01683cafdafca88d3f043 Mon Sep 17 00:00:00 2001 From: Pavel Zorin Date: Sat, 8 Nov 2025 22:34:27 +0100 Subject: [PATCH] Fix cypher search (#1739) ## Description Resolve issue with cypher search by encoding the return value from the cypher query into JSON. Uses fastapi json encoder ## Type of Change - [x] Bug fix (non-breaking change that fixes an issue) - [ ] New feature (non-breaking change that adds functionality) - [ ] Breaking change (fix or feature that would cause existing functionality to change) - [ ] Documentation update - [ ] Code refactoring - [ ] Performance improvement - [ ] Other (please specify): ## Screenshots/Videos (if applicable) Example of result now with Cypher search with the following query "MATCH (src)-[rel]->(nbr) RETURN src, rel" on Simple example: ``` { "search_result":[ [ [ { "_id":{ "offset":0, "table":0 }, "_label":"Node", "id":"87372381-a9fe-5b82-9c92-3f5dbab1bc35", "name":"", "type":"DocumentChunk", "created_at":"2025-11-05T14:12:46.707597", "updated_at":"2025-11-05T14:12:54.801747", "properties":"{\"created_at\": 1762351945009, \"updated_at\": 1762351945009, \"ontology_valid\": false, \"version\": 1, \"topological_rank\": 0, \"metadata\": {\"index_fields\": [\"text\"]}, \"belongs_to_set\": null, \"text\": \"\\n Natural language processing (NLP) is an interdisciplinary\\n subfield of computer science and information retrieval.\\n \", \"chunk_size\": 48, \"chunk_index\": 0, \"cut_type\": \"paragraph_end\"}" }, { "_src":{ "offset":0, "table":0 }, "_dst":{ "offset":1, "table":0 }, "_label":"EDGE", "_id":{ "offset":0, "table":1 }, "relationship_name":"contains", "created_at":"2025-11-05T14:12:47.217590", "updated_at":"2025-11-05T14:12:55.193003", "properties":"{\"source_node_id\": \"87372381-a9fe-5b82-9c92-3f5dbab1bc35\", \"target_node_id\": \"bc338a39-64d6-549a-acec-da60846dd90d\", \"relationship_name\": \"contains\", \"updated_at\": \"2025-11-05 14:12:54\", \"relationship_type\": \"contains\", \"edge_text\": \"relationship_name: contains; entity_name: natural language processing (nlp); entity_description: An interdisciplinary subfield of computer science and information retrieval concerned with interactions between computers and human (natural) languages.\"}" } ] ] ], "dataset_id":"UUID(""af4b1c1c-90fc-59b7-952c-1da9bbde370c"")", "dataset_name":"main_dataset", "graphs":"None" } ``` Relates to https://github.com/topoteretes/cognee/pull/1725 Issue: https://github.com/topoteretes/cognee/issues/1723 ## Pre-submission Checklist - [ ] **I have tested my changes thoroughly before submitting this PR** - [ ] **This PR contains minimal changes necessary to address the issue/feature** - [ ] My code follows the project's coding standards and style guidelines - [ ] I have added tests that prove my fix is effective or that my feature works - [ ] I have added necessary documentation (if applicable) - [ ] All new and existing tests pass - [ ] I have searched existing PRs to ensure this change hasn't been submitted already - [ ] I have linked any relevant issues in the description - [ ] My commits have clear and descriptive messages ## DCO Affirmation I affirm that all code in every commit of this pull request conforms to the terms of the Topoteretes Developer Certificate of Origin. --- cognee/modules/retrieval/cypher_search_retriever.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/cognee/modules/retrieval/cypher_search_retriever.py b/cognee/modules/retrieval/cypher_search_retriever.py index 9978f2536..01816f3df 100644 --- a/cognee/modules/retrieval/cypher_search_retriever.py +++ b/cognee/modules/retrieval/cypher_search_retriever.py @@ -1,4 +1,6 @@ from typing import Any, Optional +from fastapi.encoders import jsonable_encoder + from cognee.infrastructure.databases.graph import get_graph_engine from cognee.modules.retrieval.base_retriever import BaseRetriever from cognee.modules.retrieval.utils.completion import generate_completion @@ -50,7 +52,7 @@ class CypherSearchRetriever(BaseRetriever): logger.warning("Search attempt on an empty knowledge graph") return [] - result = await graph_engine.query(query) + result = jsonable_encoder(await graph_engine.query(query)) except Exception as e: logger.error("Failed to execture cypher search retrieval: %s", str(e)) raise CypherSearchError() from e