Don't use xsd:string for string data types in toTypedNode
[htsworkflow.git] / htsworkflow / util / rdfhelp.py
index 91414145af9f3955726b36602a6dd585979eb388..5c73d98be3e6e0b75afe6273824a708a7f608791 100644 (file)
@@ -1,10 +1,13 @@
 """Helper features for working with librdf
 """
+import logging
 import os
 import types
 
 import RDF
 
+logger = logging.getLogger(__name__)
+
 # standard ontology namespaces
 owlNS = RDF.NS('http://www.w3.org/2002/07/owl#')
 dublinCoreNS = RDF.NS("http://purl.org/dc/elements/1.1/")
@@ -18,6 +21,20 @@ dafTermOntology = RDF.NS("http://jumpgate.caltech.edu/wiki/UcscDaf#")
 libraryOntology = RDF.NS("http://jumpgate.caltech.edu/wiki/LibraryOntology#")
 submissionLog = RDF.NS("http://jumpgate.caltech.edu/wiki/SubmissionsLog/")
 
+def sparql_query(model, query_filename):
+    """Execute sparql query from file
+    """
+    logger.info("Opening: %s" % (query_filename,))
+    query_body = open(query_filename,'r').read()
+    query = RDF.SPARQLQuery(query_body)
+    results = query.execute(model)
+    for row in results:
+        output = []
+        for k,v in row.items()[::-1]:
+            print "{0}: {1}".format(k,v)
+        print 
+
+
 def blankOrUri(value=None):
     node = None
     if value is None:
@@ -43,13 +60,15 @@ def toTypedNode(value):
     elif type(value) == types.FloatType:
         value_type = xsdNS['float'].uri
         value = unicode(value)
-    elif type(value) in types.StringTypes:
-        value_type = xsdNS['string'].uri
     else:
         value_type = None
         value = unicode(value)
 
-    return RDF.Node(literal=value, datatype=value_type)
+    if value_type is not None:
+        node = RDF.Node(literal=value, datatype=value_type)
+    else:
+        node = RDF.Node(literal=value)
+    return node
 
 def fromTypedNode(node):
     if node is None:
@@ -79,16 +98,19 @@ def fromTypedNode(node):
 
     return literal
 
-
+    
 def get_model(model_name=None, directory=None):
     if directory is None:
         directory = os.getcwd()
         
     if model_name is None:
         storage = RDF.MemoryStorage()
+        logger.info("Using RDF Memory model")
     else:
+        options = "hash-type='bdb',dir='{0}'".format(directory)
         storage = RDF.HashStorage(model_name,
-                      options="hash-type='bdb',dir='{0}'".format(directory))
+                      options=options)
+        logger.info("Using {0} with options {1}".format(model_name, options))
     model = RDF.Model(storage)
     return model