#!/usr/bin/env python """ rdfcdb.py - Fast RDF database in pure Python Author: Sean B. Palmer License: GPL 2; share and enjoy! Status: Prototype Requirements: Python2.4+ - http://www.python.org/ python-cdb-0.32+ - http://pilcrow.madison.wi.us/python-cdb/ ntriples.py - http://inamidst.com/proj/rdf/ntriples.py """ import sys, urllib import cdb, ntriples class Node(unicode): pass class URI(Node): pass class bNode(Node): pass class Literal(Node): def __new__(cls, lit, dtype, lang): return Node.__new__(cls, lit) def nodeToDB(node): types = {URI: '>', bNode: '_', Literal: '"'} for key in types.iterkeys(): if isinstance(node, key): return types[key] + ' ' + node.encode('utf-8') raise ValueError("Unknown node type: %s" % type(node)) class Graph(object): def __init__(self, **kargs): self.database = '/desktop/rdfcdb' methods = {'uri': self.feedURI, 'ntriples': self.feedNTriples} for key in methods.iterkeys(): if kargs.has_key(key): methods[key](kargs[key]) def feedURI(self, uri): u = urllib.urlopen(uri) data = u.read() u.close() self.feedNTriples(data) def feedNTriples(self, nt): ntriples.URI = URI ntriples.bNode = bNode ntriples.Literal = Literal class NTriplesSink(object): def triple(sink, s, p, o): self.append(s, p, o) p = ntriples.NTriplesParser(sink=NTriplesSink()) p.parsestring(nt) def append(self, s, p, o): triple = map(nodeToDB, (s, p, o)) def main(): if len(sys.argv) == 2: Graph(uri=sys.argv[1]) if __name__=="__main__": main()