def semantic_search(query_text, n=5): # Get query embedding query_embedding = get_embedding(query_text) if not query_embedding: print("Failed to get query embedding") return [] # Search for similar products using dot product and magnitude for cosine similarity results = graph.run(""" MATCH (p:Product) WHERE p.description_embedding IS NOT NULL WITH p, reduce(dot = 0.0, i in range(0, size(p.description_embedding)-1) | dot + p.description_embedding[i] * $embedding[i]) / (sqrt(reduce(a = 0.0, i in range(0, size(p.description_embedding)-1) | a + p.description_embedding[i] * p.description_embedding[i])) * sqrt(reduce(b = 0.0, i in range(0, size($embedding)-1) | b + $embedding[i] * $embedding[i]))) AS similarity WHERE similarity > 0 RETURN p.name as name, p.description as description, p.price as price, similarity as score ORDER BY similarity DESC LIMIT $n """, parameters={'embedding': query_embedding, 'n': n}).data() return results # Test the search with debug info print("nTesting semantic search:") results = semantic_search("Give me a set of cards", n=2) print(f"nNumber of results: {len(results)}") for r in results: print(f"nProduct: {r.get('name', 'No name')}") print(f"Price: ${r.get('price', 'N/A')}") print(f"Score: {r.get('score', 'N/A'):.3f}") desc = r.get('description', 'No description') print(f"Description: {desc}")