Well, for some time I had pondered what it would take fo provide SPARQL support in 4Suite RDF. I fell upon sparql-p, earlier and noticed it was essentially a SPARQL query processor w/out a parser to drive it. It works over a deprecated rdflib interface: TripleStore. The newly suggested interface is Graph, which is as solid suggestion for a generic RDF:API as any. So, I wrote a 4Suite RDF model backend for rdflib, that allows the wrapping of Graph around a live 4Suite RDF model. Finally, I used this backend to execute a sparql-p query over http://http://del.icio.us/rss/chimezie:
SELECT ?title WHERE { ?item rdf:type rss:item; dc:subject ?subj; rss:title ?title. FILTER (REGEX(?subj,".*rdf")). }
The corresponding python code:
#Setup FtRDF Model Memory.InitializeModule() db = Memory.GetDb('rules', 'test') db.begin() model = Model.Model(db) #Parse my del.icio.us rss feed szr = Dom.Serializer() domStr=urllib2.urlopen('http://del.icio.us/rss/chimezie').read() dom = Domlette.NonvalidatingReader.parseString(domStr,'http://del.icio.us/rss/chimezie') szr.deserialize(model,dom,scope='http://del.icio.us/rss/chimezie') #Setup rdflib.Graph with FtRDF Model as Backend, using FtRdf driver g=Graph(FtRdf(model)) #Setup sparql-p query processor engine select = ("?title") #Setup term copia = URIRef('http://del.icio.us/chimezie') rssTitle = URIRef('http://purl.org/rss/1.0/title') versaWiki = URIRef('http://en.wikipedia.org/wiki/Versa') dc_subject=URIRef("http://purl.org/dc/elements/1.1/subject") #Filter on objects of statements (dc:subject values) - keep only those containing the string 'rdf' def rdfSubFilter(subj,pred,obj): return bool(obj.find('rdf')+1) #Execute query where = GraphPattern([("?item",rdf_type,URIRef('http://purl.org/rss/1.0/item')), ("?item",dc_subject,"?subj",rdfSubFilter), ("?item",rssTitle,"?title")]) tStore = myTripleStore(FtRdf(model)) result = tStore.query(select,where) pprint(result)
The result (which will change daily as my links shift thru my del.icio.us channel queue:
[chimezie@Zion RDF-API]$ python FtRdfBackend.py [u'rdflibUtils', u'Representing Specified Values in OWL: "value partitions" and "value sets"', u'Sparta', u'planner-rdf', u'RDF Template Language 1.0', u'SIOC Vocabulary Specification', u'SPARQL in RDFLib', u'MeetingRecords - ESW Wiki', u'Enumerated datatypes (OWL)', u'Defining N-ary Relations on the Semantic Web: Use With Individuals']
via Copia