From 865ed625b843acd110c9a84be9fbc4fc630a3cba Mon Sep 17 00:00:00 2001 From: mouffok Date: Wed, 25 Oct 2023 14:53:42 +0200 Subject: [PATCH] sparql query builder separate method for construct queries --- kgforge/core/commons/sparql_query_builder.py | 80 ++++++++++---------- 1 file changed, 42 insertions(+), 38 deletions(-) diff --git a/kgforge/core/commons/sparql_query_builder.py b/kgforge/core/commons/sparql_query_builder.py index 760fe6e1..c78c087f 100644 --- a/kgforge/core/commons/sparql_query_builder.py +++ b/kgforge/core/commons/sparql_query_builder.py @@ -186,48 +186,52 @@ def build_resource_from_response( query: str, response: Dict, context: Context, *args, **params ) -> List[Resource]: _, q_comp = Query.parseString(query) - if q_comp.name == "ConstructQuery": - subject_triples = {} - for r in response["results"]["bindings"]: - subject = r["subject"]["value"] - s = f"<{r['subject']['value']}>" - p = f"<{r['predicate']['value']}>" - if r["object"]["type"] == "uri": - o = f"<{r['object']['value']}>" - else: - if "datatype" in r["object"]: - o = f"\"{r['object']['value']}\"^^<{r['object']['datatype']}>" - else: - o = f"\"{r['object']['value']}\"" - if subject in subject_triples: - subject_triples[subject] += f"\n{s} {p} {o} . " - else: - subject_triples[subject] = f"{s} {p} {o} . " - - def triples_to_resource(iri, triples): - graph = Graph().parse(data=triples, format="nt") - data_expanded = json.loads(graph.serialize(format="json-ld")) - data_expanded = json.loads(graph.serialize(format="json-ld")) - frame = {"@id": iri} - data_framed = jsonld.frame(data_expanded, frame) - compacted = jsonld.compact(data_framed, context.document) - resource = from_jsonld(compacted) - resource.context = ( - context.iri - if context.is_http_iri() - else context.document["@context"] - ) - return resource + bindings = response["results"]["bindings"] - return [triples_to_resource(s, t) for s, t in subject_triples.items()] + if q_comp.name == "ConstructQuery": + return SPARQLQueryBuilder.build_resource_from_construct_query(bindings, context) else: # SELECT QUERY - return SPARQLQueryBuilder.build_resource_from_select_query( - response["results"]["bindings"] + return SPARQLQueryBuilder.build_resource_from_select_query(bindings) + + @staticmethod + def build_resource_from_construct_query(results: List, context: Context) -> List[Resource]: + + subject_triples = {} + + for r in results: + subject = r["subject"]["value"] + s = f"<{r['subject']['value']}>" + p = f"<{r['predicate']['value']}>" + if r["object"]["type"] == "uri": + o = f"<{r['object']['value']}>" + else: + if "datatype" in r["object"]: + o = f"\"{r['object']['value']}\"^^<{r['object']['datatype']}>" + else: + o = f"\"{r['object']['value']}\"" + if subject in subject_triples: + subject_triples[subject] += f"\n{s} {p} {o} . " + else: + subject_triples[subject] = f"{s} {p} {o} . " + + def triples_to_resource(iri, triples): + graph = Graph().parse(data=triples, format="nt") + data_expanded = json.loads(graph.serialize(format="json-ld")) + data_framed = jsonld.frame(data_expanded, {"@id": iri}) + compacted = jsonld.compact(data_framed, context.document) + resource = from_jsonld(compacted) + resource.context = ( + context.iri + if context.is_http_iri() + else context.document["@context"] ) + return resource + + return [triples_to_resource(s, t) for s, t in subject_triples.items()] @staticmethod - def build_resource_from_select_query(results: List): + def build_resource_from_select_query(results: List) -> List[Resource]: def process_v(v): if v['type'] == 'literal' and 'datatype' in v and v['datatype'] == \ @@ -248,7 +252,7 @@ def process_v(v): for x in results ] - + @staticmethod def rewrite_sparql(query: str, context: Context, metadata_context: Context) -> str: """Rewrite local property and type names from Model.template() as IRIs. @@ -346,7 +350,6 @@ def _replace_in_sparql( return qr - @staticmethod def apply_limit_and_offset_to_query(query, limit, default_limit, offset, default_offset): if limit: @@ -362,5 +365,6 @@ def apply_limit_and_offset_to_query(query, limit, default_limit, offset, default return query + def _box_value_as_full_iri(value): return f"<{value}>" if is_valid_url(value) else value