diff --git a/lexical-graph/src/graphrag_toolkit/lexical_graph/storage/graph/graph_utils.py b/lexical-graph/src/graphrag_toolkit/lexical_graph/storage/graph/graph_utils.py index 4f46e99f..b68abe69 100644 --- a/lexical-graph/src/graphrag_toolkit/lexical_graph/storage/graph/graph_utils.py +++ b/lexical-graph/src/graphrag_toolkit/lexical_graph/storage/graph/graph_utils.py @@ -298,6 +298,9 @@ def metadata_filter_to_opencypher_filter(f: MetadataFilter) -> str: else: raise ValueError(f'Invalid metadata filter type: {type(metadata_filter)}') + if not filter_strs: + return '' + if metadata_filters.condition == FilterCondition.NOT: return f"(NOT {' '.join(filter_strs)})" elif metadata_filters.condition == FilterCondition.AND or metadata_filters.condition == FilterCondition.OR: diff --git a/lexical-graph/tests/unit/storage/graph/test_graph_utils.py b/lexical-graph/tests/unit/storage/graph/test_graph_utils.py index e87f6f2e..e58b8aa8 100644 --- a/lexical-graph/tests/unit/storage/graph/test_graph_utils.py +++ b/lexical-graph/tests/unit/storage/graph/test_graph_utils.py @@ -329,3 +329,30 @@ def test_passes_through_to_recursive_parser(self): ) result = filter_config_to_opencypher_filters(config) assert "source.category = 'tech'" in result + + + def test_empty_filters_list_returns_empty_string(self): + """Regression test for issue #408. + + When MetadataFilters has an empty filters list, parse_metadata_filters_recursive + should return '' (empty string) instead of '()' (empty parentheses). + + Without this fix, the VersionManager generates invalid Cypher: + WHERE () AND coalesce(...) + which Neptune Database rejects with MalformedQueryException. + """ + filters = MetadataFilters( + filters=[], + condition=FilterCondition.AND, + ) + result = parse_metadata_filters_recursive(filters) + assert result == '' + + def test_empty_filters_list_or_condition_returns_empty_string(self): + """Same as above but with OR condition.""" + filters = MetadataFilters( + filters=[], + condition=FilterCondition.OR, + ) + result = parse_metadata_filters_recursive(filters) + assert result == ''