Class: SPARQL::Algebra::Operator::Path
- Inherits:
-
Ternary
- Object
- SPARQL::Algebra::Operator
- Ternary
- 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
Constants inherited from Ternary
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
Finds solutions from
queryable
matching 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
Methods inherited from Ternary
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, #mergable?, #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::Ternary
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 |