linked_data_sparql/
lib.rs

1//! SPARQL query generation for linked data.
2//!
3//! ```rust
4//! use linked_data_sparql::{Sparql, SparqlQuery};
5//!
6//! #[derive(Sparql, Debug, PartialEq)]
7//! #[ld(prefix("ex" = "http://example.org/"))]
8//! struct Person {
9//!   #[ld("ex:name")]
10//!   name: String,
11//!
12//!   #[ld("ex:age")]
13//!   age: u32,
14//! }
15//!
16//! let _string_sparql_query = Person::sparql_query();
17//! ```
18
19mod construct_query;
20pub mod sparql_graph_store;
21mod sparql_query;
22mod to_construct_query;
23
24pub mod rdf_type_conversions;
25
26pub use crate::construct_query::ConstructQuery;
27pub use crate::sparql_query::SparqlQuery;
28pub use crate::to_construct_query::ToConstructQuery;
29pub use construct_query::and::And;
30pub use construct_query::join::Join;
31pub use construct_query::union::Union;
32pub use linked_data_sparql_derive::Sparql;
33use spargebra::Query;
34use spargebra::term::{NamedNode, Variable};
35
36pub mod reexport {
37  pub use spargebra;
38}
39
40impl<T> SparqlQuery for T
41where
42  T: ToConstructQuery,
43{
44  fn sparql_query_algebra() -> Query {
45    Self::to_query().into()
46  }
47}
48
49pub fn with_predicate<F>(
50  predicate: NamedNode,
51  to_query_with_binding: F,
52) -> impl FnOnce(Variable) -> ConstructQuery
53where
54  F: FnOnce(Variable) -> ConstructQuery,
55{
56  |subject| {
57    let object = Variable::new_unchecked(spargebra::term::BlankNode::default().into_string());
58
59    ConstructQuery::new(subject, predicate, object.clone()).join(to_query_with_binding(object))
60  }
61}