Class: SPARQL::Algebra::Operator::PathZero
- Inherits:
-
Unary
- Object
- SPARQL::Algebra::Operator
- Unary
- SPARQL::Algebra::Operator::PathZero
- Includes:
- Query
- Defined in:
- lib/sparql/algebra/operator/path_zero.rb
Overview
The SPARQL Property Path path0
(ZeroLengthPath) operator.
A zero length path matches all subjects and objects in the graph, and also any RDF terms explicitly given as endpoints of the path pattern.
Constant Summary collapse
- NAME =
:path0
Constants inherited from Unary
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| ... } ⇒ Object
Zero length path:.
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 Unary
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, #optimize!, #parent, #parent=, #prefixes, prefixes, prefixes=, #rewrite, #to_binary, to_sparql, #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, #optimize!, parse, register_extension, #to_sxp_bin, #valid?, #validate!, #variable?
Constructor Details
This class inherits a constructor from SPARQL::Algebra::Operator::Unary
Instance Method Details
#execute(queryable, **options) {|solution| ... } ⇒ Object
Zero length path:
(path x (path0 :p) y) => (filter (x = y) (solution x y))
31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 |
# File 'lib/sparql/algebra/operator/path_zero.rb', line 31 def execute(queryable, **, &block) subject, object = [:subject], [:object] debug() {"PathZero #{[subject, operands, object].to_sse}"} solutions = RDF::Query::Solutions.new # The zero-length case implies subject == object. case when subject.variable? && object.variable? # Nodes is the set of all subjects and objects in queryable query = RDF::Query.new {|q| q.pattern({subject: subject})} query.execute(queryable, **) do |solution| solution.merge!(object.to_sym => solution[subject]) unless solutions.include?(solution) #debug(options) {"(solution-s0)-> #{solution.to_h.to_sse}"} solutions << solution end end if query.valid? # All objects which are `object` query = RDF::Query.new {|q| q.pattern({object: object})} query.execute(queryable, **) do |solution| solution.merge!(subject.to_sym => solution[object]) unless solutions.include?(solution) #debug(options) {"(solution-o0)-> #{solution.to_h.to_sse}"} solutions << solution end end if query.valid? when subject.variable? # All subjects which are `object` query = RDF::Query.new {|q| q.pattern({subject: object})} query.execute(queryable, **) do |solution| solution.merge!(subject.to_sym => object) unless solutions.include?(solution) #debug(options) {"(solution-s0)-> #{solution.to_h.to_sse}"} solutions << solution end end if query.valid? # All objects which are `object` query = RDF::Query.new {|q| q.pattern({object: object})} query.execute(queryable, **) do |solution| solution.merge!(subject.to_sym => object) unless solutions.include?(solution) #debug(options) {"(solution-o0)-> #{solution.to_h.to_sse}"} solutions << solution end end if query.valid? when object.variable? # All subjects which are `subject` query = RDF::Query.new {|q| q.pattern({subject: subject})} query.execute(queryable, **) do |solution| solution.merge!(object.to_sym => subject) unless solutions.include?(solution) #debug(options) {"(solution-s0)-> #{solution.to_h.to_sse}"} solutions << solution end end if query.valid? # All objects which are `subject` query = RDF::Query.new {|q| q.pattern({object: subject})} query.execute(queryable, **) do |solution| solution.merge!(object.to_sym => subject) unless solutions.include?(solution) #debug(options) {"(solution-o0)-> #{solution.to_h.to_sse}"} solutions << solution end end if query.valid? else # Otherwise, if subject == object, an empty solution solutions << RDF::Query::Solution.new if subject == object end solutions.uniq! debug() {"(path0)=> #{solutions.to_sxp}"} solutions.each(&block) if block_given? solutions end |