Skip to content

Commit 19710e2

Browse files
committed
Corrected issues with english version of RDF Triples. Working on generating oxrdf::graph out of the values
1 parent 58a80d1 commit 19710e2

3 files changed

Lines changed: 72 additions & 34 deletions

File tree

Cargo.lock

Lines changed: 10 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,3 +10,4 @@ petgraph = "0.6.5"
1010
serde = "1.0.203"
1111
serde_json = "1.0.117"
1212
struson = "0.5.0"
13+
uuid = { version = "1", features = ["v4"] }

src/main.rs

Lines changed: 61 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,70 +1,74 @@
1-
use oxrdf::{Graph, NamedOrBlankNode};
1+
use oxrdf::vocab::xsd;
2+
use oxrdf::{
3+
graph, BlankNode, Graph, Literal, NamedNode, NamedNodeRef, NamedOrBlankNode, Term, TermRef,
4+
TripleRef,
5+
};
26
use serde::de::value;
37
use serde_json::{Deserializer, Value};
48
use std::collections::{HashMap, VecDeque};
9+
use std::fmt::format;
510
use std::fs::File;
611
use std::io::BufReader;
12+
use uuid::Uuid;
713

814
fn main() {
915
let file = File::open("src/airplane.json").unwrap();
1016
let reader = BufReader::new(file);
1117
let stream = Deserializer::from_reader(reader).into_iter::<Value>();
1218

13-
let mut subject_stack: VecDeque<String> = VecDeque::new();
14-
let mut array_properties: HashMap<String, String> = HashMap::new();
19+
let mut graph = Graph::default();
20+
21+
let mut subject_stack: VecDeque<BlankNode> = VecDeque::new();
1522
let mut property: Option<String> = None;
1623

1724
for value in stream {
1825
match value {
1926
Ok(Value::Object(obj)) => {
20-
let subject = format!("_:b{}", subject_stack.len()); // Create a new blank node
21-
println!("Created new subject: {}", subject);
27+
let subject = BlankNode::default(); // Create a new blank node
2228
subject_stack.push_back(subject.clone());
2329

24-
if let Some(last_subject) = subject_stack.back() {
25-
println!("The last subject in the stack is: {}", last_subject);
26-
if let Some(prop) = &property {
27-
println!("Adding property for parent -> child relationship: {}", prop);
28-
}
29-
}
30-
3130
for (key, val) in obj {
32-
property = Some(format!("#{}", key));
33-
println!("Processing key: {}", key);
34-
process_value(&mut subject_stack, &property, val);
31+
property = Some(format!("https://decisym/json2rdf/#{}", key));
32+
process_value(&mut subject_stack, &property, val, &mut graph);
3533
}
3634

37-
// End of object; remove the subject from stack
3835
subject_stack.pop_back();
3936
}
4037
Ok(Value::Array(arr)) => {
41-
if let Some(last_subject) = subject_stack.back() {
42-
if let Some(prop) = &property {
43-
array_properties.insert(last_subject.clone(), prop.clone());
44-
}
45-
}
4638
for val in arr {
47-
process_value(&mut subject_stack, &property, val);
39+
process_value(&mut subject_stack, &property, val, &mut graph);
4840
}
4941
}
5042
Ok(other) => {
51-
process_value(&mut subject_stack, &property, other);
43+
process_value(&mut subject_stack, &property, other, &mut graph);
5244
}
5345
Err(e) => {
5446
eprintln!("Error parsing JSON: {}", e);
5547
}
5648
}
5749
}
50+
51+
5852
}
5953

60-
fn process_value(subject_stack: &mut VecDeque<String>, property: &Option<String>, value: Value) {
61-
if let Some(last_subject) = subject_stack.back() {
62-
println!("The last subject in the stack is: {}", last_subject);
54+
fn process_value(
55+
subject_stack: &mut VecDeque<BlankNode>,
56+
property: &Option<String>,
57+
value: Value,
58+
graph: &mut Graph,
59+
) {
60+
if let Some(last_subject) = subject_stack.clone().back() {
6361
if let Some(prop) = property {
64-
println!("Processing property: {}", prop);
62+
// println!("Processing property: {}", prop);
6563
match value {
6664
Value::Bool(b) => {
67-
println!("Boolean value: {}", b);
65+
// println!("{},{},{}", subject_stack.back().unwrap(), prop, b);
66+
67+
graph.insert(TripleRef::new(
68+
subject_stack.back().unwrap(),
69+
NamedNodeRef::new(prop.as_str()).unwrap(),
70+
&Literal::new_typed_literal(b.to_string(), xsd::BOOLEAN),
71+
));
6872
}
6973
Value::Number(num) => {
7074
let literal = if let Some(int) = num.as_i64() {
@@ -74,27 +78,50 @@ fn process_value(subject_stack: &mut VecDeque<String>, property: &Option<String>
7478
} else {
7579
return;
7680
};
77-
println!("Number value: {}", literal);
81+
// println!("{},{},{}", subject_stack.back().unwrap(), prop, literal);
82+
graph.insert(TripleRef::new(
83+
subject_stack.back().unwrap(),
84+
NamedNodeRef::new(prop.as_str()).unwrap(),
85+
&Literal::new_typed_literal(literal, xsd::INT),
86+
));
7887
}
7988
Value::String(s) => {
80-
println!("String value: {}", s);
89+
//println!("{},{},{}", subject_stack.back().unwrap(), prop, s);
90+
graph.insert(TripleRef::new(
91+
subject_stack.back().unwrap(),
92+
NamedNodeRef::new(prop.as_str()).unwrap(),
93+
&Literal::new_typed_literal(s, xsd::STRING),
94+
));
8195
}
8296
Value::Null => {
8397
println!("Null value");
8498
}
8599
Value::Object(obj) => {
86-
let subject = format!("_:b{}", subject_stack.len());
87-
println!("Created nested subject: {}", subject);
100+
let subject = BlankNode::default();
88101
subject_stack.push_back(subject);
102+
103+
// println!(
104+
// "{},{},{}",
105+
// last_subject,
106+
// prop,
107+
// subject_stack.back().unwrap()
108+
// );
109+
110+
graph.insert(TripleRef::new(
111+
subject_stack.back().unwrap(),
112+
NamedNodeRef::new(prop.as_str()).unwrap(),
113+
subject_stack.back().unwrap(),
114+
));
115+
89116
for (key, val) in obj {
90117
let nested_property = Some(format!("#{}", key));
91-
process_value(subject_stack, &nested_property, val);
118+
process_value(subject_stack, &nested_property, val, graph);
92119
}
93120
subject_stack.pop_back();
94121
}
95122
Value::Array(arr) => {
96123
for val in arr {
97-
process_value(subject_stack, property, val);
124+
process_value(subject_stack, property, val, graph);
98125
}
99126
}
100127
}

0 commit comments

Comments
 (0)