Source code for tooluniverse.wikidata_sparql_tool

import requests
from .base_tool import BaseTool
from .tool_registry import register_tool


[docs] @register_tool("WikidataSPARQLTool") class WikidataSPARQLTool(BaseTool): """ Run SPARQL queries against Wikidata (powering Scholia views). Parameters (arguments): sparql (str): SPARQL query string max_results (int): Optional result limit override """
[docs] def __init__(self, tool_config): super().__init__(tool_config) self.endpoint = "https://query.wikidata.org/sparql"
[docs] def run(self, arguments=None): arguments = arguments or {} sparql = arguments.get("sparql") max_results = arguments.get("max_results") if not sparql: return {"error": "`sparql` parameter is required."} if max_results: # naive limit appending if not present if "limit" not in sparql.lower(): sparql = f"{sparql}\nLIMIT {int(max_results)}" headers = { "Accept": "application/sparql-results+json", "User-Agent": "ToolUniverse/1.0 (https://github.com)", } try: resp = requests.get( self.endpoint, params={"query": sparql, "format": "json"}, headers=headers, timeout=30, ) resp.raise_for_status() data = resp.json() except requests.RequestException as e: return { "error": "Network/API error calling Wikidata SPARQL", "reason": str(e), } except ValueError: return {"error": "Failed to decode SPARQL response as JSON"} bindings = data.get("results", {}).get("bindings", []) # Normalize by unwrapping "value" fields normalized = [] for b in bindings: row = {} for k, v in b.items(): row[k] = v.get("value") normalized.append(row) return normalized