|
21 | 21 | EmbeddingRequiredError,
|
22 | 22 | RetrieverInitializationError,
|
23 | 23 | SearchValidationError,
|
| 24 | + SearchQueryParseError, |
24 | 25 | )
|
25 | 26 | from neo4j_graphrag.neo4j_queries import get_search_query
|
26 | 27 | from neo4j_graphrag.retrievers import HybridCypherRetriever, HybridRetriever
|
@@ -793,3 +794,73 @@ def test_hybrid_cypher_linear_ranker(
|
793 | 794 | ],
|
794 | 795 | metadata={"__retriever": "HybridCypherRetriever"},
|
795 | 796 | )
|
| 797 | + |
| 798 | + |
| 799 | +@patch("neo4j_graphrag.retrievers.HybridRetriever._fetch_index_infos") |
| 800 | +@patch("neo4j_graphrag.retrievers.base.get_version") |
| 801 | +def test_hybrid_retriever_invalid_lucene_query_error( |
| 802 | + mock_get_version: MagicMock, |
| 803 | + _fetch_index_infos_mock: MagicMock, |
| 804 | + driver: MagicMock, |
| 805 | + embedder: MagicMock, |
| 806 | +) -> None: |
| 807 | + mock_get_version.return_value = ((5, 23, 0), False, False) |
| 808 | + |
| 809 | + error_message = ( |
| 810 | + "Failed to invoke procedure `db.index.fulltext.queryNodes`: " |
| 811 | + "Caused by: org.apache.lucene.queryparser.classic.ParseException: " |
| 812 | + 'Encountered " <FUZZY_SLOP> "~aliens " at line 1, column 0.' |
| 813 | + ) |
| 814 | + client_error = neo4j.exceptions.ClientError(error_message) |
| 815 | + driver.execute_query.side_effect = client_error |
| 816 | + |
| 817 | + retriever = HybridRetriever( |
| 818 | + driver=driver, |
| 819 | + vector_index_name="vector-index", |
| 820 | + fulltext_index_name="fulltext-index", |
| 821 | + embedder=embedder, |
| 822 | + ) |
| 823 | + retriever.neo4j_version_is_5_23_or_above = True |
| 824 | + retriever._embedding_node_property = "embedding" |
| 825 | + |
| 826 | + with pytest.raises( |
| 827 | + SearchQueryParseError, match="Invalid Lucene query generated from query_text" |
| 828 | + ): |
| 829 | + retriever.search(query_text="~aliens", top_k=5) |
| 830 | + |
| 831 | + |
| 832 | +@patch("neo4j_graphrag.retrievers.HybridCypherRetriever._fetch_index_infos") |
| 833 | +@patch("neo4j_graphrag.retrievers.base.get_version") |
| 834 | +def test_hybrid_cypher_retriever_invalid_lucene_query_error( |
| 835 | + mock_get_version: MagicMock, |
| 836 | + _fetch_index_infos_mock: MagicMock, |
| 837 | + driver: MagicMock, |
| 838 | + embedder: MagicMock, |
| 839 | +) -> None: |
| 840 | + mock_get_version.return_value = ((5, 23, 0), False, False) |
| 841 | + retrieval_query = """ |
| 842 | + RETURN node.id AS node_id, node.text AS text, score, {test: $param} AS metadata |
| 843 | + """ |
| 844 | + |
| 845 | + error_message = ( |
| 846 | + "Failed to invoke procedure `db.index.fulltext.queryNodes`: " |
| 847 | + "Caused by: org.apache.lucene.queryparser.classic.ParseException: " |
| 848 | + 'Encountered " <FUZZY_SLOP> "~aliens " at line 1, column 0.' |
| 849 | + ) |
| 850 | + client_error = neo4j.exceptions.ClientError(error_message) |
| 851 | + driver.execute_query.side_effect = client_error |
| 852 | + |
| 853 | + retriever = HybridCypherRetriever( |
| 854 | + driver=driver, |
| 855 | + vector_index_name="vector-index", |
| 856 | + fulltext_index_name="fulltext-index", |
| 857 | + embedder=embedder, |
| 858 | + retrieval_query=retrieval_query, |
| 859 | + ) |
| 860 | + retriever.neo4j_version_is_5_23_or_above = True |
| 861 | + retriever._embedding_node_property = "embedding" |
| 862 | + |
| 863 | + with pytest.raises( |
| 864 | + SearchQueryParseError, match="Invalid Lucene query generated from query_text" |
| 865 | + ): |
| 866 | + retriever.search(query_text="~aliens", top_k=5) |
0 commit comments