Bad SPARQLStore handling of empty literals · Issue #457 · RDFLib/rdflib (original) (raw)
When an empty literal is returned to a SPARQLStore, it becomes an rdflib.term.Literal(u'None')
instead of an rdflib.term.Literal(u'')
:
./fuseki-server --update --mem /empty_literal
import rdflib from rdflib.plugins.stores.sparqlstore import SPARQLUpdateStore
store = SPARQLUpdateStore('http://fuseki.til.io:3030/empty_literal/query', 'http://fuseki.til.io:3030/empty_literal/update')
graph = rdflib.Graph(store, 'http://example.com/')
graph.add((rdflib.URIRef('http://example.com/s'), rdflib.URIRef('http://example.com/p'), rdflib.Literal('')))
o = tuple(graph)[0][2] assert o == rdflib.Literal(''), repr(o)
raises an AssertionError: rdflib.term.Literal(u'None')
The problem seems to be in rdflib.plugins.stores.sparqlstore:CastToTerm
:
import io from xml.etree import ElementTree
import rdflib from rdflib.plugins.stores.sparqlstore import CastToTerm
s = """<ns0:literal xmlns:ns0="http://www.w3.org/2005/sparql-results#" />""" node = ElementTree.parse(io.BytesIO(s)).getroot() term = CastToTerm(node) assert term == rdflib.Literal(''), repr(term)
raises an AssertionError: rdflib.term.Literal(u'None')