"""An RDF Schema processor.""" import sys import string import re import util import rdfstore import ntriples import swiptql # Declare some constants S, P, O, C = 0, 1, 2, 3 V, T = 0, 1 L, VAL = 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' VAR = 'tag:infomesh.net,2001-08-07:Var' RC = 'tag:infomesh.net,2001-08-07:RootContext' CONT = 'tag:infomesh.net,2001-08-07:Context' # For extensibility RDF_NS = 'http://www.w3.org/1999/02/22-rdf-syntax-ns#' RDFS_NS = 'http://www.w3.org/2000/01/rdf-schema#' RDF_TYPE = [RDF_NS+'type', URI] RDF_PROP = [RDF_NS+'Property', URI] RDFS_RESOURCE = [RDFS_NS+'Resource', URI] RDFS_CLASS = [RDFS_NS+'Class', URI] class RDFS(rdfstore.RDFStore): """An RDF Schema.""" def __init__(self): rdfstore.RDFStore.__init__(self, data=[]) def entail(self): pass def schemaclosure(self): self.addq([RDFS_RESOURCE, RDF_TYPE, RDFS_CLASS]) self.addq([RDFS_DOMAIN, RDF_TYPE, RDFS_CONSTRES]) self.addq([RDFS_RANGE, RDF_TYPE, RDFS_CONSTRES]) self.foreachadd([quad[S], RDF_TYPE, RDFS_RESOURCE]) # 1a self.foreachadd([quad[P], RDF_TYPE, RDF_PROP]) # 1b self.foreachadd([quad[O], RDF_TYPE, RDFS_RESOURCE]) # 1c for q1 in self.quads: # 2 if q1[P] == RDFS_SUBPROPOF: for q2 in self.quads: if q2[S] == q1[O]: self.addq([q1[S], RDFS_SUBPROPOF, q2[O]]) for quad in self.quads: # 3a if quad[P] == RDFS_SUBPROPOF: self.addq([quad[S], RDF_TYPE, RDF_PROP]) for quad in self.quads: # 3b if quad[P] == RDFS_SUBPROPOF: self.addq([quad[O], RDF_TYPE, RDF_PROP]) for q1 in self.quads: # 4 for q2 in self.quads: if q2[S] == q1[P] and q2[P] == RDFS_SUBPROPOF: self.addq([q1[S], q2[O], q1[O]]) for q1 in self.quads: # 5 for q2 in self.quads: if q2[S] == q1[P] and q2[P] == RDFS_DOMAIN: self.addq([q1[S], RDF_TYPE, q1[O]]) for q1 in self.quads: # 6 for q2 in self.quads: if q2[S] == q1[P] and q2[P] == RDFS_RANGE: self.addq([q1[O], RDF_TYPE, q1[O]]) for quad in self.quads: # 7 if quad[P] == RDF_TYPE: self.addq([quad[O], RDF_TYPE, RDFS_CLASS]) for quad in self.quads: # 8 if quad[P] == RDFS_SUBCLASSOF and quad[O] == RDFS_CLASS: self.addq([quad[S], RDFS_SUBCLASSOF, RDFS_RESOURCE]) for quad in self.quads: # 9a if quad[P] == RDFS_SUBCLASSOF: self.addq([quad[S], RDF_TYPE, RDFS_CLASS]) for quad in self.quads: # 9b if quad[P] == RDFS_SUBCLASSOF: self.addq([quad[O], RDF_TYPE, RDFS_CLASS]) for q1 in self.quads: # 10 if q1[P] == RDFS_SUBCLASSOF: for q2 in self.quads: if q2[S] == q1[O] and q2[P] == RDFS_SUBCLASSOF: self.addq([q1[S], RDFS_SUBCLASSOF, q2[O]]) for q1 in self.quads: # 11 if q1[P] == RDFS_SUBCLASSOF: for q2 in self.quads: if q2[O] == q1[S] and q2[P] == RDF_TYPE: self.addq([q2[S], RDF_TYPE, q2[O]]) for q1 in self.quads: # 12 if q1[P] == RDF_TYPE and q1[O] == RDFS_CONTRES: for q2 in self.quads: if q2[S] == q1[S] and q2[P] == RDF_TYPE and q2[O] == RDF_PROP: self.addq([q1[S], RDFS_TYPE, RDFS_CONSTPROP]) def foreachadd(self, s): for quad in self.quads: self.addq(s)