99import warnings
1010
1111from io import StringIO
12+ from rdflib import __version__ as rdflib_version
1213from rdflib import Graph , Literal , URIRef
1314from rdflib .graph import Seq
15+ try :
16+ from rdflib .container import Seq as CollSeq
17+ except ImportError as exc :
18+ print ("deprecated rdflib version. Please upgrade to the latest version." )
1419from rdflib .namespace import XSD , RDF , RDFS
1520
1621import yaml
2530ODML_NS = Format .namespace ()
2631
2732
33+ def rdflib_version_major ():
34+ version_split = rdflib_version .split ("." )
35+ if len (version_split ) < 3 :
36+ print ("Could not parse rdflib version %s" % rdflib_version )
37+ return 0
38+ elif not version_split [0 ].isdigit ():
39+ print ("Could not parse rdflib version %s" % rdflib_version )
40+ return int (version_split [0 ])
41+
42+
2843def load_rdf_subclasses ():
2944 """
3045 load_rdf_subclasses loads odml section types to RDF Section subclass types
@@ -133,16 +148,27 @@ def save_odml_values(self, parent_node, rdf_predicate, values):
133148 # Once rdflib upgrades this should be reversed to RDF:li again!
134149 # see https://github.com/RDFLib/rdflib/issues/280
135150 # -- keep until supported
136- # bag = URIRef(ODML_NS + str(uuid.uuid4()))
137- # self.graph.add((bag, RDF.type, RDF.Bag))
138- # self.graph.add((curr_node, fmt.rdf_map(k), bag))
139- # for curr_val in values:
140- # self.graph.add((bag, RDF.li, Literal(curr_val)))
141- counter = 1
142- for curr_val in values :
143- custom_predicate = "%s_%s" % (str (RDF ), counter )
144- self .graph .add ((seq , URIRef (custom_predicate ), Literal (curr_val )))
145- counter = counter + 1
151+ #bag = URIRef(ODML_NS + str(uuid.uuid4()))
152+ #self.graph.add((bag, RDF.type, RDF.Bag))
153+ #self.graph.add((parent_node, rdf_predicate, bag))
154+ #for curr_val in values:
155+ # self.graph.add((bag, RDF.li, Literal(curr_val)))
156+
157+ # support both >=6.0.0 and <6.0.0 versions of rdflib for now
158+ # this is very unsafe handling of the rdflib version but ok for
159+ # now; should be properly handled later on
160+ if rdflib_version_major () < 6 :
161+ counter = 1
162+ for curr_val in values :
163+ custom_predicate = "%s_%s" % (str (RDF ), counter )
164+ self .graph .add ((seq , URIRef (custom_predicate ), Literal (curr_val )))
165+ counter = counter + 1
166+ else :
167+ seq_list = []
168+ for curr_val in values :
169+ seq_list .append (Literal (curr_val ))
170+ s = CollSeq (self .graph , seq , seq_list )
171+ print (s )
146172
147173 def save_odml_list (self , parent_node , rdf_predicate , odml_list ):
148174 """
@@ -349,9 +375,13 @@ def _parse_custom_subclasses(self, custom_subclasses):
349375 self .section_subclasses [k ] = val
350376
351377 def __str__ (self ):
378+ if rdflib_version_major () >= 6 :
379+ return self .convert_to_rdf ().serialize (format = 'turtle' )
352380 return self .convert_to_rdf ().serialize (format = 'turtle' ).decode ("utf-8" )
353381
354382 def __unicode__ (self ):
383+ if rdflib_version_major () >= 6 :
384+ return self .convert_to_rdf ().serialize (format = 'turtle' )
355385 return self .convert_to_rdf ().serialize (format = 'turtle' ).decode ("utf-8" )
356386
357387 def get_rdf_str (self , rdf_format = "turtle" ):
@@ -370,6 +400,8 @@ def get_rdf_str(self, rdf_format="turtle"):
370400 msg = "%s Please choose from the list: %s" % (msg , list (RDF_CONVERSION_FORMATS ))
371401 raise ValueError (msg )
372402
403+ if rdflib_version_major () >= 6 :
404+ return self .convert_to_rdf ().serialize (format = rdf_format )
373405 return self .convert_to_rdf ().serialize (format = rdf_format ).decode ("utf-8" )
374406
375407 def write_file (self , filename , rdf_format = "turtle" ):
@@ -516,18 +548,25 @@ def parse_property(self, prop_uri):
516548 if attr [0 ] == "value" and elems :
517549 prop_attrs [attr [0 ]] = []
518550
519- # rdflib does not respect order with RDF.li items yet, see comment above
520- # support both RDF.li and rdf:_nnn for now.
521- # Remove rdf:_nnn once rdflib respects RDF.li order in an RDF.Seq obj.
522- values = list (self .graph .objects (subject = elems [0 ], predicate = RDF .li ))
523- if values :
524- for curr_val in values :
551+ if rdflib_version_major () >= 6 :
552+ # rdflib version 6.x.x+ should support rdf:_nnn only, RDF.li
553+ # is not supported
554+ print (elems )
555+ for curr_val in elems [0 ].items ():
525556 prop_attrs [attr [0 ]].append (curr_val .toPython ())
526557 else :
527- # rdf:__nnn part
528- val_seq = Seq (graph = self .graph , subject = elems [0 ])
529- for seq_item in val_seq :
530- prop_attrs [attr [0 ]].append (seq_item .toPython ())
558+ # rdflib does not respect order with RDF.li items yet, see comment above
559+ # support both RDF.li and rdf:_nnn for now.
560+ # Remove rdf:_nnn once rdflib respects RDF.li order in an RDF.Seq obj.
561+ values = list (self .graph .objects (subject = elems [0 ], predicate = RDF .li ))
562+ if values :
563+ for curr_val in values :
564+ prop_attrs [attr [0 ]].append (curr_val .toPython ())
565+ else :
566+ # rdf:__nnn part
567+ val_seq = Seq (graph = self .graph , subject = elems [0 ])
568+ for seq_item in val_seq :
569+ prop_attrs [attr [0 ]].append (seq_item .toPython ())
531570
532571 elif attr [0 ] == "id" :
533572 prop_attrs [attr [0 ]] = prop_uri .split ("#" , 1 )[1 ]
0 commit comments