Class: SPARQL::Algebra::Operator::Minus
- Inherits:
-
Binary
- Object
- SPARQL::Algebra::Operator
- Binary
- SPARQL::Algebra::Operator::Minus
- Includes:
- Query
- Defined in:
- lib/sparql/algebra/operator/minus.rb
Overview
The SPARQL GraphPattern minus
operator.
[66] MinusGraphPattern ::= ‘MINUS’ GroupGraphPattern
Constant Summary collapse
- NAME =
:minus
Constants inherited from Binary
Constants inherited from SPARQL::Algebra::Operator
Constants included from Expression
Instance Attribute Summary
Attributes included from Query
Attributes inherited from SPARQL::Algebra::Operator
Instance Method Summary collapse
-
#execute(queryable, **options) {|solution| ... } ⇒ RDF::Query::Solutions
Executes each operand with
queryable
and performs thejoin
operation by creating a new solution set containing themerge
of all solutions from each set that arecompatible
with each other. -
#optimize!(**options) ⇒ self
Optimizes this query.
-
#to_sparql(top_level: true, filter_ops: [], extensions: {}, **options) ⇒ String
Returns a partial SPARQL grammar for this operator.
Methods included from Query
#each_solution, #empty?, #failed?, #graph_name=, #matched?, #query_yields_boolean?, #query_yields_solutions?, #query_yields_statements?, #unshift, #variables
Methods inherited from Binary
Methods inherited from SPARQL::Algebra::Operator
#aggregate?, arity, #base_uri, base_uri, base_uri=, #bind, #boolean, #constant?, #deep_dup, #each_descendant, #eql?, #evaluatable?, evaluate, #executable?, #first_ancestor, for, #initialize, #inspect, #ndvars, #node?, #operand, #optimize, #parent, #parent=, #prefixes, prefixes, prefixes=, #rewrite, #to_binary, to_sparql, #to_sxp, #to_sxp_bin, #validate!, #variable?, #variables, #vars
Methods included from Expression
cast, #constant?, #evaluate, extension, extension?, extensions, for, #invalid?, new, #node?, open, #optimize, parse, register_extension, #to_sxp_bin, #valid?, #validate!, #variable?
Constructor Details
This class inherits a constructor from SPARQL::Algebra::Operator::Binary
Instance Method Details
#execute(queryable, **options) {|solution| ... } ⇒ RDF::Query::Solutions
Executes each operand with queryable
and performs the join
operation by creating a new solution set containing the merge
of all solutions from each set that are compatible
with each other.
67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 |
# File 'lib/sparql/algebra/operator/minus.rb', line 67 def execute(queryable, **, &block) # Let Ω1 and Ω2 be multisets of solution mappings. We define: # # Minus(Ω1, Ω2) = { μ | μ in Ω1 . ∀ μ' in Ω2, either μ and μ' are not compatible or dom(μ) and dom(μ') are disjoint } # # card[Minus(Ω1, Ω2)](μ) = card[Ω1](μ) debug() {"Minus"} left = queryable.query(operand(0), **.merge(depth: [:depth].to_i + 1)) debug() {"(minus left) #{left.inspect}"} right = queryable.query(operand(1), **.merge(depth: [:depth].to_i + 1)) debug() {"(minus right) #{right.inspect}"} @solutions = left.minus(right) @solutions.each(&block) if block_given? @solutions end |
#optimize!(**options) ⇒ self
Optimizes this query.
Groups of one graph pattern (not a filter) become join(Z, A) and can be replaced by A. The empty graph pattern Z is the identity for join: Replace join(Z, A) by A Replace join(A, Z) by A
93 94 95 96 97 |
# File 'lib/sparql/algebra/operator/minus.rb', line 93 def optimize!(**) ops = operands.map {|o| o.optimize(**) }.select {|o| o.respond_to?(:empty?) && !o.empty?} @operands = ops self end |
#to_sparql(top_level: true, filter_ops: [], extensions: {}, **options) ⇒ String
Returns a partial SPARQL grammar for this operator.
110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 |
# File 'lib/sparql/algebra/operator/minus.rb', line 110 def to_sparql(top_level: true, filter_ops: [], extensions: {}, **) lhs, *rhs = operands str = "{\n" + lhs.to_sparql(top_level: false, extensions: {}, **) # Any accrued filters go here. filter_ops.each do |op| str << "\nFILTER (#{op.to_sparql(**)}) ." end rhs.each do |minus| str << "\nMINUS {\n" str << minus.to_sparql(top_level: false, extensions: {}, **) str << "\n}" end str << "}" top_level ? Operator.to_sparql(str, extensions: extensions, **) : str end |