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+ } ;
26use serde:: de:: value;
37use serde_json:: { Deserializer , Value } ;
48use std:: collections:: { HashMap , VecDeque } ;
9+ use std:: fmt:: format;
510use std:: fs:: File ;
611use std:: io:: BufReader ;
12+ use uuid:: Uuid ;
713
814fn 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