0

Working on several SPARQL queries that works, we are facing an issue with the rdflib library, with queries containing projection with str function.

Here is an example of code on which the parser fail :

query = """
SELECT DISTINCT str(?s) 
WHERE { ?s ?p ?o. }
"""
parsedQuery = rdflib.plugins.sparql.parser.parseQuery(query)

the error is :

---------------------------------------------------------------------------
ParseException                            Traceback (most recent call last)
<ipython-input-47-30dec35045be> in <module>
      3 WHERE { ?s ?p ?o. }
      4 """
----> 5 parsedQuery = rdflib.plugins.sparql.parser.parseQuery(query)

~/anaconda3/lib/python3.7/site-packages/rdflib/plugins/sparql/parser.py in parseQuery(q)
   1058 
   1059     q = expandUnicodeEscapes(q)
-> 1060     return Query.parseString(q, parseAll=True)
   1061 
   1062 

~/anaconda3/lib/python3.7/site-packages/pyparsing.py in parseString(self, instring, parseAll)
   1945             else:
   1946                 # catch and re-raise exception from here, clears out pyparsing internal stack trace
-> 1947                 raise exc
   1948         else:
   1949             return tokens

~/anaconda3/lib/python3.7/site-packages/pyparsing.py in parseString(self, instring, parseAll)
   1935             instring = instring.expandtabs()
   1936         try:
-> 1937             loc, tokens = self._parse(instring, 0)
   1938             if parseAll:
   1939                 loc = self.preParse(instring, loc)

~/anaconda3/lib/python3.7/site-packages/pyparsing.py in _parseCache(self, instring, loc, doActions, callPreParse)
   1836                 ParserElement.packrat_cache_stats[MISS] += 1
   1837                 try:
-> 1838                     value = self._parseNoCache(instring, loc, doActions, callPreParse)
   1839                 except ParseBaseException as pe:
   1840                     # cache a copy of the exception, without the traceback

~/anaconda3/lib/python3.7/site-packages/pyparsing.py in _parseNoCache(self, instring, loc, doActions, callPreParse)
   1675             if self.mayIndexError or preloc >= len(instring):
   1676                 try:
-> 1677                     loc, tokens = self.parseImpl(instring, preloc, doActions)
   1678                 except IndexError:
   1679                     raise ParseException(instring, len(instring), self.errmsg, self)

~/anaconda3/lib/python3.7/site-packages/pyparsing.py in parseImpl(self, instring, loc, doActions)
   4050                     raise ParseSyntaxException(instring, len(instring), self.errmsg, self)
   4051             else:
-> 4052                 loc, exprtokens = e._parse(instring, loc, doActions)
   4053             if exprtokens or exprtokens.haskeys():
   4054                 resultlist += exprtokens

~/anaconda3/lib/python3.7/site-packages/pyparsing.py in _parseCache(self, instring, loc, doActions, callPreParse)
   1836                 ParserElement.packrat_cache_stats[MISS] += 1
   1837                 try:
-> 1838                     value = self._parseNoCache(instring, loc, doActions, callPreParse)
   1839                 except ParseBaseException as pe:
   1840                     # cache a copy of the exception, without the traceback

~/anaconda3/lib/python3.7/site-packages/pyparsing.py in _parseNoCache(self, instring, loc, doActions, callPreParse)
   1675             if self.mayIndexError or preloc >= len(instring):
   1676                 try:
-> 1677                     loc, tokens = self.parseImpl(instring, preloc, doActions)
   1678                 except IndexError:
   1679                     raise ParseException(instring, len(instring), self.errmsg, self)

~/anaconda3/lib/python3.7/site-packages/pyparsing.py in parseImpl(self, instring, loc, doActions)
   4250             if maxException is not None:
   4251                 maxException.msg = self.errmsg
-> 4252                 raise maxException
   4253             else:
   4254                 raise ParseException(instring, loc, "no defined alternatives to match", self)

~/anaconda3/lib/python3.7/site-packages/pyparsing.py in parseImpl(self, instring, loc, doActions)
   4235         for e in self.exprs:
   4236             try:
-> 4237                 ret = e._parse(instring, loc, doActions)
   4238                 return ret
   4239             except ParseException as err:

~/anaconda3/lib/python3.7/site-packages/pyparsing.py in _parseCache(self, instring, loc, doActions, callPreParse)
   1836                 ParserElement.packrat_cache_stats[MISS] += 1
   1837                 try:
-> 1838                     value = self._parseNoCache(instring, loc, doActions, callPreParse)
   1839                 except ParseBaseException as pe:
   1840                     # cache a copy of the exception, without the traceback

~/anaconda3/lib/python3.7/site-packages/pyparsing.py in _parseNoCache(self, instring, loc, doActions, callPreParse)
   1675             if self.mayIndexError or preloc >= len(instring):
   1676                 try:
-> 1677                     loc, tokens = self.parseImpl(instring, preloc, doActions)
   1678                 except IndexError:
   1679                     raise ParseException(instring, len(instring), self.errmsg, self)

~/anaconda3/lib/python3.7/site-packages/pyparsing.py in parseImpl(self, instring, loc, doActions)
   4443     def parseImpl(self, instring, loc, doActions=True):
   4444         if self.expr is not None:
-> 4445             return self.expr._parse(instring, loc, doActions, callPreParse=False)
   4446         else:
   4447             raise ParseException("", loc, self.errmsg, self)

~/anaconda3/lib/python3.7/site-packages/pyparsing.py in _parseCache(self, instring, loc, doActions, callPreParse)
   1836                 ParserElement.packrat_cache_stats[MISS] += 1
   1837                 try:
-> 1838                     value = self._parseNoCache(instring, loc, doActions, callPreParse)
   1839                 except ParseBaseException as pe:
   1840                     # cache a copy of the exception, without the traceback

~/anaconda3/lib/python3.7/site-packages/pyparsing.py in _parseNoCache(self, instring, loc, doActions, callPreParse)
   1675             if self.mayIndexError or preloc >= len(instring):
   1676                 try:
-> 1677                     loc, tokens = self.parseImpl(instring, preloc, doActions)
   1678                 except IndexError:
   1679                     raise ParseException(instring, len(instring), self.errmsg, self)

~/anaconda3/lib/python3.7/site-packages/pyparsing.py in parseImpl(self, instring, loc, doActions)
   4050                     raise ParseSyntaxException(instring, len(instring), self.errmsg, self)
   4051             else:
-> 4052                 loc, exprtokens = e._parse(instring, loc, doActions)
   4053             if exprtokens or exprtokens.haskeys():
   4054                 resultlist += exprtokens

~/anaconda3/lib/python3.7/site-packages/pyparsing.py in _parseCache(self, instring, loc, doActions, callPreParse)
   1836                 ParserElement.packrat_cache_stats[MISS] += 1
   1837                 try:
-> 1838                     value = self._parseNoCache(instring, loc, doActions, callPreParse)
   1839                 except ParseBaseException as pe:
   1840                     # cache a copy of the exception, without the traceback

~/anaconda3/lib/python3.7/site-packages/pyparsing.py in _parseNoCache(self, instring, loc, doActions, callPreParse)
   1675             if self.mayIndexError or preloc >= len(instring):
   1676                 try:
-> 1677                     loc, tokens = self.parseImpl(instring, preloc, doActions)
   1678                 except IndexError:
   1679                     raise ParseException(instring, len(instring), self.errmsg, self)

~/anaconda3/lib/python3.7/site-packages/pyparsing.py in parseImpl(self, instring, loc, doActions)
   4250             if maxException is not None:
   4251                 maxException.msg = self.errmsg
-> 4252                 raise maxException
   4253             else:
   4254                 raise ParseException(instring, loc, "no defined alternatives to match", self)

~/anaconda3/lib/python3.7/site-packages/pyparsing.py in parseImpl(self, instring, loc, doActions)
   4235         for e in self.exprs:
   4236             try:
-> 4237                 ret = e._parse(instring, loc, doActions)
   4238                 return ret
   4239             except ParseException as err:

~/anaconda3/lib/python3.7/site-packages/pyparsing.py in _parseCache(self, instring, loc, doActions, callPreParse)
   1836                 ParserElement.packrat_cache_stats[MISS] += 1
   1837                 try:
-> 1838                     value = self._parseNoCache(instring, loc, doActions, callPreParse)
   1839                 except ParseBaseException as pe:
   1840                     # cache a copy of the exception, without the traceback

~/anaconda3/lib/python3.7/site-packages/pyparsing.py in _parseNoCache(self, instring, loc, doActions, callPreParse)
   1675             if self.mayIndexError or preloc >= len(instring):
   1676                 try:
-> 1677                     loc, tokens = self.parseImpl(instring, preloc, doActions)
   1678                 except IndexError:
   1679                     raise ParseException(instring, len(instring), self.errmsg, self)

~/anaconda3/lib/python3.7/site-packages/pyparsing.py in parseImpl(self, instring, loc, doActions)
   4678         if check_ender:
   4679             try_not_ender(instring, loc)
-> 4680         loc, tokens = self_expr_parse(instring, loc, doActions, callPreParse=False)
   4681         try:
   4682             hasIgnoreExprs = (not not self.ignoreExprs)

~/anaconda3/lib/python3.7/site-packages/pyparsing.py in _parseCache(self, instring, loc, doActions, callPreParse)
   1836                 ParserElement.packrat_cache_stats[MISS] += 1
   1837                 try:
-> 1838                     value = self._parseNoCache(instring, loc, doActions, callPreParse)
   1839                 except ParseBaseException as pe:
   1840                     # cache a copy of the exception, without the traceback

~/anaconda3/lib/python3.7/site-packages/pyparsing.py in _parseNoCache(self, instring, loc, doActions, callPreParse)
   1675             if self.mayIndexError or preloc >= len(instring):
   1676                 try:
-> 1677                     loc, tokens = self.parseImpl(instring, preloc, doActions)
   1678                 except IndexError:
   1679                     raise ParseException(instring, len(instring), self.errmsg, self)

~/anaconda3/lib/python3.7/site-packages/pyparsing.py in parseImpl(self, instring, loc, doActions)
   4443     def parseImpl(self, instring, loc, doActions=True):
   4444         if self.expr is not None:
-> 4445             return self.expr._parse(instring, loc, doActions, callPreParse=False)
   4446         else:
   4447             raise ParseException("", loc, self.errmsg, self)

~/anaconda3/lib/python3.7/site-packages/pyparsing.py in _parseCache(self, instring, loc, doActions, callPreParse)
   1836                 ParserElement.packrat_cache_stats[MISS] += 1
   1837                 try:
-> 1838                     value = self._parseNoCache(instring, loc, doActions, callPreParse)
   1839                 except ParseBaseException as pe:
   1840                     # cache a copy of the exception, without the traceback

~/anaconda3/lib/python3.7/site-packages/pyparsing.py in _parseNoCache(self, instring, loc, doActions, callPreParse)
   1675             if self.mayIndexError or preloc >= len(instring):
   1676                 try:
-> 1677                     loc, tokens = self.parseImpl(instring, preloc, doActions)
   1678                 except IndexError:
   1679                     raise ParseException(instring, len(instring), self.errmsg, self)

~/anaconda3/lib/python3.7/site-packages/pyparsing.py in parseImpl(self, instring, loc, doActions)
   4443     def parseImpl(self, instring, loc, doActions=True):
   4444         if self.expr is not None:
-> 4445             return self.expr._parse(instring, loc, doActions, callPreParse=False)
   4446         else:
   4447             raise ParseException("", loc, self.errmsg, self)

~/anaconda3/lib/python3.7/site-packages/pyparsing.py in _parseCache(self, instring, loc, doActions, callPreParse)
   1836                 ParserElement.packrat_cache_stats[MISS] += 1
   1837                 try:
-> 1838                     value = self._parseNoCache(instring, loc, doActions, callPreParse)
   1839                 except ParseBaseException as pe:
   1840                     # cache a copy of the exception, without the traceback

~/anaconda3/lib/python3.7/site-packages/pyparsing.py in _parseNoCache(self, instring, loc, doActions, callPreParse)
   1675             if self.mayIndexError or preloc >= len(instring):
   1676                 try:
-> 1677                     loc, tokens = self.parseImpl(instring, preloc, doActions)
   1678                 except IndexError:
   1679                     raise ParseException(instring, len(instring), self.errmsg, self)

~/anaconda3/lib/python3.7/site-packages/pyparsing.py in parseImpl(self, instring, loc, doActions)
   4250             if maxException is not None:
   4251                 maxException.msg = self.errmsg
-> 4252                 raise maxException
   4253             else:
   4254                 raise ParseException(instring, loc, "no defined alternatives to match", self)

~/anaconda3/lib/python3.7/site-packages/pyparsing.py in parseImpl(self, instring, loc, doActions)
   4235         for e in self.exprs:
   4236             try:
-> 4237                 ret = e._parse(instring, loc, doActions)
   4238                 return ret
   4239             except ParseException as err:

~/anaconda3/lib/python3.7/site-packages/pyparsing.py in _parseCache(self, instring, loc, doActions, callPreParse)
   1836                 ParserElement.packrat_cache_stats[MISS] += 1
   1837                 try:
-> 1838                     value = self._parseNoCache(instring, loc, doActions, callPreParse)
   1839                 except ParseBaseException as pe:
   1840                     # cache a copy of the exception, without the traceback

~/anaconda3/lib/python3.7/site-packages/pyparsing.py in _parseNoCache(self, instring, loc, doActions, callPreParse)
   1675             if self.mayIndexError or preloc >= len(instring):
   1676                 try:
-> 1677                     loc, tokens = self.parseImpl(instring, preloc, doActions)
   1678                 except IndexError:
   1679                     raise ParseException(instring, len(instring), self.errmsg, self)

~/anaconda3/lib/python3.7/site-packages/pyparsing.py in parseImpl(self, instring, loc, doActions)
   4443     def parseImpl(self, instring, loc, doActions=True):
   4444         if self.expr is not None:
-> 4445             return self.expr._parse(instring, loc, doActions, callPreParse=False)
   4446         else:
   4447             raise ParseException("", loc, self.errmsg, self)

~/anaconda3/lib/python3.7/site-packages/pyparsing.py in _parseCache(self, instring, loc, doActions, callPreParse)
   1836                 ParserElement.packrat_cache_stats[MISS] += 1
   1837                 try:
-> 1838                     value = self._parseNoCache(instring, loc, doActions, callPreParse)
   1839                 except ParseBaseException as pe:
   1840                     # cache a copy of the exception, without the traceback

~/anaconda3/lib/python3.7/site-packages/pyparsing.py in _parseNoCache(self, instring, loc, doActions, callPreParse)
   1675             if self.mayIndexError or preloc >= len(instring):
   1676                 try:
-> 1677                     loc, tokens = self.parseImpl(instring, preloc, doActions)
   1678                 except IndexError:
   1679                     raise ParseException(instring, len(instring), self.errmsg, self)

~/anaconda3/lib/python3.7/site-packages/pyparsing.py in parseImpl(self, instring, loc, doActions)
   4250             if maxException is not None:
   4251                 maxException.msg = self.errmsg
-> 4252                 raise maxException
   4253             else:
   4254                 raise ParseException(instring, loc, "no defined alternatives to match", self)

~/anaconda3/lib/python3.7/site-packages/pyparsing.py in parseImpl(self, instring, loc, doActions)
   4235         for e in self.exprs:
   4236             try:
-> 4237                 ret = e._parse(instring, loc, doActions)
   4238                 return ret
   4239             except ParseException as err:

~/anaconda3/lib/python3.7/site-packages/pyparsing.py in _parseCache(self, instring, loc, doActions, callPreParse)
   1836                 ParserElement.packrat_cache_stats[MISS] += 1
   1837                 try:
-> 1838                     value = self._parseNoCache(instring, loc, doActions, callPreParse)
   1839                 except ParseBaseException as pe:
   1840                     # cache a copy of the exception, without the traceback

~/anaconda3/lib/python3.7/site-packages/pyparsing.py in _parseNoCache(self, instring, loc, doActions, callPreParse)
   1675             if self.mayIndexError or preloc >= len(instring):
   1676                 try:
-> 1677                     loc, tokens = self.parseImpl(instring, preloc, doActions)
   1678                 except IndexError:
   1679                     raise ParseException(instring, len(instring), self.errmsg, self)

~/anaconda3/lib/python3.7/site-packages/pyparsing.py in parseImpl(self, instring, loc, doActions)
   4443     def parseImpl(self, instring, loc, doActions=True):
   4444         if self.expr is not None:
-> 4445             return self.expr._parse(instring, loc, doActions, callPreParse=False)
   4446         else:
   4447             raise ParseException("", loc, self.errmsg, self)

~/anaconda3/lib/python3.7/site-packages/pyparsing.py in _parseCache(self, instring, loc, doActions, callPreParse)
   1836                 ParserElement.packrat_cache_stats[MISS] += 1
   1837                 try:
-> 1838                     value = self._parseNoCache(instring, loc, doActions, callPreParse)
   1839                 except ParseBaseException as pe:
   1840                     # cache a copy of the exception, without the traceback

~/anaconda3/lib/python3.7/site-packages/pyparsing.py in _parseNoCache(self, instring, loc, doActions, callPreParse)
   1675             if self.mayIndexError or preloc >= len(instring):
   1676                 try:
-> 1677                     loc, tokens = self.parseImpl(instring, preloc, doActions)
   1678                 except IndexError:
   1679                     raise ParseException(instring, len(instring), self.errmsg, self)

~/anaconda3/lib/python3.7/site-packages/pyparsing.py in parseImpl(self, instring, loc, doActions)
   4033         # pass False as last arg to _parse for first element, since we already
   4034         # pre-parsed the string as part of our And pre-parsing
-> 4035         loc, resultlist = self.exprs[0]._parse(instring, loc, doActions, callPreParse=False)
   4036         errorStop = False
   4037         for e in self.exprs[1:]:

~/anaconda3/lib/python3.7/site-packages/pyparsing.py in _parseCache(self, instring, loc, doActions, callPreParse)
   1836                 ParserElement.packrat_cache_stats[MISS] += 1
   1837                 try:
-> 1838                     value = self._parseNoCache(instring, loc, doActions, callPreParse)
   1839                 except ParseBaseException as pe:
   1840                     # cache a copy of the exception, without the traceback

~/anaconda3/lib/python3.7/site-packages/pyparsing.py in _parseNoCache(self, instring, loc, doActions, callPreParse)
   1679                     raise ParseException(instring, len(instring), self.errmsg, self)
   1680             else:
-> 1681                 loc, tokens = self.parseImpl(instring, preloc, doActions)
   1682 
   1683         tokens = self.postParse(instring, loc, tokens)

~/anaconda3/lib/python3.7/site-packages/pyparsing.py in parseImpl(self, instring, loc, doActions)
   4443     def parseImpl(self, instring, loc, doActions=True):
   4444         if self.expr is not None:
-> 4445             return self.expr._parse(instring, loc, doActions, callPreParse=False)
   4446         else:
   4447             raise ParseException("", loc, self.errmsg, self)

~/anaconda3/lib/python3.7/site-packages/pyparsing.py in _parseCache(self, instring, loc, doActions, callPreParse)
   1836                 ParserElement.packrat_cache_stats[MISS] += 1
   1837                 try:
-> 1838                     value = self._parseNoCache(instring, loc, doActions, callPreParse)
   1839                 except ParseBaseException as pe:
   1840                     # cache a copy of the exception, without the traceback

~/anaconda3/lib/python3.7/site-packages/pyparsing.py in _parseNoCache(self, instring, loc, doActions, callPreParse)
   1679                     raise ParseException(instring, len(instring), self.errmsg, self)
   1680             else:
-> 1681                 loc, tokens = self.parseImpl(instring, preloc, doActions)
   1682 
   1683         tokens = self.postParse(instring, loc, tokens)

~/anaconda3/lib/python3.7/site-packages/pyparsing.py in parseImpl(self, instring, loc, doActions)
   2881         if instring[loc] == self.firstMatchChar:
   2882             return loc + 1, self.match
-> 2883         raise ParseException(instring, loc, self.errmsg, self)
   2884 
   2885 _L = Literal

ParseException: Expected {SelectQuery | ConstructQuery | DescribeQuery | AskQuery}, found 's'  (at char 17), (line:2, col:17)

It looks like rdflib.plugins.sparql.parser.parseQuery(...) cannot parse it. Or maybe there is something that I missed writing code. If someone can help that would be great.

Cœur
  • 37,241
  • 25
  • 195
  • 267
Max_BZH
  • 1
  • 1

1 Answers1

0

As UninformedUser answered in the comments,

SELECT DISTINCT str(?s)

needs to be

SELECT DISTINCT (str(?s) as ?s_str)