Skip to content

Commit 61a0442

Browse files
committed
[tools/rdf_converter] Refactor RDF Seq item handling
The handling of RDF Seq items has changed from rdflib version 5 to 6. The intruduced changes support both library versions.
1 parent a5e6f12 commit 61a0442

1 file changed

Lines changed: 59 additions & 20 deletions

File tree

odml/tools/rdf_converter.py

Lines changed: 59 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,13 @@
99
import warnings
1010

1111
from io import StringIO
12+
from rdflib import __version__ as rdflib_version
1213
from rdflib import Graph, Literal, URIRef
1314
from 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.")
1419
from rdflib.namespace import XSD, RDF, RDFS
1520

1621
import yaml
@@ -25,6 +30,16 @@
2530
ODML_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+
2843
def 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

Comments
 (0)