Class: LD::Patch::Algebra::Bind

Inherits:
SPARQL::Algebra::Operator::Ternary
  • Object
show all
Includes:
SPARQL::Algebra::Evaluatable, SPARQL::Algebra::Query
Defined in:
lib/ld/patch/algebra/bind.rb

Overview

The LD Patch ‘bind` operator.

The Bind operation is used to bind a single term to a variable.

Examples:

simple value to variable binding

Bind ?x <http://example.org/s> . #=>
(bind ?x <http://example.org/s> ())

constant path (filter-forward.ldpatch)

Bind ?x <http://example.org/s> / <http://example.org/p1> . #=>
(bind ?x <http://example.org/s> (<http://example.org/p1>))

list index (path-at.ldpatch)

Bind ?x <http://example.org/s> / 1 . #=>
(bind ?x <http://example.org/s> ((index 1)))

reverse (path-backward.ldpath)

Bind ?x <http://example.org/s> / ^<http://example.org/p1> . #=>
(bind ?x <http://example.org/s> ((reverse <http://example.org/p1>)))

constraint (path-filter-equal.ldpatch)

Bind ?x <http://example.org/s> / <http://example.org/p2> [  / <http://example.org/l> = "b" ] . #=>
(bind ?x <http://example.org/s> (
  <http://example.org/p2>
  (constraint (<http://example.org/l>) "b")))

constraint (path-filter.ldpatch)

Bind ?x <http://example.org/s> / <http://example.org/p2> [  / <http://example.org/p1> ] . #=>
(bind ?x <http://example.org/s> (
  <http://example.org/p2>
  (constraint (<http://example.org/l>))))

starting with a literal

Bind ?x "a" / ^<http://example.org/l> / ^<http://example.org/p2> . #=>
(bind ?x "a" (
  (reverse <http://example.org/l>)
  (reverse <http://example.org/p2>)))

unicity (path-unicity.ldpath)

Bind ?x <http://example.org/s> / <http://example.org/p1> ! . #=>
SELECT ?x
WHERE {<http//example.org/s> <http://example.org/p1> ?x}
GROUP BY ?x
HAVING COUNT(?x) = 1
(bind ?x ?0
  ((pattern <http://example.org/s> <http://example.org/p1> ??0)
   (unique ??0)))

Constant Summary collapse

NAME =
:bind

Instance Method Summary collapse

Instance Method Details

#execute(queryable, options = {}) ⇒ RDF::Query::Solutions

Maps the value to a single output term by executing the path and updates ‘bindings` with `var` set to that output term

Parameters:

  • queryable (RDF::Queryable)

    the graph or repository to write

  • options (Hash{Symbol => Object}) (defaults to: {})

    any additional options

Options Hash (options):

  • :bindings (RDF::Query::Solutions)

Returns:

  • (RDF::Query::Solutions)

    A single solution including passed bindings with ‘var` bound to the solution.

Raises:

  • (Error)

    If path does not evaluate to a single term or if unbound variables are used.

See Also:



69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
# File 'lib/ld/patch/algebra/bind.rb', line 69

def execute(queryable, options = {})
  debug(options) {"Bind"}
  bindings = options.fetch(:bindings)
  solution = bindings.first
  var, value, path = operands

  # Bind variables to path
  if value.variable?
    raise LD::Patch::Error.new("Operand uses unbound variable #{value.inspect}", code: 400) unless solution.bound?(value)
    value = solution[value]
  end

  path = path.dup.replace_vars! do |v|
    raise Error, "Operand uses unbound variable #{v.inspect}" unless solution.bound?(v)
    solution[v]
  end
  results = path.execute(queryable, terms: [value])
  raise LD::Patch::Error, "Bind path bound to #{results.length} terms, expected just one" unless results.length == 1
  RDF::Query::Solutions.new [solution.merge(var.to_sym => results.first.path)]
end