Class: LD::Patch::Algebra::Path
- Inherits:
-
SPARQL::Algebra::Operator
- Object
- SPARQL::Algebra::Operator
- LD::Patch::Algebra::Path
- Includes:
- SPARQL::Algebra::Evaluatable, SPARQL::Algebra::Query
- Defined in:
- lib/ld/patch/algebra/path.rb
Overview
The LD Patch path
operator.
The Path creates a closure over path operands querying queryable
for terms having a relationship with the input terms
based on each operand. The terms extracted from the first operand are used as inputs for the next operand until a final set of terms is found. These terms are returned as RDF:Query::Solution
bound the the variable ?path
Returns input terms
Queries queryable
for objects where the input terms are subjects and the predicate is :p
Queries queryable
for subjects where input terms are objects and the predicate is :p
, by executing the reverse
operand using input terms to get a set of output terms.
Returns the input terms satisfying the constrant.
Maps terms using (path :p)
, using them as terms for (path :q)
, then subsets these based on the constraint.
Constant Summary collapse
- NAME =
:path
Instance Method Summary collapse
-
#execute(queryable, options = {}) ⇒ RDF::Query::Solutions
Executes this operator using the given variable
bindings
and a starting term, returning zero or more terms at the end of the path.
Instance Method Details
#execute(queryable, options = {}) ⇒ RDF::Query::Solutions
Executes this operator using the given variable bindings
and a starting term, returning zero or more terms at the end of the path.
47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
# File 'lib/ld/patch/algebra/path.rb', line 47 def execute(queryable, = {}) solutions = RDF::Query::Solutions.new # Iterate updating terms, then create solutions from matched terms operands.inject(Array(.fetch(:terms))) do |terms, op| case op when RDF::URI terms.map do |subject| queryable.query({subject: subject, predicate: op}).map(&:object) end.flatten when SPARQL::Algebra::Query # Get path solutions for each term for op op.execute(queryable, **.merge(terms: terms)).map do |soln| soln.path end.flatten else raise NotImplementedError, "Unknown path operand #{op.inspect}" end end.each do |term| solutions << RDF::Query::Solution.new(path: term) end solutions end |