Mercurial > repos > guerler > springsuite
diff planemo/lib/python3.7/site-packages/rdflib/plugins/sparql/results/jsonresults.py @ 1:56ad4e20f292 draft
"planemo upload commit 6eee67778febed82ddd413c3ca40b3183a3898f1"
author | guerler |
---|---|
date | Fri, 31 Jul 2020 00:32:28 -0400 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/planemo/lib/python3.7/site-packages/rdflib/plugins/sparql/results/jsonresults.py Fri Jul 31 00:32:28 2020 -0400 @@ -0,0 +1,138 @@ +from rdflib.query import ( + Result, ResultException, ResultSerializer, ResultParser) +from rdflib import Literal, URIRef, BNode, Variable + +from rdflib.py3compat import bytestype + + +from . import jsonlayer + +"""A Serializer for SPARQL results in JSON: + +http://www.w3.org/TR/rdf-sparql-json-res/ + +Bits and pieces borrowed from: +http://projects.bigasterisk.com/sparqlhttp/ + +Authors: Drew Perttula, Gunnar Aastrand Grimnes + +""" + + +class JSONResultParser(ResultParser): + + def parse(self, source): + inp = source.read() + if isinstance(inp, bytestype): + inp = inp.decode('utf-8') + return JSONResult(jsonlayer.decode(inp)) + + +class JSONResultSerializer(ResultSerializer): + + def __init__(self, result): + ResultSerializer.__init__(self, result) + + def serialize(self, stream, encoding=None): + + res = {} + if self.result.type == 'ASK': + res["head"] = {} + res["boolean"] = self.result.askAnswer + else: + # select + res["results"] = {} + res["head"] = {} + res["head"]["vars"] = self.result.vars + res["results"]["bindings"] = [self._bindingToJSON( + x) for x in self.result.bindings] + + r = jsonlayer.encode(res) + if encoding is not None: + stream.write(r.encode(encoding)) + else: + stream.write(r) + + def _bindingToJSON(self, b): + res = {} + for var in b: + j = termToJSON(self, b[var]) + if j is not None: + res[var] = termToJSON(self, b[var]) + return res + + +class JSONResult(Result): + + def __init__(self, json): + self.json = json + if "boolean" in json: + type_ = 'ASK' + elif "results" in json: + type_ = 'SELECT' + else: + raise ResultException('No boolean or results in json!') + + Result.__init__(self, type_) + + if type_ == 'ASK': + self.askAnswer = bool(json['boolean']) + else: + self.bindings = self._get_bindings() + self.vars = [Variable(x) for x in json["head"]["vars"]] + + def _get_bindings(self): + ret = [] + for row in self.json['results']['bindings']: + outRow = {} + for k, v in list(row.items()): + outRow[Variable(k)] = parseJsonTerm(v) + ret.append(outRow) + return ret + + +def parseJsonTerm(d): + """rdflib object (Literal, URIRef, BNode) for the given json-format dict. + + input is like: + { 'type': 'uri', 'value': 'http://famegame.com/2006/01/username' } + { 'type': 'literal', 'value': 'drewp' } + """ + + t = d['type'] + if t == 'uri': + return URIRef(d['value']) + elif t == 'literal': + if 'xml:lang' in d: + return Literal(d['value'], lang=d['xml:lang']) + return Literal(d['value']) + elif t == 'typed-literal': + return Literal(d['value'], datatype=URIRef(d['datatype'])) + elif t == 'bnode': + return BNode(d['value']) + else: + raise NotImplementedError("json term type %r" % t) + + +def termToJSON(self, term): + if isinstance(term, URIRef): + return {'type': 'uri', 'value': str(term)} + elif isinstance(term, Literal): + if term.datatype is not None: + return {'type': 'typed-literal', + 'value': str(term), + 'datatype': str(term.datatype)} + else: + r = {'type': 'literal', + 'value': str(term)} + if term.language is not None: + r['xml:lang'] = term.language + return r + + elif isinstance(term, BNode): + return {'type': 'bnode', 'value': str(term)} + elif term is None: + return None + else: + raise ResultException( + 'Unknown term type: %s (%s)' % (term, type(term)))