use oxirouter::{OxiRouterError, Query, Router};
const VOID_TTL: &str = r#"
@prefix void: <http://rdfs.org/ns/void#> .
@prefix dcterms: <http://purl.org/dc/terms/> .
@prefix oxirouter: <https://oxirouter.dev/ns#> .
@prefix dbo: <http://dbpedia.org/ontology/> .
<https://dbpedia.org/sparql> a void:Dataset ;
void:sparqlEndpoint <https://dbpedia.org/sparql> ;
void:vocabulary <http://dbpedia.org/ontology/> ;
dcterms:spatial "EU" .
"#;
fn main() -> Result<(), OxiRouterError> {
let mut router = Router::new();
router.register_from_void_ttl(VOID_TTL)?;
println!(
"Loaded {} source(s) from VoID descriptor.",
router.source_count()
);
router.add_source(
oxirouter::DataSource::new("wikidata", "https://query.wikidata.org/sparql")
.with_vocabulary("http://www.wikidata.org/")
.with_region("EU"),
);
let query = Query::parse(
"PREFIX dbo: <http://dbpedia.org/ontology/> \
SELECT ?city ?pop WHERE { \
?city a dbo:City ; dbo:populationTotal ?pop \
} ORDER BY DESC(?pop) LIMIT 20",
)?;
let ranking = router.route(&query)?;
println!("Routing result for DBpedia city query:");
if let Some(best) = ranking.best() {
println!(
" Best: {} (confidence: {:.2})",
best.source_id, best.confidence
);
}
for sel in ranking.sources.iter() {
println!(
" {}: confidence={:.3} reason={:?}",
sel.source_id, sel.confidence, sel.reason
);
}
Ok(())
}