From 51e6883c936f23c149efaeb584659a771da5f3e6 Mon Sep 17 00:00:00 2001 From: Christophe Gueret Date: Thu, 25 Aug 2011 14:03:26 +0000 Subject: Improved the usage of SPARQL --- diff --git a/bin/datastore-service.py b/bin/datastore-service.py index 6453d3e..f22ee68 100755 --- a/bin/datastore-service.py +++ b/bin/datastore-service.py @@ -24,8 +24,8 @@ if not os.path.exists(log_dir): # setup logger logger.start('datastore') #logging.basicConfig(level=5, format='%(created)f %(levelname)s %(name)s: %(message)s', stream=sys.stderr) -#logging.getLogger('').setLevel(5) +#logging.getLogger('').setLevel(5) # build the datastore dbus.mainloop.glib.DBusGMainLoop(set_as_default=True) bus = dbus.SessionBus() diff --git a/bin/test.py b/bin/test.py index a45b8c7..219239a 100644 --- a/bin/test.py +++ b/bin/test.py @@ -13,16 +13,17 @@ if os.path.exists("/tmp/olpc-session-bus"): if __name__ == "__main__": entry = datastore.create() - entry.metadata['title'] = 'Terminal-test' - entry.metadata['activity'] = 'Terminal' - entry.metadata['activity_id'] = 'Terminal' - #datastore.write(entry) - #print "Saved %s" % entry.get_object_id() - entry.destroy() + entry.metadata['title'] = 'Terminal Activity' + entry.metadata['activity'] = 'org.laptop.Terminal' + entry.metadata['activity_id'] = 'fca2a2a11810059906890855469ddb0c56be6a2a' + entry.metadata['icon-color'] = '#FF8F00,#B20008' + datastore.write(entry) + print "Saved %s" % entry.get_object_id() + #entry.destroy() query = {} #query['query'] = 'Terminal*' - query['activity_id'] = 'Terminal' + query['activity_id'] = 'fca2a2a11810059906890855469ddb0c56be6a2a' print "Search %r" % query objects, count = datastore.find(query, limit=2) print objects, count diff --git a/src/semanticxo/indexstore.py b/src/semanticxo/indexstore.py index 8947ed5..84e2be6 100644 --- a/src/semanticxo/indexstore.py +++ b/src/semanticxo/indexstore.py @@ -21,6 +21,7 @@ import httplib import urllib from semanticxo import layoutmanager +from semanticxo.sparql import SPARQL from semanticxo.layoutmanager import MAX_QUERY_LIMIT from semanticxo.metadatastore import OLPC_TERMS @@ -92,14 +93,11 @@ class Enquire(object): pass def get_set(self, offset, limit): + sparql = SPARQL() query = "SELECT ?uid WHERE {\n %s \n}" % "\n".join(self._graph_patterns) - params = {'query': query, 'format' : 'csv'} - headers = {'Content-Type': 'application/x-www-form-urlencoded'} - conn = httplib.HTTPConnection('127.0.0.1:8080') - conn.request("POST", "/sparql", urllib.urlencode(params), headers=headers) - response = conn.getresponse() - results = response.read().split('\n')[1:-1] - conn.close() + results = [] + for result in sparql.execute_select(query): + results.append(result['uid']) return results class IndexStore(object): @@ -179,24 +177,26 @@ class IndexStore(object): query_result = enquire.get_set(offset, limit) total_count = len(query_result) - + logging.debug('[IDX] query result %r' % query_result) + uids = [] for hit in query_result: - uids.append(hit.split(",")[1][1:-1]) + uids.append(hit) #.split(",")[1][1:-1] return (uids, total_count) def delete(self, uid): # TODO Needed ? - self._database.delete_document(_PREFIX_FULL_VALUE + _PREFIX_UID + uid) - self._flush() - + #self._database.delete_document(_PREFIX_FULL_VALUE + _PREFIX_UID + uid) + #self._flush() + pass + def get_activities(self): logging.debug('[IDX] get_activities') activities = [] - prefix = _PREFIX_FULL_VALUE + _PREFIX_ACTIVITY - for term in self._database.allterms(prefix): - activities.append(term.term[len(prefix):]) + #prefix = _PREFIX_FULL_VALUE + _PREFIX_ACTIVITY + #for term in self._database.allterms(prefix): + # activities.append(term.term[len(prefix):]) return activities def flush(self): diff --git a/src/semanticxo/metadatastore.py b/src/semanticxo/metadatastore.py index 66e5893..0f2d55a 100644 --- a/src/semanticxo/metadatastore.py +++ b/src/semanticxo/metadatastore.py @@ -5,9 +5,9 @@ Created on Apr 11, 2011 ''' import logging import httplib -import urllib import time from rdflib import ConjunctiveGraph, RDF, URIRef, Namespace, Literal +from semanticxo.sparql import SPARQL OLPC = Namespace("http://example.org/") OLPC_TERMS = Namespace("http://example.org/terms#") @@ -22,7 +22,7 @@ class MetadataStore(object): self._url = '127.0.0.1:8080' def store(self, uid, metadata): - print '[MDS] store ' + uid + ' ' + str(metadata) + logging.debug('[MDS] store ' + uid + ' ' + str(metadata)) metadata['uid'] = uid # Preprocess the metadata @@ -54,6 +54,7 @@ class MetadataStore(object): graph.add((resource, key, value)) # Save it + logging.debug('[MDS] save > %s' % graph.serialize()) headers = { 'Accept' : '*/*', 'Content-Type': 'application/rdf+xml' } conn = httplib.HTTPConnection(self._url) conn.request("PUT", "/data/%s" % resource, body=graph.serialize(), headers=headers) @@ -64,15 +65,17 @@ class MetadataStore(object): def retrieve(self, uid, properties=None): logging.debug('[MDS] retrieve %r' % uid) props = {} - query = 'SELECT * WHERE { <%s> ?p ?o}' % self._get_resource(uid) - for line in self._sparql_get(query): - (id, prop, value) = line.split(',') - if prop[4:-1].startswith(OLPC_TERMS): - key=prop[4:-1].split(OLPC_TERMS)[1] + query = 'SELECT ?p ?o WHERE { <%s> ?p ?o. }' % self._get_resource(uid) + sparql = SPARQL() + for result in sparql.execute_select(query): + logging.debug('[MDS] result %r' % result) + print result + if result['p'].startswith(OLPC_TERMS): + key=result['p'].split(OLPC_TERMS)[1] if key in _QUERY_INT_KEY: - props[key] = int(value[1:-1]) + props[key] = int(result['o']) else: - props[key] = value[1:-1] + props[key] = result['o'] # HACK: This is expected to be always present if 'creation_time' not in props: @@ -94,14 +97,3 @@ class MetadataStore(object): def _get_resource(self, uid): return URIRef(OLPC['resource/%s' % uid]) - - def _sparql_get(self, query): - params = {'query': query, 'format' : 'csv'} - headers = {'Content-Type': 'application/x-www-form-urlencoded'} - conn = httplib.HTTPConnection(self._url) - conn.request("POST", "/sparql", urllib.urlencode(params), headers=headers) - response = conn.getresponse() - results = response.read().split('\n')[1:-1] - conn.close() - return results - diff --git a/src/semanticxo/sparql.py b/src/semanticxo/sparql.py new file mode 100644 index 0000000..ca42167 --- /dev/null +++ b/src/semanticxo/sparql.py @@ -0,0 +1,43 @@ +''' +Created on 25 Aug 2011 + +@author: cgueret +''' +import httplib +import urllib +import cjson +from rdflib import URIRef, Literal + +class SPARQL(object): + ''' + classdocs + ''' + + + def __init__(self): + ''' + Constructor + ''' + self._url = '127.0.0.1:8080' + + def execute_select(self, query): + params = {'query': query, 'format' : 'json'} + headers = {'Content-Type': 'application/x-www-form-urlencoded'} + conn = httplib.HTTPConnection(self._url) + conn.request("POST", "/sparql", urllib.urlencode(params), headers=headers) + # Get the results + response = conn.getresponse() + r = cjson.decode(response.read(), all_unicode=False) + print r['results']['bindings'] + # Recode them + results = [] + for entry in r['results']['bindings']: + result = {} + for (name,data) in entry.iteritems(): + value = Literal(data['value']) + if data['type']=='uri': + value = URIRef(data['value']) + result[name] = value + results.append(result) + conn.close() + return results \ No newline at end of file -- cgit v0.9.1