Viewing file:      Statement.py (5.4 KB)      -rw-r--r-- Select action/file-type:    (+) |   (+) |   (+) | Code (+) | Session (+) |   (+) | SDB (+) |   (+) |   (+) |   (+) |   (+) |   (+) |
 
######################################################################## # $Header: /var/local/cvsroot/4Suite/Ft/Rdf/Statement.py,v 1.20 2005/03/05 06:15:52 mbrown Exp $ """ An RDF statement
  Copyright 2005 Fourthought, Inc. (USA). Detailed license and copyright information: http://4suite.org/COPYRIGHT Project home, documentation, distributions: http://4suite.org/ """
  from Ft.Lib.Uri import MatchesUriSyntax from Ft.Rdf import RDF_MS_BASE, OBJECT_TYPE_LITERAL, OBJECT_TYPE_RESOURCE, OBJECT_TYPE_UNKNOWN from Ft.Rdf import RdfException from Ft.Rdf.Resource import Resource
 
  # See this article for ideas on more efficient reification: # http://lists.w3.org/Archives/Public/www-rdf-interest/2000Nov/0450.html
  class Statement(Resource):     """Represents an RDF triple or statement"""
      def __init__(self, subject, predicate, object_, statementUri='',                  scope='', objectType=OBJECT_TYPE_UNKNOWN):         """         Initializer for an RDF statement instance.         statementUri is the URI of this statement.         scope is usually the URI of the serialized source of this statement.         """         Resource.__init__(self, statementUri)         if not isinstance(subject, (str, unicode)):             raise TypeError("Subject not of type string: %s" % str(subject))         if not isinstance(predicate, (str, unicode)):             raise TypeError("Predicate not of type string: %s" % str(predicate))         if not isinstance(object_, (str, unicode)):             raise TypeError("Object not of type string: %s" % str(object_))         if statementUri is not None and not isinstance(statementUri, (str, unicode)):             raise TypeError("Statement URI not of type string: %s" % str(statementUri))         if scope is not None and not isinstance(scope, (str, unicode)):             raise TypeError("Scope not of type string: %s" % str(scope))
          self.subject = subject         self.predicate = predicate         self.object = object_         self.scope = scope         self.objectType = objectType         self.uri = statementUri is None and '' or statementUri         return
      def __cmp__(self, other):         if not isinstance(other, Statement):             raise TypeError("Object being compared must be a Statement, not a %s" % type(other))         # per Uche on 4suite list, 2005-02-28:         # By default, don't compare scope or statementUri.         # Compare objectType if it is known.         if self.objectType != OBJECT_TYPE_UNKNOWN and other.objectType != OBJECT_TYPE_UNKNOWN:             return cmp((self.subject, self.predicate, self.object, self.objectType),                        (other.subject, other.predicate, other.object, other.objectType))         else:             return cmp((self.subject, self.predicate, self.object),                        (other.subject, other.predicate, other.object))
 
      # always define when defining __cmp__ or obj will be unhashable     def __hash__(self):         return id(self)
      def reify(self, model, uri=None):         """         Prepare the statement in the model so that it can be the subject of         other statements.  See the RDF spec for details of how statements are expanded for         reification.  Note that the original statement is not removed by reification.         The statement's uri is used as the subject of the added statements, or a URI         is generated if the statement's uri is an empty string.         """         if uri is None:             if self.uri:                 uri = self.uri             else:                 uri = model.generateUri()                 self.uri = uri         model.add(Statement(uri, RDF_MS_BASE+'type', RDF_MS_BASE+'Statement',                             scope=uri))         model.add(Statement(uri, RDF_MS_BASE+'subject', self.subject,                             scope=uri))         model.add(Statement(uri, RDF_MS_BASE+'predicate', self.predicate,                             scope=uri))         model.add(Statement(uri, RDF_MS_BASE+'object', self.object,                             scope=uri))         return uri
 
      def asTuple(self, encoding=None):         """         Returns the statement data as a tuple in this order:         (subject, object, predicate, scope, statementUri, objectType)
          If an encoding argument is given, all values are coerced to that encoding.         Otherwise, they are left as-is. If the encoding is the special value         'unicode', then the values are coerced to unicode types.         """         if encoding is None:             return (self.subject, self.predicate, self.object, self.uri, self.scope,                     str(self.objectType))         elif encoding == 'unicode':             return tuple([unicode(s) for s in self.asTuple(encoding=None)])         else:             return tuple([s.encode(encoding) for s in self.asTuple(encoding=None)])
 
      def __repr__(self):         if self.scope:             return '<RDF Statement at %s: [%s, Scope: %s]>' % (id(self), str(self), self.scope)         else:             return '<RDF Statement at %s: [%s]>' % (id(self), str(self))
 
      def __str__(self):         if self.objectType == OBJECT_TYPE_LITERAL:             obj = repr(self.object)         elif self.objectType == OBJECT_TYPE_RESOURCE:             obj = self.object         elif MatchesUriSyntax(self.object):             obj = self.object         else:             obj = repr(self.object)         return 'Subject: %s, Predicate: %s, Object: %s' % (             self.subject, self.predicate, obj) 
  |