def _elastic(self, query: str, limit: int, offset: int = None) -> List[Resource]: try: response = requests.post( self.service.elastic_endpoint["endpoint"], data=query, headers=self.service.headers_elastic) response.raise_for_status() except Exception as e: raise QueryingError(e) else: results = response.json() return [Resource(**{k: v for k, v in hit.items()}) for hit in results["hits"]['hits']]
def _sparql(self, query: str, limit: int, offset: int = None) -> List[Resource]: s_offset = "" if offset is None else f"OFFSET {offset}" s_limit = "" if limit is None else f"LIMIT {limit}" query = f"{query} {s_limit} {s_offset}" try: response = requests.post( self.service.sparql_endpoint["endpoint"], data=query, headers=self.service.headers_sparql) response.raise_for_status() except Exception as e: raise QueryingError(e) else: data = response.json() # FIXME workaround to parse a CONSTRUCT query, this fix depends on # https://github.com/BlueBrain/nexus/issues/1155 _, q_comp = Query.parseString(query) if q_comp.name == "ConstructQuery": subject_triples = {} for r in data["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").decode("utf-8")) frame = {"@id": iri} data_framed = jsonld.frame(data_expanded, frame) context = self.model_context or self.context 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()] else: # SELECT QUERY results = data["results"]["bindings"] return [Resource(**{k: v["value"] for k, v in x.items()}) for x in results]