class SPARQL::Algebra::Operator::NotOneOf

The SPARQL Property Path `notoneof` (NegatedPropertySet) operator.

@example

(notoneof ex:p1 ex:p2)

@see www.w3.org/TR/sparql11-query/#eval_negatedPropertySet

Constants

NAME

Public Instance Methods

execute(queryable, **options, &block) click to toggle source

Equivalant to:

(path (:x (noteoneof :p :q) :y))
=> (filter (notin ??p :p :q) (bgp (:x ??p :y)))

@note all operands are terms, and not operators, so this can be done by filtering results usin

@param [RDF::Queryable] queryable

the graph or repository to query

@param [Hash{Symbol => Object}] options

any additional keyword options

@option options [RDF::Term, RDF::Variable] :subject @option options [RDF::Term, RDF::Variable] :object @yield [solution]

each matching solution

@yieldparam [RDF::Query::Solution] solution @yieldreturn [void] ignored @see www.w3.org/TR/sparql11-query/#sparqlAlgebra

# File lib/sparql/algebra/operator/notoneof.rb, line 34
def execute(queryable, **options, &block)
  debug(options) {"NotOneOf #{operands.to_sse}"}
  subject, object = options[:subject], options[:object]

  v = RDF::Query::Variable.new(distinguished: false)
  bgp = RDF::Query.new do |q|
    q.pattern [subject, v, object]
  end
  query = Filter.new(NotIn.new(v, *operands), bgp)
  queryable.query(query, depth: options[:depth].to_i + 1, **options) do |solution|
    solution.bindings.delete(v.to_sym)
    debug(options) {"(solution)-> #{solution.to_h.to_sse}"}
    block.call(solution)
  end
end