@@ -162,6 +162,8 @@ def generate_rdf_content(self):
162162
163163 total_lines = sum (1 for line in open (self .path ))
164164 row_number = 0
165+ feature_dict = {}
166+ delayed_link = []
165167
166168 for rec in GFF .parse (handle , limit_info = limit , target_lines = 1 ):
167169
@@ -196,9 +198,11 @@ def generate_rdf_content(self):
196198 else :
197199 entity = self .namespace_entity [self .format_uri (self .format_gff_entity (feature .qualifiers ["ID" ][0 ]))]
198200 entity_label = self .format_gff_entity (feature .qualifiers ["ID" ][0 ])
201+ feature_dict [self .format_gff_entity (feature .qualifiers ["ID" ][0 ])] = feature .type
199202 else :
200203 entity = self .namespace_entity [self .format_uri (self .format_gff_entity (feature .id ))]
201204 entity_label = self .format_gff_entity (feature .id )
205+ feature_dict [self .format_gff_entity (feature .id )] = feature .type
202206
203207 self .graph_chunk .add ((entity , rdflib .RDF .type , entity_type ))
204208 self .graph_chunk .add ((entity , rdflib .RDFS .label , rdflib .Literal (entity_label )))
@@ -298,19 +302,41 @@ def generate_rdf_content(self):
298302 for qualifier_key , qualifier_value in feature .qualifiers .items ():
299303
300304 for value in qualifier_value :
305+ skip = False
301306
302307 if qualifier_key in ("Parent" , "Derives_from" ):
308+ if len (value .split (":" )) == 1 :
309+ # The entity is not in the value, try to detect it
310+ if value in feature_dict :
311+ related_type = feature_dict [value ]
312+ related_qualifier_key = qualifier_key + "_" + related_type
313+ else :
314+ # Do this later
315+ delayed_link .append ({
316+ "uri" : self .namespace_data [self .format_uri (qualifier_key )],
317+ "label" : rdflib .Literal (qualifier_key ),
318+ "type" : [rdflib .OWL .ObjectProperty , self .namespace_internal [self .format_uri ("AskomicsRelation" )]],
319+ "domain" : entity_type ,
320+ "range" : value ,
321+ "qualifier_key" : qualifier_key ,
322+ "feature_type" : feature .type
323+ })
324+ skip = True
325+ else :
326+ related_type = value .split (":" )[0 ]
327+ related_qualifier_key = qualifier_key + "_" + related_type
328+
303329 relation = self .namespace_data [self .format_uri (qualifier_key )]
304330 attribute = self .namespace_data [self .format_uri (self .format_gff_entity (value ))]
305331
306- if (feature .type , qualifier_key ) not in attribute_list :
307- attribute_list .append ((feature .type , qualifier_key ))
332+ if not skip and (feature .type , related_qualifier_key ) not in attribute_list :
333+ attribute_list .append ((feature .type , related_qualifier_key ))
308334 self .attribute_abstraction .append ({
309335 "uri" : self .namespace_data [self .format_uri (qualifier_key )],
310336 "label" : rdflib .Literal (qualifier_key ),
311337 "type" : [rdflib .OWL .ObjectProperty , self .namespace_internal [self .format_uri ("AskomicsRelation" )]],
312338 "domain" : entity_type ,
313- "range" : self .namespace_data [self .format_uri (value . split ( ":" )[ 0 ] )]
339+ "range" : self .namespace_data [self .format_uri (related_type )]
314340 })
315341
316342 else :
@@ -363,3 +389,13 @@ def generate_rdf_content(self):
363389 self .graph_chunk .add ((entity , self .namespace_internal ["includeInReference" ], block_reference ))
364390
365391 yield
392+
393+ # Add missing abstractions
394+ for link in delayed_link :
395+ if link ["range" ] in feature_dict :
396+ entity_type = feature_dict [link ['range' ]]
397+ related_qualifier_key = link .pop ("qualifier_key" ) + "_" + entity_type
398+ feature_type = link .pop ("feature_type" )
399+ if (feature_type , related_qualifier_key ) not in attribute_list :
400+ link ['range' ] = self .namespace_data [self .format_uri (entity_type )]
401+ self .attribute_abstraction .append (link )
0 commit comments