def from_n3(s, default=None, backend=None): r''' Creates the Identifier corresponding to the given n3 string. >>> from_n3('<http://ex.com/foo>') == URIRef('http://ex.com/foo') True >>> from_n3('"foo"@de') == Literal('foo', lang='de') True >>> from_n3('"""multi\nline\nstring"""@en') == Literal('multi\nline\nstring', lang='en') True >>> from_n3('42') == Literal(42) True ''' # TODO: should be able to handle prefixes given as opt. argument maybe: from_n3('rdfs:label') if not s: return default if s.startswith('<'): return URIRef(s[1:-1]) elif s.startswith('"'): if s.startswith('"""'): quotes = '"""' else: quotes = '"' value, rest = s.rsplit(quotes, 1) value = value[len(quotes):] # strip leading quotes datatype = None language = None # as a given datatype overrules lang-tag check for it first dtoffset = rest.rfind('^^') if dtoffset >= 0: # found a datatype # datatype has to come after lang-tag so ignore everything before # see: http://www.w3.org/TR/2011/WD-turtle-20110809/#prod-turtle2-RDFLiteral datatype = rest[dtoffset + 2:] else: if rest.startswith("@"): language = rest[1:] # strip leading at sign value = value.replace(r'\"', '"').replace('\\\\', '\\') # Hack: this should correctly handle strings with either native unicode # characters, or \u1234 unicode escapes. value = value.encode("raw-unicode-escape").decode("unicode-escape") return Literal(value, language, datatype) elif s == 'true' or s == 'false': return Literal(s == 'true') elif s.isdigit(): return Literal(int(s)) elif s.startswith('{'): identifier = from_n3(s[1:-1]) return QuotedGraph(backend, identifier) elif s.startswith('['): identifier = from_n3(s[1:-1]) return Graph(backend, identifier) else: if s.startswith("_:"): return BNode(s[2:]) else: return BNode(s)
def testGracefulOrdering(self): u = URIRef('cake') g = Graph() a = u > u a = u > BNode() a = u > QuotedGraph(g.store, u) a = u > g
def create_term(termString, termType, store, objLanguage=None, objDatatype=None): """ Take a term value, term type, and store instance and creates a term object. QuotedGraphs are instantiated differently """ ### "Big Data" hack: ### Prevents caches from being generated (necessary for bulk operations). if termType == "L": if objLanguage and not objDatatype: rt = Literal(termString, objLanguage) elif objDatatype and not objLanguage: rt = Literal(termString, datatype=objDatatype) elif not objLanguage and not objDatatype: rt = Literal(termString) else: rt = Literal(termString, objDatatype) return rt elif termType == "F": rt = QuotedGraph(store, URIRef(termString)) return rt elif termType == "B": rt = TERM_INSTANTIATION_DICT[termType](termString) return rt elif termType == "U": rt = URIRef(termString) return rt else: rt = TERM_INSTANTIATION_DICT[termType](termString) return rt
def formula(self): formula_id = BNode() if formula_id == self.sink.graph.identifier: return self.sink.graph else: return QuotedGraph(store=self.sink.graph.store, identifier=formula_id)
def createTerm(termString, termType, store, objLanguage=None, objDatatype=None): if termType == 'L': cache = store.literalCache.get((termString, objLanguage, objDatatype)) if cache is not None: #store.cacheHits += 1 return cache else: #store.cacheMisses += 1 rt = Literal(termString, objLanguage, objDatatype) store.literalCache[((termString, objLanguage, objDatatype))] = rt return rt elif termType == 'F': cache = store.otherCache.get((termType, termString)) if cache is not None: #store.cacheHits += 1 return cache else: #store.cacheMisses += 1 rt = QuotedGraph(store, URIRef(termString)) store.otherCache[(termType, termString)] = rt return rt elif termType == 'B': cache = store.bnodeCache.get((termString)) if cache is not None: #store.cacheHits += 1 return cache else: #store.cacheMisses += 1 rt = TERM_INSTANCIATION_DICT[termType](termString) store.bnodeCache[(termString)] = rt return rt elif termType == 'U': cache = store.uriCache.get((termString)) if cache is not None: #store.cacheHits += 1 return cache else: #store.cacheMisses += 1 rt = URIRef(termString) store.uriCache[(termString)] = rt return rt else: cache = store.otherCache.get((termType, termString)) if cache is not None: #store.cacheHits += 1 return cache else: #store.cacheMisses += 1 rt = TERM_INSTANCIATION_DICT[termType](termString) store.otherCache[(termType, termString)] = rt return rt
def add_rule_in(graph): """ Helper function for defining N3 rules in a Graph. Usage:: g = Graph() wih add_rule_in(g) as (ifgraph, thengraph): ifgraph.add((...)) thengraph.add((...)) """ store = graph.store assert store.formula_aware ifgraph = QuotedGraph(store, BNode()) thengraph = QuotedGraph(store, BNode()) try: yield (ifgraph, thengraph) graph.add((ifgraph, LOG.implies, thengraph)) except: raise
def from_n3(s, default=None, backend=None): """ Creates the Identifier corresponding to the given n3 string. """ if not s: return default if s.startswith('<'): return URIRef(s[1:-1]) elif s.startswith('"'): # TODO: would a regex be faster? value, rest = s.rsplit('"', 1) value = value[1:] # strip leading quote if rest.startswith("@"): if "^^" in rest: language, rest = rest.rsplit('^^', 1) language = language[1:] # strip leading at sign else: language = rest[1:] # strip leading at sign rest = '' else: language = None if rest.startswith("^^"): datatype = rest[3:-1] else: datatype = None value = value.replace('\\"', '"').replace('\\\\', '\\') # Hack: this should correctly handle strings with either native unicode # characters, or \u1234 unicode escapes. value = value.encode("raw-unicode-escape").decode("unicode-escape") return Literal(value, language, datatype) elif s.startswith('{'): identifier = from_n3(s[1:-1]) return QuotedGraph(backend, identifier) elif s.startswith('['): identifier = from_n3(s[1:-1]) return Graph(backend, identifier) else: if s.startswith("_:"): return BNode(s[2:]) else: return BNode(s)
def from_n3(s, default=None, backend=None): """ Creates the Identifier corresponding to the given n3 string. WARNING: untested, may contain bugs. TODO: add test cases.""" if not s: return default if s.startswith('<'): return URIRef(s[1:-1]) elif s.startswith('"'): # TODO: would a regex be faster? value, rest = rsplit(s, '"', 1) value = value[1:] # strip leading quote if rest.startswith("@"): if "^^" in rest: language, rest = rsplit(rest, '^^', 1) language = language[1:] # strip leading at sign else: language = rest[1:] # strip leading at sign rest = '' else: language = None if rest.startswith("^^"): datatype = rest[3:-1] else: datatype = None value = value.replace('\\"', '"').replace('\\\\', '\\').decode("unicode-escape") return Literal(value, language, datatype) elif s.startswith('{'): identifier = from_n3(s[1:-1]) return QuotedGraph(backend, identifier) elif s.startswith('['): identifier = from_n3(s[1:-1]) return Graph(backend, identifier) else: if s.startswith("_:"): return BNode(s[2:]) else: return BNode(s)
def from_n3(s, default=None, backend=None, nsm=None): r''' Creates the Identifier corresponding to the given n3 string. >>> from_n3('<http://ex.com/foo>') == URIRef('http://ex.com/foo') True >>> from_n3('"foo"@de') == Literal('foo', lang='de') True >>> from_n3('"""multi\nline\nstring"""@en') == Literal( ... 'multi\nline\nstring', lang='en') True >>> from_n3('42') == Literal(42) True >>> from_n3(Literal(42).n3()) == Literal(42) True >>> from_n3('"42"^^xsd:integer') == Literal(42) True >>> from rdflib import RDFS >>> from_n3('rdfs:label') == RDFS['label'] True >>> nsm = NamespaceManager(Graph()) >>> nsm.bind('dbpedia', 'http://dbpedia.org/resource/') >>> berlin = URIRef('http://dbpedia.org/resource/Berlin') >>> from_n3('dbpedia:Berlin', nsm=nsm) == berlin True ''' if not s: return default if s.startswith('<'): # Hack: this should correctly handle strings with either native unicode # characters, or \u1234 unicode escapes. return URIRef( s[1:-1].encode("raw-unicode-escape").decode("unicode-escape")) elif s.startswith('"'): if s.startswith('"""'): quotes = '"""' else: quotes = '"' value, rest = s.rsplit(quotes, 1) value = value[len(quotes):] # strip leading quotes datatype = None language = None # as a given datatype overrules lang-tag check for it first dtoffset = rest.rfind('^^') if dtoffset >= 0: # found a datatype # datatype has to come after lang-tag so ignore everything before # see: http://www.w3.org/TR/2011/WD-turtle-20110809/ # #prod-turtle2-RDFLiteral datatype = from_n3(rest[dtoffset + 2:], default, backend, nsm) else: if rest.startswith("@"): language = rest[1:] # strip leading at sign value = value.replace(r'\"', '"') # Hack: this should correctly handle strings with either native unicode # characters, or \u1234 unicode escapes. value = value.encode("raw-unicode-escape").decode("unicode-escape") return Literal(value, language, datatype) elif s == 'true' or s == 'false': return Literal(s == 'true') elif s.isdigit(): return Literal(int(s)) elif s.startswith('{'): identifier = from_n3(s[1:-1]) return QuotedGraph(backend, identifier) elif s.startswith('['): identifier = from_n3(s[1:-1]) return Graph(backend, identifier) elif s.startswith("_:"): return BNode(s[2:]) elif ':' in s: if nsm is None: # instantiate default NamespaceManager and rely on its defaults nsm = NamespaceManager(Graph()) prefix, last_part = s.split(':', 1) ns = dict(nsm.namespaces())[prefix] return Namespace(ns)[last_part] else: return BNode(s)
def createTerm(termString, termType, store, objLanguage=None, objDatatype=None): """ #TODO: Stuff Takes a term value, term type, and store intsance and creates a term object. QuotedGraphs are instantiated differently """ if termType == 'L': cache = store.literalCache.get((termString, objLanguage, objDatatype)) if cache is not None: #store.cacheHits += 1 return cache else: #store.cacheMisses += 1 # rt = Literal(termString, objLanguage, objDatatype) # store.literalCache[((termString, objLanguage, objDatatype))] = rt if objLanguage and not objDatatype: rt = Literal(termString, lang=objLanguage) store.literalCache[((termString, objLanguage))] = rt elif objDatatype and not objLanguage: rt = Literal(termString, datatype=objDatatype) store.literalCache[((termString, objDatatype))] = rt elif not objLanguage and not objDatatype: rt = Literal(termString) store.literalCache[((termString))] = rt else: rt = Literal(termString, datatype=objDatatype) store.literalCache[((termString, objDatatype))] = rt return rt elif termType == 'F': cache = store.otherCache.get((termType, termString)) if cache is not None: #store.cacheHits += 1 return cache else: #store.cacheMisses += 1 rt = QuotedGraph(store, URIRef(termString)) store.otherCache[(termType, termString)] = rt return rt elif termType == 'B': cache = store.bnodeCache.get((termString)) if cache is not None: #store.cacheHits += 1 return cache else: #store.cacheMisses += 1 rt = TERM_INSTANTIATION_DICT[termType](termString) store.bnodeCache[(termString)] = rt return rt elif termType == 'U': cache = store.uriCache.get((termString)) if cache is not None: #store.cacheHits += 1 return cache else: #store.cacheMisses += 1 rt = URIRef(termString) store.uriCache[(termString)] = rt return rt else: cache = store.otherCache.get((termType, termString)) if cache is not None: #store.cacheHits += 1 return cache else: #store.cacheMisses += 1 rt = TERM_INSTANTIATION_DICT[termType](termString) store.otherCache[(termType, termString)] = rt return rt
#!/usr/bin/python import argparse from rdflib import URIRef from rdflib.collection import Collection from rdflib.graph import QuotedGraph from sys import stdin import logging logging.getLogger().setLevel(logging.INFO) parser = argparse.ArgumentParser(description='SemPipe Planner: Construct commands to build resources.') args = parser.parse_args() g = QuotedGraph('IOMemory', URIRef("sempipe:conf")) g.parse(stdin, format='n3', publicID=URIRef("file:///home/urs/p/andonyar/articles/")) def instruction_buildVar(var): name = g.value(var, URIRef("http://www.andonyar.com/rec/2012/sempipe/voc#name"), None, any=False) value = g.value(var, URIRef("http://www.andonyar.com/rec/2012/sempipe/voc#value"), None, any=False) assert(name and value) return "{}={}".format(name, value) def instruction_build(col): col = Collection(g, col) return [ c for c in col ] resources = g.subjects(URIRef("http://www.w3.org/1999/02/22-rdf-syntax-ns#type"), URIRef("http://www.andonyar.com/rec/2012/sempipe/voc#Resource")) for r in resources: logging.info("Building resource {0}".format(r)) instructions = []