Skip to main content

qualia_client_core/engine/
ingestion.rs

1use qualia_core_db::sparql_library::parsers::csv_parser::{parse_csv_to_quins, CsvMappingProfile};
2use qualia_core_db::sparql_library::parsers::json_parser::{
3    parse_json_to_quins, JsonMappingProfile,
4};
5use qualia_core_db::sparql_library::serialisers::csv_serializer::{
6    serialize_quins_to_csv, CsvSerializationProfile,
7};
8use qualia_core_db::sparql_library::serialisers::json_serializer::{
9    serialize_quins_to_json, JsonSerializationProfile,
10};
11use qualia_core_db::sparql_library::serialisers::rdf_serializers::{
12    serialize_to_jsonld, serialize_to_n3, serialize_to_nquads, serialize_to_ntriples,
13    serialize_to_trig, serialize_to_turtle,
14};
15use serde::{Deserialize, Serialize};
16use std::fs::File;
17use std::io::{BufReader, BufWriter};
18
19#[derive(Serialize, Deserialize, Debug, Clone)]
20pub struct SemanticBookmark {
21    pub entity: String,
22    pub tags: Vec<String>,
23}
24
25#[derive(Serialize, Deserialize, Debug, Clone)]
26pub struct IngestionResult {
27    pub message: String,
28    pub bookmarks: Vec<SemanticBookmark>,
29}
30
31/// Executes the Edge VLM Pipeline to parse unstructured PDFs into Semantic Bookmarks.
32/// Resolves inline Context Markup Language (CML/CMLD) URIs against the dynamic Ontology Registry.
33pub fn process_pdf(file_name: &str) -> Result<IngestionResult, String> {
34    println!("Edge VLM parsing document: {}", file_name);
35
36    let simulated_bookmarks = vec![
37        SemanticBookmark {
38            entity: format!("Document Root: {}", file_name),
39            tags: vec!["Source:PDF".to_string(), "Status:Ingested".to_string()],
40        },
41        SemanticBookmark {
42            entity: "Article 12: Right to Privacy".to_string(),
43            tags: vec![
44                "UN-HR".to_string(),
45                "HCAI:Agency".to_string(),
46                "Protection-Mandate".to_string(),
47            ],
48        },
49        SemanticBookmark {
50            entity: "Informed Consent Schema".to_string(),
51            tags: vec![
52                "HCAI:Agreements".to_string(),
53                "ODRL".to_string(),
54                "Proxy-Consent".to_string(),
55            ],
56        },
57    ];
58
59    Ok(IngestionResult {
60        message: format!(
61            "Successfully mapped {} to dynamic ontology registry.",
62            file_name
63        ),
64        bookmarks: simulated_bookmarks,
65    })
66}
67
68/// Parse CSV file using core-db parser
69pub fn parse_csv(
70    file_path: &str,
71    profile: &mut CsvMappingProfile,
72) -> Result<Vec<qualia_core_db::NQuin>, String> {
73    let file = File::open(file_path).map_err(|e| format!("Failed to open CSV: {}", e))?;
74    let mut quins = Vec::new();
75
76    parse_csv_to_quins(file, profile, |quin| {
77        quins.push(quin);
78    })?;
79
80    Ok(quins)
81}
82
83/// Parse JSON file using core-db parser
84pub fn parse_json(
85    file_path: &str,
86    profile: &JsonMappingProfile,
87) -> Result<Vec<qualia_core_db::NQuin>, String> {
88    let file = File::open(file_path).map_err(|e| format!("Failed to open JSON: {}", e))?;
89    let reader = BufReader::new(file);
90    let mut quins = Vec::new();
91
92    parse_json_to_quins(reader, profile, |quin| {
93        quins.push(quin);
94    })?;
95
96    Ok(quins)
97}
98
99/// Serialize Quins to CSV file
100pub fn serialize_to_csv_file(
101    file_path: &str,
102    quins: &[qualia_core_db::NQuin],
103    profile: &CsvSerializationProfile,
104) -> Result<(), String> {
105    let file = File::create(file_path).map_err(|e| format!("Failed to create CSV file: {}", e))?;
106    let mut writer = BufWriter::new(file);
107    serialize_quins_to_csv(&mut writer, quins, profile)?;
108    Ok(())
109}
110
111/// Serialize Quins to JSON file
112pub fn serialize_to_json_file(
113    file_path: &str,
114    quins: &[qualia_core_db::NQuin],
115    profile: &JsonSerializationProfile,
116) -> Result<(), String> {
117    let file = File::create(file_path).map_err(|e| format!("Failed to create JSON file: {}", e))?;
118    let mut writer = BufWriter::new(file);
119    serialize_quins_to_json(&mut writer, quins, profile)?;
120    Ok(())
121}
122
123/// Serialize Quins to RDF format file
124pub fn serialize_to_rdf_file(
125    file_path: &str,
126    quins: &[qualia_core_db::NQuin],
127    format: RdfFormat,
128) -> Result<(), String> {
129    let file = File::create(file_path).map_err(|e| format!("Failed to create RDF file: {}", e))?;
130    let mut writer = BufWriter::new(file);
131
132    match format {
133        RdfFormat::NTriples => serialize_to_ntriples(&mut writer, quins)?,
134        RdfFormat::Turtle => serialize_to_turtle(&mut writer, quins)?,
135        RdfFormat::NQuads => serialize_to_nquads(&mut writer, quins)?,
136        RdfFormat::TriG => serialize_to_trig(&mut writer, quins)?,
137        RdfFormat::N3 => serialize_to_n3(&mut writer, quins)?,
138        RdfFormat::JsonLd => serialize_to_jsonld(&mut writer, quins)?,
139    }
140
141    Ok(())
142}
143
144#[derive(Debug, Clone, Copy)]
145pub enum RdfFormat {
146    NTriples,
147    Turtle,
148    NQuads,
149    TriG,
150    N3,
151    JsonLd,
152}