Class: SPARQL::Algebra::Operator::Path
- Includes:
- Query
- Defined in:
- lib/sparql/algebra/operator/path.rb
Overview
The SPARQL Property Path path operator.
The second element represents a set of predicates which ar associated with the first (subject) and last (object) operands.
[88] Path ::= PathAlternative
Constant Summary collapse
- NAME =
:path
Instance Attribute Summary
Attributes included from Query
Instance Method Summary collapse
-
#execute(queryable, **options) {|solution| ... } ⇒ RDF::Query::Solutions
Finds solutions from
queryablematching the path. -
#optimize(**options) ⇒ SPARQL::Algebra::Operator
Special cases for optimizing a path based on its operands.
-
#to_sparql(top_level: true, **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
Instance Method Details
#execute(queryable, **options) {|solution| ... } ⇒ RDF::Query::Solutions
Finds solutions from queryable matching the path.
46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
# File 'lib/sparql/algebra/operator/path.rb', line 46 def execute(queryable, **, &block) debug() {"Path #{operands.to_sse}"} subject, path_op, object = operands @solutions = RDF::Query::Solutions.new path_op.execute(queryable, subject: subject, object: object, graph_name: .fetch(:graph_name, false), **.merge(depth: [:depth].to_i + 1) ) do |solution| @solutions << solution end debug() {"=> #{@solutions.inspect}"} @solutions.uniq! @solutions.each(&block) if block_given? @solutions end |
#optimize(**options) ⇒ SPARQL::Algebra::Operator
Special cases for optimizing a path based on its operands.
85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 |
# File 'lib/sparql/algebra/operator/path.rb', line 85 def optimize(**) op = super while true decon = op.to_sxp_bin op = case decon # Reverse in [:path, subject, [:reverse, path], object] Path.new(object, path, subject) # Path* (seq (seq p0 (path* p1)) p2) in [:path, subject, [:seq, [:seq, p0, [:'path*', p1]], p2], object] pp1 = Variable.new(nil, distinguished: false) pp2 = Variable.new(nil, distinguished: false) pp3 = Variable.new(nil, distinguished: false) # Bind variables used in Path* bgp = BGP.new( Triple.new(pp2, p2, subject), Triple.new(object, p1, pp3)) # New path with pre-bound variables path = Path.new(pp3, PathStar.new(p2), pp2) Sequence.new(bgp, path) else # No matching patterns break end end op end |
#to_sparql(top_level: true, **options) ⇒ String
Returns a partial SPARQL grammar for this operator.
72 73 74 75 |
# File 'lib/sparql/algebra/operator/path.rb', line 72 def to_sparql(top_level: true, **) str = operands.to_sparql(top_level: false, **) + " ." top_level ? Operator.to_sparql(str, **) : str end |