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')