Hello again,
I found another small bug. When giving an empty prefix name in a
SPARQL query I get: TypeError: unsupported operand type(s) for +:
'NoneType' and 'unicode'
Here is from the SPARQL draft: http://www.w3.org/TR/rdf-sparql-query/#termSyntax
----------------
Prefixed names
The PREFIX keyword associates a prefix label with an IRI. A prefixed
name is a prefix label and a local part, separated by a colon ":". It
is mapped to an IRI by concatenating the local part to the IRI
corresponding to the prefix. The prefix label may be the empty string.
----------------
This happens in SPARQLEvaluate.py in the convertTerm method. I tried
making a small patch for it and a test case (see attachment).
I'm interested in getting the SPARQL engine to support a larger subset
of the SPARQL spec. Especially nested optionals. Is anyone working on
this currently?
Cheers,
Mikael
from rdflib import ConjunctiveGraph
from StringIO import StringIO
import unittest
test_data = """
@prefix foaf: <http://xmlns.com/foaf/0.1/> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
_:a foaf:name "Alice" .
"""
test_query = """PREFIX :<http://xmlns.com/foaf/0.1/>
SELECT ?name
WHERE {
?x :name ?name .
}"""
correct = '"name" : {"type": "literal", "xml:lang" : "None", "value" : "Alice"}'
class Query(unittest.TestCase):
def testQueryPlus(self):
graph = ConjunctiveGraph()
graph.parse(StringIO(test_data), format="n3")
result_json = graph.query(test_query).serialize(format='json')
self.failUnless(result_json.find(correct) > 0)
if __name__ == "__main__":
unittest.main()
Index: rdflib/sparql/bison/SPARQLEvaluate.py
===================================================================
--- rdflib/sparql/bison/SPARQLEvaluate.py (revision 906)
+++ rdflib/sparql/bison/SPARQLEvaluate.py (working copy)
@@ -53,8 +54,8 @@
return term
elif isinstance(term,QName):
#QNames and QName prefixes are the same in the grammar
- if not term.prefix:
- return URIRef(queryProlog.baseDeclaration + term.localname)
+ if term.prefix == None:
+ return URIRef(queryProlog.baseDeclaration + term.localname)
else:
return URIRef(queryProlog.prefixBindings[term.prefix] + term.localname)
elif isinstance(term,QNamePrefix):
_______________________________________________
Dev mailing list
[email protected]
http://rdflib.net/mailman/listinfo/dev