From a8938176bef91e2f6ad4b4a5e96ef3b4f2856029fca5e448ee5f852bccff1b49 Mon Sep 17 00:00:00 2001 From: Alex Wied <2+alex@noreply.code.graphofliberty.org> Date: Wed, 26 Aug 2026 20:43:01 -0400 Subject: [PATCH] . --- graph/src/class.rs | 22 +++++++++++++++------- graph/src/curie.rs | 7 ++++--- graph/src/vocab.rs | 14 ++++++++++++++ publish/src/app.rs | 24 +++++++++++++++++------- 4 files changed, 50 insertions(+), 17 deletions(-) diff --git a/graph/src/class.rs b/graph/src/class.rs index 7bbb811..a67f86e 100644 --- a/graph/src/class.rs +++ b/graph/src/class.rs @@ -1,6 +1,6 @@ use std::collections::HashMap; use std::fmt::Display; -use oxigraph::model::{Graph, Literal, NamedNode, NamedNodeRef, NamedOrBlankNode, Term, Triple}; +use oxigraph::model::{Graph, Literal, NamedNode, NamedNodeRef, NamedOrBlankNode, Term, TermRef, Triple}; use oxilangtag::LanguageTag; use url::Url; use gl_search::Schema; @@ -118,25 +118,33 @@ impl Class { pub fn next_url(&self) -> Option { match self { Class::Work => Some(Url::parse("http://fedora.quill.lan/rest/#Work").unwrap()), + Class::Person => Some(Url::parse("http://fedora.quill.lan/rest/#Agent").unwrap()), + Class::CorporateBody => Some(Url::parse("http://fedora.quill.lan/rest/#Agent").unwrap()), + Class::Expression => Some(Url::parse("http://fedora.quill.lan/rest/#Expression").unwrap()), + Class::Manifestation => Some(Url::parse("http://fedora.quill.lan/rest/#Manifestation").unwrap()), _ => None, } } pub fn template(&self, subject: NamedNode) -> Graph { - let empty_english_string = Term::Literal(Literal::new_language_tagged_literal_unchecked("", "en")); - let empty_node = Term::NamedNode(NamedNode::new_unchecked("#")); + let empty_english_string_term = Term::Literal(Literal::new_language_tagged_literal_unchecked("", "en")); + let empty_string_term = Term::Literal(Literal::new_simple_literal("")); + let empty_node = NamedNode::new_unchecked(""); + let hash_node = NamedNode::new_unchecked("#"); match self { Class::RdfProperty => Graph::new(), Class::RdfsClass => Graph::new(), Class::SkosConcept => Graph::new(), Class::Work => Graph::from_iter([ - Triple::new(NamedOrBlankNode::NamedNode(subject), vocab::rdawd::TITLE_OF_WORK, empty_english_string) + Triple::new(NamedOrBlankNode::NamedNode(subject), vocab::rdawd::TITLE_OF_WORK, empty_english_string_term) ]), Class::Person => Graph::from_iter([ - Triple::new(NamedOrBlankNode::NamedNode(subject.clone()), vocab::rdaao::IDENTIFIER_FOR_PERSON, empty_node), - Triple::new(NamedOrBlankNode::NamedNode(subject.clone()), vocab::rdaad::GIVEN_NAME, empty_english_string.clone()), - Triple::new(NamedOrBlankNode::NamedNode(subject), vocab::rdaad::SURNAME, empty_english_string), + Triple::new(NamedOrBlankNode::NamedNode(subject.clone()), vocab::rdaad::GIVEN_NAME, empty_english_string_term.clone()), + Triple::new(NamedOrBlankNode::NamedNode(subject.clone()), vocab::rdaad::SURNAME, empty_english_string_term), + Triple::new(NamedOrBlankNode::NamedNode(subject.clone()), vocab::rdaao::IDENTIFIER_FOR_PERSON, Term::NamedNode(hash_node.clone())), + Triple::new(NamedOrBlankNode::NamedNode(hash_node.clone()), vocab::rdano::SCHEME_OF_NOMEN, Term::NamedNode(empty_node)), + Triple::new(NamedOrBlankNode::NamedNode(subject.clone()), vocab::rdand::NOMEN_STRING, empty_string_term), ]), Class::CorporateBody => Graph::new(), Class::Expression => Graph::new(), diff --git a/graph/src/curie.rs b/graph/src/curie.rs index bc6e325..1cf0e57 100644 --- a/graph/src/curie.rs +++ b/graph/src/curie.rs @@ -19,9 +19,10 @@ pub static PREFIXES: LazyLock> = LazyLock::new(|| { "http://www.ebu.ch/metadata/ontologies/ebucore/ebucore#", ), ("prov", "http://www.w3.org/ns/prov#"), - ("locid", "http://id.loc.gov/vocabulary/identifiers/"), - ("locname", "http://id.loc.gov/authorities/names/"), - ("loclang", "http://id.loc.gov/vocabulary/languages/"), + ("lcid", "http://id.loc.gov/vocabulary/identifiers/"), + ("lca", "http://id.loc.gov/authorities/"), + ("lcn", "http://id.loc.gov/authorities/names/"), + ("lclang", "http://id.loc.gov/vocabulary/languages/"), ("viaf", "http://viaf.org/viaf/"), ("premis", "http://www.loc.gov/premis/rdf/v1#"), ("premis3", "http://www.loc.gov/premis/rdf/v3/"), diff --git a/graph/src/vocab.rs b/graph/src/vocab.rs index a3b1b11..72dd69b 100644 --- a/graph/src/vocab.rs +++ b/graph/src/vocab.rs @@ -86,4 +86,18 @@ pub mod rdamd { pub const TITLE_OF_MANIFESTATION: NamedNodeRef = NamedNodeRef::new_unchecked("http://rdaregistry.info/Elements/m/datatype/P30335"); +} + +pub mod rdand { + use oxigraph::model::NamedNodeRef; + + pub const NOMEN_STRING: NamedNodeRef = + NamedNodeRef::new_unchecked("http://rdaregistry.info/Elements/n/datatype/P80068"); +} + +pub mod rdano { + use oxigraph::model::NamedNodeRef; + + pub const SCHEME_OF_NOMEN: NamedNodeRef = + NamedNodeRef::new_unchecked("http://rdaregistry.info/Elements/n/object/P80069"); } \ No newline at end of file diff --git a/publish/src/app.rs b/publish/src/app.rs index 1e1439b..0358979 100644 --- a/publish/src/app.rs +++ b/publish/src/app.rs @@ -37,7 +37,7 @@ pub(crate) enum Message { CacheDatatypes(HashMap), CacheReadOnlyEntities(HashSet), PopulateCaches, - LookupResourceDescriptions(Vec), + LookupResourceDescriptions(HashSet), CacheResourceDescriptions(HashMap), WindowClosed(window::Id), URLInputChanged(String), @@ -409,7 +409,7 @@ impl Publisher { } Message::SearchResultClicked(node) => { if let Some(search_state) = &self.search_state { - task = task.chain(Task::done(Message::LookupResourceDescriptions(vec![node.clone()]))); + task = task.chain(Task::done(Message::LookupResourceDescriptions(HashSet::from_iter([node.clone()])))); match search_state.action { SearchResultClickAction::URLInput => { @@ -545,12 +545,22 @@ impl Publisher { } Message::NewDocument(class, Some(url)) => { let mut document: RdfSource> = RdfSource::new(url.clone()); - let mut quad = document.new_quad(); - quad.predicate = vocab::rdf::TYPE.into_owned(); - quad.object = Term::NamedNode(class.to_named_node().into_owned()); - document.dataset_mut().quads.insert(quad); + let mut nodes_to_look_up = HashSet::new(); + let document_node = NamedNode::new_unchecked(url.as_str()); + for triple in &class.template(document_node) { + let quad = document.quad_from_triple(triple.into_owned()); + document.dataset_mut().quads.insert(quad); - task = Task::done(Message::HideNewDocumentButtons) + if triple.predicate == vocab::rdf::TYPE && + let TermRef::NamedNode(node) = triple.object { + nodes_to_look_up.insert(node.into_owned()); + } else { + nodes_to_look_up.insert(triple.predicate.into_owned()); + } + } + + task = Task::done(Message::LookupResourceDescriptions(nodes_to_look_up)) + .chain(Task::done(Message::HideNewDocumentButtons)) .chain(Task::done(Message::URLInputChanged(url.to_string()))) .chain(Task::done(Message::LoadDocument(document))); }