Skip to content

Commit 549e870

Browse files
committed
Build namespace map of ontology on initialization
1 parent bd07830 commit 549e870

File tree

3 files changed

+44
-38
lines changed

3 files changed

+44
-38
lines changed

lib/src/api.rs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -685,7 +685,12 @@ impl OntoEnv {
685685
let mut namespace_map = HashMap::new();
686686
for graph_id in graph_ids {
687687
let ontology = self.get_ontology(graph_id)?;
688-
namespace_map.extend(ontology.get_namespace_map()?);
688+
namespace_map.extend(
689+
ontology
690+
.namespace_map()
691+
.iter()
692+
.map(|(k, v)| (k.clone(), v.clone())),
693+
);
689694
}
690695

691696
// Rewrite sh:prefixes

lib/src/doctor.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -134,13 +134,13 @@ impl EnvironmentCheck for ConflictingPrefixes {
134134

135135
for graph_id in &closure_ids {
136136
let ontology = env.get_ontology(graph_id)?;
137-
let ns_map = ontology.get_namespace_map()?;
137+
let ns_map = ontology.namespace_map();
138138
if let Some(location) = ontology.location() {
139139
for (prefix, namespace) in ns_map {
140140
closure_prefix_map
141-
.entry(prefix)
141+
.entry(prefix.to_string())
142142
.or_default()
143-
.entry(namespace)
143+
.entry(namespace.to_string())
144144
.or_default()
145145
.push(location.clone());
146146
}

lib/src/ontology.rs

Lines changed: 35 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -216,6 +216,7 @@ pub struct Ontology {
216216
pub last_updated: Option<DateTime<Utc>>,
217217
#[serde_as(as = "HashMap<LocalType, _>")]
218218
version_properties: HashMap<NamedNode, String>,
219+
namespace_map: HashMap<String, String>,
219220
}
220221

221222
// impl display; name + location + last updated, then indented version properties
@@ -247,6 +248,7 @@ impl Default for Ontology {
247248
location: None,
248249
last_updated: None,
249250
version_properties: HashMap::new(),
251+
namespace_map: HashMap::new(),
250252
}
251253
}
252254
}
@@ -310,40 +312,8 @@ impl Ontology {
310312
serde_json::to_string_pretty(self).unwrap()
311313
}
312314

313-
pub fn get_namespace_map(&self) -> Result<HashMap<String, String>> {
314-
let graph = self.graph()?;
315-
let mut namespace_map = HashMap::new();
316-
317-
let declare_prop = NamedNode::new_unchecked("http://www.w3.org/ns/shacl#declare");
318-
let prefix_prop = NamedNode::new_unchecked("http://www.w3.org/ns/shacl#prefix");
319-
let namespace_prop = NamedNode::new_unchecked("http://www.w3.org/ns/shacl#namespace");
320-
321-
let ontology_name_subject: Subject = self.name().into();
322-
323-
for decl_obj_ref in
324-
graph.objects_for_subject_predicate(ontology_name_subject.as_ref(), declare_prop.as_ref())
325-
{
326-
let decl_subj: SubjectRef = match decl_obj_ref {
327-
TermRef::NamedNode(n) => n.into(),
328-
TermRef::BlankNode(b) => b.into(),
329-
_ => continue,
330-
};
331-
332-
let prefix_term = graph.object_for_subject_predicate(decl_subj, prefix_prop.as_ref());
333-
let namespace_term =
334-
graph.object_for_subject_predicate(decl_subj, namespace_prop.as_ref());
335-
336-
if let (Some(TermRef::Literal(prefix_lit)), Some(TermRef::Literal(namespace_lit))) =
337-
(prefix_term, namespace_term)
338-
{
339-
namespace_map.insert(
340-
prefix_lit.value().to_string(),
341-
namespace_lit.value().to_string(),
342-
);
343-
}
344-
}
345-
346-
Ok(namespace_map)
315+
pub fn namespace_map(&self) -> &HashMap<String, String> {
316+
&self.namespace_map
347317
}
348318

349319
pub fn from_graph(
@@ -377,6 +347,36 @@ impl Ontology {
377347
}
378348
};
379349
debug!("got ontology name: {}", ontology_name);
350+
351+
let mut namespace_map = HashMap::new();
352+
353+
let declare_prop = NamedNode::new_unchecked("http://www.w3.org/ns/shacl#declare");
354+
let prefix_prop = NamedNode::new_unchecked("http://www.w3.org/ns/shacl#prefix");
355+
let namespace_prop = NamedNode::new_unchecked("http://www.w3.org/ns/shacl#namespace");
356+
357+
for decl_obj_ref in
358+
graph.objects_for_subject_predicate(ontology_name.as_ref(), declare_prop.as_ref())
359+
{
360+
let decl_subj: SubjectRef = match decl_obj_ref {
361+
TermRef::NamedNode(n) => n.into(),
362+
TermRef::BlankNode(b) => b.into(),
363+
_ => continue,
364+
};
365+
366+
let prefix_term = graph.object_for_subject_predicate(decl_subj, prefix_prop.as_ref());
367+
let namespace_term =
368+
graph.object_for_subject_predicate(decl_subj, namespace_prop.as_ref());
369+
370+
if let (Some(TermRef::Literal(prefix_lit)), Some(TermRef::Literal(namespace_lit))) =
371+
(prefix_term, namespace_term)
372+
{
373+
namespace_map.insert(
374+
prefix_lit.value().to_string(),
375+
namespace_lit.value().to_string(),
376+
);
377+
}
378+
}
379+
380380
let imports: Vec<TermRef> = graph
381381
.objects_for_subject_predicate(ontology_name.as_ref(), IMPORTS)
382382
.collect::<Vec<_>>();
@@ -458,6 +458,7 @@ impl Ontology {
458458
location: Some(location),
459459
version_properties,
460460
last_updated: None,
461+
namespace_map,
461462
})
462463
}
463464

0 commit comments

Comments
 (0)