From 4134632a7dcd13ebb2cb810083ef69d76b8058eb Mon Sep 17 00:00:00 2001 From: Paul van Genuchten Date: Fri, 3 Oct 2025 09:02:17 +0200 Subject: [PATCH] enables to set a (default) value for virtual columns, as described in https://www.w3.org/ns/csvw#property-definitions --- csvwlib/converter/ModelConverter.py | 2 +- csvwlib/converter/ToRDFConverter.py | 18 ++++++++++++------ 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/csvwlib/converter/ModelConverter.py b/csvwlib/converter/ModelConverter.py index ab18c8a..7986a49 100644 --- a/csvwlib/converter/ModelConverter.py +++ b/csvwlib/converter/ModelConverter.py @@ -270,7 +270,7 @@ def _set_default_values(self): for i, column_metadata in enumerate(table_metadata['tableSchema']['columns']): if 'default' in column_metadata: for row in csv: - if row[i] == '': + if i < len(row) and row[i] == '': row[i] = column_metadata['default'] def _normalize_numbers_notation(self): diff --git a/csvwlib/converter/ToRDFConverter.py b/csvwlib/converter/ToRDFConverter.py index be66f54..919427b 100644 --- a/csvwlib/converter/ToRDFConverter.py +++ b/csvwlib/converter/ToRDFConverter.py @@ -71,12 +71,18 @@ def parse_virtual_columns(self, row_node, atdm_row, table_metadata): subject = URIRef(UriTemplateUtils.insert_value(virtual_column['aboutUrl'], atdm_row, '', table_metadata['url'])) predicate = Namespaces.get_term(virtual_column['propertyUrl']) - obj = UriTemplateUtils.insert_value(virtual_column['valueUrl'], atdm_row, '', table_metadata['url']) - obj = CommonProperties.expand_property_if_possible(obj) - self.graph.add((subject, predicate, URIRef(obj))) - if self.mode == CONST_STANDARD_MODE: - self.graph.add((row_node, CSVW.describes, subject)) - + if predicate: + if 'valueUrl' in virtual_column: + obj = UriTemplateUtils.insert_value(virtual_column['valueUrl'], atdm_row, '', table_metadata['url']) + obj = CommonProperties.expand_property_if_possible(obj) + self.graph.add((subject, predicate, URIRef(obj))) + elif 'default' in virtual_column: + self.graph.add((subject, predicate, self._object_node(virtual_column['default'], virtual_column, atdm_row, ''))) + if self.mode == CONST_STANDARD_MODE: + self.graph.add((row_node, CSVW.describes, subject)) + else: + print(f"term {virtual_column['propertyUrl']} not in namespaces") +S def _add_file_metadata(self, metadata, node): language = JSONLDUtils.language(self.metadata['@context']) for key, value in metadata.items():