diff --git a/backend/rag/main.py b/backend/rag/main.py index 962dd23450..37c52e96d4 100644 --- a/backend/rag/main.py +++ b/backend/rag/main.py @@ -3047,10 +3047,46 @@ async def dspy_query(request: DSPyQueryRequest) -> DSPyQueryResponse: if response.status_code == 200: data = response.json() bindings = data.get("results", {}).get("bindings", []) - sparql_results = [ + raw_results = [ {k: v.get("value") for k, v in binding.items()} for binding in bindings ] + + # Transform SPARQL results to match frontend expected format + # Frontend expects: {name, website, metadata: {latitude, longitude, city, ...}} + # SPARQL returns: {name, website, lat, lon, city, ...} + sparql_results = [] + for row in raw_results: + # Parse lat/lon to float if present + lat = None + lon = None + if row.get("lat"): + try: + lat = float(row["lat"]) + except (ValueError, TypeError): + pass + if row.get("lon"): + try: + lon = float(row["lon"]) + except (ValueError, TypeError): + pass + + transformed = { + "name": row.get("name"), + "website": row.get("website"), + "metadata": { + "latitude": lat, + "longitude": lon, + "city": row.get("city") or template_result.slots.get("city"), + "country": row.get("country") or template_result.slots.get("country"), + "region": row.get("region") or template_result.slots.get("region"), + "institution_type": row.get("type") or template_result.slots.get("institution_type"), + }, + "scores": {"combined": 1.0}, # SPARQL results are exact matches + } + sparql_results.append(transformed) + + logger.debug(f"[FACTUAL-QUERY] Transformed {len(sparql_results)} results, {sum(1 for r in sparql_results if r['metadata']['latitude'])} with coordinates") else: sparql_error = f"SPARQL returned {response.status_code}" else: