Bläddra i källkod

Add cell example

Arkadiusz Ryś 1 år sedan
förälder
incheckning
4913a3889c
3 ändrade filer med 37 tillägg och 1 borttagningar
  1. 5 0
      data/configuration.toml
  2. 3 0
      spendpoint/endpoint.py
  3. 29 1
      spendpoint/service.py

+ 5 - 0
data/configuration.toml

@@ -19,3 +19,8 @@ call = "example_service"
 name = "conversion"
 namespace = "https://ontology.rys.app/dt/function/conversion"
 call = "conversion_service"
+
+[[services]]
+name = "cell"
+namespace = "https://ontology.rys.app/dt/function/cell"
+call = "cell_service"

+ 3 - 0
spendpoint/endpoint.py

@@ -47,6 +47,9 @@ class SparqlEndpoint(FastAPI):
         output_mime_type = request.headers["accept"]
         # TODO Ugly hack, fix later (Fuseki sends options)
         output_mime_type = output_mime_type.split(",")[0]
+        # TODO Another ugly hack because if we get */* we don't really know what to return
+        if output_mime_type == "*/*":
+            output_mime_type = "application/json"
         if isinstance(output_mime_type, list):
             return output_mime_type[0]
         # TODO Use match or dict for this

+ 29 - 1
spendpoint/service.py

@@ -83,7 +83,6 @@ def conversion_service(query_results, ctx, part, eval_part, service_configuratio
     return query_results, ctx, part, eval_part
 
 
-
 def example_service(query_results, ctx, part, eval_part, service_configuration):
     """"""
     logging.debug(f"{query_results=}")
@@ -104,3 +103,32 @@ def example_service(query_results, ctx, part, eval_part, service_configuration):
     for outlier in outliers:
         query_results.append(eval_part.merge({part.var: Literal(outlier.iri), rdflib.term.Variable(part.var + "_value"): Literal(outlier.value)}))
     return query_results, ctx, part, eval_part
+
+
+# TODO maybe return a 'cell' type
+def cell_service(query_results, ctx, part, eval_part, service_configuration):
+    """"""
+    logging.debug(f"{query_results=}")
+    logging.debug(f"{ctx=}")
+    logging.debug(f"{part=}")
+    logging.debug(f"{eval_part=}")
+
+    file_name = str(_eval(part.expr.expr[0], eval_part.forget(ctx, _except=part.expr._vars)))
+    row = str(_eval(part.expr.expr[1], eval_part.forget(ctx, _except=part.expr._vars)))
+    column = str(_eval(part.expr.expr[2], eval_part.forget(ctx, _except=part.expr._vars)))
+
+    # TODO Should probably grab some setting from the KG, like header etc, maybe do that in query
+    logging.info(f"Looking for cell {row}:{column} in '{file_name}'.")
+    try:
+        df = pd.read_csv(file_name, index_col=None, header=None)
+        cell_value = df.iat[int(row), int(column)]
+        query_results.append(eval_part.merge({
+            part.var: Literal(cell_value),
+            rdflib.term.Variable(part.var + "_value"): Literal(cell_value)
+        }))
+        logging.debug(f"{cell_value=}")
+    except:
+        # TODO Expand error info
+        logging.error(f"Error.")
+
+    return query_results, ctx, part, eval_part