home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / usr / share / python-support / python-rdflib / rdflib / sparql / bison / GraphPattern.py < prev    next >
Encoding:
Python Source  |  2007-04-04  |  4.7 KB  |  109 lines

  1. """
  2. See: http://www.w3.org/TR/rdf-sparql-query/#GraphPattern
  3. [20] GraphPattern ::=  FilteredBasicGraphPattern ( GraphPatternNotTriples '.'? GraphPattern )?
  4. [21] FilteredBasicGraphPattern ::= BlockOfTriples? ( Constraint '.'? FilteredBasicGraphPattern )?
  5. [23] GraphPatternNotTriples  ::=  OptionalGraphPattern | GroupOrUnionGraphPattern | GraphGraphPattern
  6. [24] OptionalGraphPattern  ::=  'OPTIONAL' GroupGraphPattern
  7. [25] GraphGraphPattern  ::=  'GRAPH' VarOrBlankNodeOrIRIref GroupGraphPattern
  8. [26] GroupOrUnionGraphPattern ::=  GroupGraphPattern ( 'UNION' GroupGraphPattern )*
  9. [27] Constraint ::= 'FILTER' ( BrackettedExpression | BuiltInCall | FunctionCall )
  10. """
  11.  
  12. class ParsedGroupGraphPattern(object):
  13.     """
  14.     See: http://www.w3.org/TR/rdf-sparql-query/#GroupPatterns
  15.     A group graph pattern GP is a set of graph patterns, GPi.
  16.     This class is defined to behave (literally) like a set of GraphPattern instances.
  17.     """
  18.     def __init__(self,graphPatterns):
  19.         self.graphPatterns = graphPatterns
  20.     def __iter__(self):
  21.         for g in self.graphPatterns:
  22.             if not g.triples and g.nonTripleGraphPattern is None:
  23.                 continue
  24.             else:
  25.                 yield g
  26.     def __len__(self):
  27.         return len([g for g in self.graphPatterns if g.triples or g.nonTripleGraphPattern is not None])
  28.     def __getitem__(self, k):
  29.         return list(self.graphPatterns)[k]
  30.     def __repr__(self):
  31.         return "{ %s }"%repr(list(self))
  32.  
  33. class BlockOfTriples(object):
  34.     """
  35.     A Basic Graph Pattern is a set of Triple Patterns.
  36.     """
  37.     def __init__(self,statementList):
  38.         self.statementList = statementList
  39.     def __getattr__(self, attr):
  40.         if hasattr(self.statementList, attr):
  41.             return getattr(self.statementList, attr)
  42.         raise AttributeError, '%s has no such attribute %s' % (repr(self), attr)
  43.     def __repr__(self):
  44.         return "<SPARQLParser.BasicGraphPattern: %s>"%repr(self.statementList)
  45.  
  46. class GraphPattern(object):
  47.     """
  48.     Complex graph patterns can be made by combining simpler graph patterns. The ways of creating graph patterns are:
  49.     * Basic Graph Patterns, where a set of triple patterns must match
  50.     * Group Graph Pattern, where a set of graph patterns must all match using the same variable substitution
  51.     * Value constraints, which restrict RDF terms in a solution
  52.     * Optional Graph patterns, where additional patterns may extend the solution
  53.     * Alternative Graph Pattern, where two or more possible patterns are tried
  54.     * Patterns on Named Graphs, where patterns are matched against named graphs
  55.  
  56.     This class is defined as a direct analogy of Grammar rule [20]:
  57. s    """
  58.     def __init__(self,triples,nonTripleGraphPattern=None):
  59.         triples = triples and triples or []
  60.         self.triples = triples
  61.         self.nonTripleGraphPattern = nonTripleGraphPattern
  62.  
  63.     def __repr__(self):
  64.         if not self.triples and self.nonTripleGraphPattern is None:
  65.             return "<SPARQLParser.EmptyGraphPattern>"
  66.         return "<SPARQLParser.GraphPattern: %s%s>"%(
  67.                     self.triples is not None and self.triples or '',
  68.                     self.nonTripleGraphPattern is not None and ' %s'%self.nonTripleGraphPattern or '')
  69.  
  70. class ParsedOptionalGraphPattern(ParsedGroupGraphPattern):
  71.     """
  72.     An optional graph pattern is a combination of a pair of graph patterns.
  73.     The second pattern modifies pattern solutions of the first pattern but
  74.     does not fail matching of the overall optional graph pattern.
  75.     """
  76.     def __init__(self,groupGraphPattern):
  77.         super(ParsedOptionalGraphPattern,self).__init__(groupGraphPattern.graphPatterns)
  78.  
  79.     def __repr__(self):
  80.         return "OPTIONAL {%s}"%self.graphPatterns
  81.  
  82. class ParsedAlternativeGraphPattern(object):
  83.     """
  84.     A union graph pattern is a set of group graph patterns GPi.
  85.     A union graph pattern matches a graph G with solution S
  86.     if there is some GPi such that GPi matches G with solution S.
  87.     """
  88.     def __init__(self,alternativePatterns):
  89.         self.alternativePatterns = alternativePatterns
  90.     def __repr__(self):
  91.         return " UNION ".join(["{%s}"%g for g in self.alternativePatterns])
  92.     def __iter__(self):
  93.         for g in self.alternativePatterns:
  94.             yield g
  95.     def __len__(self):
  96.         return len(self.alternativePatterns)
  97.  
  98. class ParsedGraphGraphPattern(ParsedGroupGraphPattern):
  99.     """
  100.     Patterns on Named Graphs, where patterns are matched against named graphs
  101.     """
  102.     def __init__(self,graphName,groupGraphPattern):
  103.         self.name = graphName
  104.         super(ParsedGraphGraphPattern,self).__init__(groupGraphPattern.graphPatterns)
  105.  
  106.     def __repr__(self):
  107.         return "GRAPH %s { %s }"%(self.name,self.graphPatterns)
  108.  
  109.