shacl_validation/helpers/
srdf.rs1use 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}