shacl_validation/helpers/
srdf.rs

1use std::collections::HashSet;
2
3use srdf::{matcher::Any, Query, RDFNode, Triple};
4
5use super::helper_error::SRDFError;
6
7pub(crate) fn get_object_for<S: Query>(
8    store: &S,
9    subject: &S::Term,
10    predicate: &S::IRI,
11) -> Result<Option<RDFNode>, SRDFError> {
12    match get_objects_for(store, subject, predicate)?
13        .into_iter()
14        .next()
15    {
16        Some(term) => Ok(Some(term.into())),
17        None => Ok(None),
18    }
19}
20
21pub(crate) fn get_objects_for<S: Query>(
22    store: &S,
23    subject: &S::Term,
24    predicate: &S::IRI,
25) -> Result<HashSet<S::Term>, SRDFError> {
26    let subject: S::Subject = match subject.clone().try_into() {
27        Ok(subject) => subject,
28        Err(_) => {
29            return Err(SRDFError::SRDFTermAsSubject {
30                subject: format!("{subject}"),
31            })
32        }
33    };
34
35    let triples = store
36        .triples_matching(subject, predicate.clone(), Any)
37        .map_err(|e| SRDFError::Srdf {
38            error: e.to_string(),
39        })?
40        .map(Triple::into_object)
41        .collect();
42
43    Ok(triples)
44}
45
46pub(crate) fn get_subjects_for<S: Query>(
47    store: &S,
48    predicate: &S::IRI,
49    object: &S::Term,
50) -> Result<HashSet<S::Term>, SRDFError> {
51    let values = store
52        .triples_matching(Any, predicate.clone(), object.clone())
53        .map_err(|e| SRDFError::Srdf {
54            error: e.to_string(),
55        })?
56        .map(Triple::into_subject)
57        .map(Into::into)
58        .collect();
59    Ok(values)
60}