diff --git a/rdflib/plugin.py b/rdflib/plugin.py index d5e6c21d8..a98277150 100644 --- a/rdflib/plugin.py +++ b/rdflib/plugin.py @@ -322,12 +322,32 @@ def plugins(name=None, kind=None): register( 'xml', ResultParser, 'rdflib.plugins.sparql.results.xmlresults', 'XMLResultParser') +register( + 'application/sparql-results+xml', ResultParser, + 'rdflib.plugins.sparql.results.xmlresults', 'XMLResultParser') + +register( + 'application/rdf+xml', ResultParser, + 'rdflib.plugins.sparql.results.graph', 'GraphResultParser') + + register( 'json', ResultParser, 'rdflib.plugins.sparql.results.jsonresults', 'JSONResultParser') +register( + 'application/sparql-results+json', ResultParser, + 'rdflib.plugins.sparql.results.jsonresults', 'JSONResultParser') + register( 'csv', ResultParser, 'rdflib.plugins.sparql.results.csvresults', 'CSVResultParser') +register( + 'text/csv', ResultParser, + 'rdflib.plugins.sparql.results.csvresults', 'CSVResultParser') + register( 'tsv', ResultParser, 'rdflib.plugins.sparql.results.tsvresults', 'TSVResultParser') +register( + 'text/tab-separated-values', ResultParser, + 'rdflib.plugins.sparql.results.tsvresults', 'TSVResultParser') diff --git a/rdflib/plugins/sparql/results/csvresults.py b/rdflib/plugins/sparql/results/csvresults.py index e0412b0c9..2cbeea05f 100644 --- a/rdflib/plugins/sparql/results/csvresults.py +++ b/rdflib/plugins/sparql/results/csvresults.py @@ -21,7 +21,7 @@ class CSVResultParser(ResultParser): def __init__(self): self.delim = "," - def parse(self, source): + def parse(self, source, content_type=None): r = Result('SELECT') diff --git a/rdflib/plugins/sparql/results/graph.py b/rdflib/plugins/sparql/results/graph.py new file mode 100644 index 000000000..b02aab7df --- /dev/null +++ b/rdflib/plugins/sparql/results/graph.py @@ -0,0 +1,18 @@ +from rdflib import Graph + +from rdflib.query import ( + Result, + ResultParser, + ResultSerializer, + ResultException +) + +class GraphResultParser(ResultParser): + + def parse(self, source, content_type): + + res = Result('CONSTRUCT') # hmm - or describe?type_) + res.graph = Graph() + res.graph.parse(source, format=content_type) + + return res diff --git a/rdflib/plugins/sparql/results/jsonresults.py b/rdflib/plugins/sparql/results/jsonresults.py index 755cca484..1f45ce274 100644 --- a/rdflib/plugins/sparql/results/jsonresults.py +++ b/rdflib/plugins/sparql/results/jsonresults.py @@ -21,7 +21,7 @@ class JSONResultParser(ResultParser): - def parse(self, source): + def parse(self, source, content_type=None): inp = source.read() if isinstance(inp, binary_type): inp = inp.decode('utf-8') diff --git a/rdflib/plugins/sparql/results/tsvresults.py b/rdflib/plugins/sparql/results/tsvresults.py index dfc7657ed..fb5da07d8 100644 --- a/rdflib/plugins/sparql/results/tsvresults.py +++ b/rdflib/plugins/sparql/results/tsvresults.py @@ -47,7 +47,7 @@ class TSVResultParser(ResultParser): - def parse(self, source): + def parse(self, source, content_type=None): if isinstance(source.read(0), binary_type): # if reading from source returns bytes do utf-8 decoding diff --git a/rdflib/plugins/sparql/results/xmlresults.py b/rdflib/plugins/sparql/results/xmlresults.py index 9e0019198..ba35749cc 100644 --- a/rdflib/plugins/sparql/results/xmlresults.py +++ b/rdflib/plugins/sparql/results/xmlresults.py @@ -37,25 +37,18 @@ class XMLResultParser(ResultParser): - def parse(self, source): + def parse(self, source, content_type=None): return XMLResult(source) class XMLResult(Result): - def __init__(self, source): + def __init__(self, source, content_type=None): - xmlstring = source.read() - - if isinstance(xmlstring, text_type): - xmlstring = xmlstring.encode('utf-8') try: parser = etree.XMLParser(huge_tree=True) - tree = etree.parse(BytesIO(xmlstring), parser) + tree = etree.parse(source, parser) except TypeError: - tree = etree.fromstring(xmlstring) - except Exception as e: - log.exception("Error parsing XML results: %s"%xmlstring) - raise e + tree = etree.parse(source) boolean = tree.find(RESULTS_NS_ET + 'boolean') results = tree.find(RESULTS_NS_ET + 'results') @@ -65,18 +58,11 @@ def __init__(self, source): elif results is not None: type_ = 'SELECT' else: - g = Graph() - try: - g.parse(data=xmlstring) - if len(g) == 0: - raise - type_ = 'CONSTRUCT' - - except: - raise ResultException( - "No RDF Graph, result-bindings or boolean answer found!") + raise ResultException( + "No RDF result-bindings or boolean answer found!") Result.__init__(self, type_) + if type_ == 'SELECT': self.bindings = [] for result in results: @@ -90,10 +76,11 @@ def __init__(self, source): './%shead/%svariable' % ( RESULTS_NS_ET, RESULTS_NS_ET))] - elif type_ == 'ASK': + else: self.askAnswer = boolean.text.lower().strip() == "true" - elif type_ == 'CONSTRUCT': - self.graph = g + + + def parseTerm(element): diff --git a/rdflib/plugins/stores/sparqlstore.py b/rdflib/plugins/stores/sparqlstore.py index 2be781d7a..124f505ac 100644 --- a/rdflib/plugins/stores/sparqlstore.py +++ b/rdflib/plugins/stores/sparqlstore.py @@ -13,67 +13,20 @@ import re import collections -import warnings -import contextlib -try: - from SPARQLWrapper import SPARQLWrapper, XML, JSON, POST, GET, URLENCODED, POSTDIRECTLY -except ImportError: - raise Exception( - "SPARQLWrapper not found! SPARQL Store will not work." + - "Install with 'pip install SPARQLWrapper'") +from .sparqlwrapper import SPARQLWrapper from rdflib.plugins.stores.regexmatching import NATIVE_REGEX from rdflib.store import Store -from rdflib.query import Result from rdflib import Variable, BNode from rdflib.graph import DATASET_DEFAULT_GRAPH_ID from rdflib.term import Node from six import string_types -class NSSPARQLWrapper(SPARQLWrapper): - nsBindings = {} - - def setNamespaceBindings(self, bindings): - """ - A shortcut for setting namespace bindings that will be added - to the prolog of the query - - @param bindings: A dictionary of prefixs to URIs - """ - self.nsBindings.update(bindings) - - def setQuery(self, query): - """ - Set the SPARQL query text. Note: no check is done on the - validity of the query (syntax or otherwise) by this module, - except for testing the query type (SELECT, ASK, etc). - - Syntax and validity checking is done by the SPARQL service itself. - - @param query: query text - @type query: string - @bug: #2320024 - """ - self.queryType = self._parseQueryType(query) - self.queryString = self.injectPrefixes(query) - - def injectPrefixes(self, query): - prefixes = list(self.nsBindings.items()) - if not prefixes: - return query - return '\n'.join([ - '\n'.join(['PREFIX %s: <%s>' % (k, v) for k, v in prefixes]), - '', # separate prefixes from query with an empty line - query - ]) - - BNODE_IDENT_PATTERN = re.compile('(?P