Class: RDF::N3::Algebra::Log::Includes
- Inherits:
-
ResourceOperator
- Object
- SPARQL::Algebra::Operator::Binary
- ResourceOperator
- RDF::N3::Algebra::Log::Includes
- Defined in:
- lib/rdf/n3/algebra/log/includes.rb
Overview
The subject formula includes the object formula.
Formula A includes formula B if there exists some substitution which when applied to B creates a formula B’ such that for every statement in B’ is also in A, every variable universally (or existentially) quantified in B’ is quantified in the same way in A.
Variable substitution is applied recursively to nested compound terms such as formulae, lists and sets.
(Understood natively by cwm when in in the antecedent of a rule. You can use this to peer inside nested formulae.)
Direct Known Subclasses
Constant Summary collapse
Instance Attribute Summary
Attributes included from Enumerable
Instance Method Summary collapse
-
#apply(subject, object) ⇒ RDF::Literal::Boolean
Creates a repository constructed by substituting variables and in that subject with known IRIs and queries object against that repository.
-
#input_operand ⇒ Object
Both subject and object are inputs.
-
#resolve(resource, position:) ⇒ RDF::Term
Both subject and object must be formulae.
Methods inherited from ResourceOperator
#as_literal, #execute, #valid?
Methods included from Builtin
#each, #evaluate, #hash, #rank, #to_uri
Instance Method Details
#apply(subject, object) ⇒ RDF::Literal::Boolean
this does allow object to have variables not in the subject, if they could have been substituted away.
Creates a repository constructed by substituting variables and in that subject with known IRIs and queries object against that repository. Either retuns a single solution, or no solutions.
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 |
# File 'lib/rdf/n3/algebra/log/includes.rb', line 40 def apply(subject, object) subject_var_map = subject.variables.values.inject({}) {|memo, v| memo.merge(v => RDF::URI(v.name))} object_vars = object.variables.keys log_debug(NAME, "subject var map") {SXP::Generator.string(subject_var_map.to_sxp_bin)} log_debug(NAME, "object vars") {SXP::Generator.string(object_vars.to_sxp_bin)} # create a queryable from subject, replacing variables with IRIs for thsoe variables. queryable = RDF::Repository.new do |r| log_depth do subject.each do |stmt| parts = stmt.to_quad.map do |part| part.is_a?(RDF::Query::Variable) ? subject_var_map.fetch(part) : part end r << RDF::Statement.from(parts) end end end # Query object against subject solns = log_depth {queryable.query(object, **@options)} log_info("(#{NAME} solutions)") {SXP::Generator.string solns.to_sxp_bin} if !solns.empty? && (object_vars - solns.variable_names).empty? # Return solution solns.first else # Return false, RDF::Literal::FALSE end end |
#input_operand ⇒ Object
Both subject and object are inputs.
26 27 28 |
# File 'lib/rdf/n3/algebra/log/includes.rb', line 26 def input_operand RDF::N3::List.new(values: operands) end |
#resolve(resource, position:) ⇒ RDF::Term
Both subject and object must be formulae.
21 22 23 |
# File 'lib/rdf/n3/algebra/log/includes.rb', line 21 def resolve(resource, position:) resource if resource.formula? end |