Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristophe Gueret <christophe.gueret@gmail.com>2011-08-25 14:03:26 (GMT)
committer Christophe Gueret <christophe.gueret@gmail.com>2011-08-25 14:03:26 (GMT)
commit51e6883c936f23c149efaeb584659a771da5f3e6 (patch)
tree3cc6280d31182a6549ba5d49d86dd8a81bf2aa99
parentb855a33f4a64e0c76994575bba5a89f14269d5e2 (diff)
Improved the usage of SPARQL
-rwxr-xr-xbin/datastore-service.py2
-rw-r--r--bin/test.py15
-rw-r--r--src/semanticxo/indexstore.py30
-rw-r--r--src/semanticxo/metadatastore.py32
-rw-r--r--src/semanticxo/sparql.py43
5 files changed, 79 insertions, 43 deletions
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