import sys import string import re import util import rdfstore S, P, O, C = 0, 1, 2, 3 V, T = 0, 1 URI = 'tag:infomesh.net,2001-08-07:URI' LIT = 'tag:infomesh.net,2001-08-07:Literal' ANON = 'tag:infomesh.net,2001-08-07:Anon' RC = 'tag:infomesh.net,2001-08-07:RootContext' CONT = 'tag:infomesh.net,2001-08-07:Context' # For extensibility class Rules(rdfstore.RDFStore): def __init__(self): rdfstore.RDFStore.__init__(self, data=[]) def filter(self): """Filters out obvious stuff from the store.""" tdata = range(len(self.data)) for t in range(len(self.data)): try: # In case one is removed and the loop still goes on... # @@ I'm not sure how to fix this dt = self.data[t] for x in range(len(self.data)): dx = self.data[x] if dt == dx and t != x: self.data.remove(self.data[x]) except: sys.stderr.write('Doc.filter produced an error\n') # It would be better to do the proper matching function for t in range(len(self.data)): try: trt = self.data[t] if trt[S][V] == trt[O][V] and trt[P][V] == DAML_EQUIV: self.data.remove(self.data[t]) except: sys.stderr.write('Doc.filter produced an error\n') # e.g. doc = Doc(data=mydata); doc.filter() def rules(self): """This is a simple inference thing, cf. srules-lite.n3/drules-lite.n3 e.g. doc = Doc(data=mydata); doc.rules()""" data = self.data for t in range(len(data)): dt = data[t] if dt[P][V] == DAML_EQUIV and dt[S][V] != dt[O][V]: for x in range(len(data)): dx = data[x] if dx[S][V] == dt[S][V]: self.add([data[t][O], data[x][P], data[x][O]]) elif dx[P][V] == dt[S][V]: self.add([data[x][S], data[t][O], data[x][O]]) elif dx[O][V] == dt[S][V]: self.add([data[x][S], data[x][P], data[t][O]]) for t in range(len(data)): dt = data[t] if dt[P][V] == RDFS_RANGE: for x in range(len(data)): dx = data[x] if dx[P][V] == dt[S][V]: self.add([data[x][O], (RDF_TYPE, URI), data[t][O]]) for t in range(len(data)): dt = data[t] if dt[P][V] == RDFS_DOMAIN: for x in range(len(data)): dx = data[x] if dx[P][V] == dt[S][V]: self.add([data[x][S], (RDF_TYPE, URI), data[t][O]]) for t in range(len(data)): dt = data[t] if dt[P][V] == RDFS_SUBCLASS: for x in range(len(data)): dx = data[x] if dx[P][V] == RDF_TYPE and dx[O][V] == dt[S][V]: self.add([data[x][S], (RDF_TYPE, URI), data[t][O]]) # Neat stuff def inference(self, rules): data = self.data # This is going to be very difficult; kudos to TimBL. rules will # have to be a weird kind of Doc, I think. A sub class. # # Well, CWM is indeed a masterpiece, but the code is so dense: it's # the kind of program into which you could feed a business card, and # get out a foolproof plan for world peace.