rdf-n3 3.0.1 → 3.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (104) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +198 -76
  3. data/UNLICENSE +1 -1
  4. data/VERSION +1 -1
  5. data/lib/rdf/n3/algebra/builtin.rb +79 -0
  6. data/lib/rdf/n3/algebra/formula.rb +446 -0
  7. data/lib/rdf/n3/algebra/list/append.rb +42 -0
  8. data/lib/rdf/n3/algebra/list/first.rb +24 -0
  9. data/lib/rdf/n3/algebra/list/in.rb +48 -0
  10. data/lib/rdf/n3/algebra/list/iterate.rb +96 -0
  11. data/lib/rdf/n3/algebra/list/last.rb +24 -0
  12. data/lib/rdf/n3/algebra/list/length.rb +24 -0
  13. data/lib/rdf/n3/algebra/list/member.rb +44 -0
  14. data/lib/rdf/n3/algebra/list_operator.rb +96 -0
  15. data/lib/rdf/n3/algebra/log/conclusion.rb +65 -0
  16. data/lib/rdf/n3/algebra/log/conjunction.rb +36 -0
  17. data/lib/rdf/n3/algebra/log/content.rb +34 -0
  18. data/lib/rdf/n3/algebra/log/dtlit.rb +41 -0
  19. data/lib/rdf/n3/algebra/log/equal_to.rb +34 -0
  20. data/lib/rdf/n3/algebra/log/implies.rb +102 -0
  21. data/lib/rdf/n3/algebra/log/includes.rb +70 -0
  22. data/lib/rdf/n3/algebra/log/langlit.rb +41 -0
  23. data/lib/rdf/n3/algebra/log/n3_string.rb +34 -0
  24. data/lib/rdf/n3/algebra/log/not_equal_to.rb +23 -0
  25. data/lib/rdf/n3/algebra/log/not_includes.rb +27 -0
  26. data/lib/rdf/n3/algebra/log/output_string.rb +40 -0
  27. data/lib/rdf/n3/algebra/log/parsed_as_n3.rb +36 -0
  28. data/lib/rdf/n3/algebra/log/semantics.rb +40 -0
  29. data/lib/rdf/n3/algebra/math/absolute_value.rb +36 -0
  30. data/lib/rdf/n3/algebra/math/acos.rb +26 -0
  31. data/lib/rdf/n3/algebra/math/acosh.rb +26 -0
  32. data/lib/rdf/n3/algebra/math/asin.rb +26 -0
  33. data/lib/rdf/n3/algebra/math/asinh.rb +26 -0
  34. data/lib/rdf/n3/algebra/math/atan.rb +26 -0
  35. data/lib/rdf/n3/algebra/math/atanh.rb +26 -0
  36. data/lib/rdf/n3/algebra/math/ceiling.rb +28 -0
  37. data/lib/rdf/n3/algebra/math/cos.rb +40 -0
  38. data/lib/rdf/n3/algebra/math/cosh.rb +38 -0
  39. data/lib/rdf/n3/algebra/math/difference.rb +40 -0
  40. data/lib/rdf/n3/algebra/math/equal_to.rb +54 -0
  41. data/lib/rdf/n3/algebra/math/exponentiation.rb +35 -0
  42. data/lib/rdf/n3/algebra/math/floor.rb +28 -0
  43. data/lib/rdf/n3/algebra/math/greater_than.rb +41 -0
  44. data/lib/rdf/n3/algebra/math/less_than.rb +41 -0
  45. data/lib/rdf/n3/algebra/math/negation.rb +38 -0
  46. data/lib/rdf/n3/algebra/math/not_equal_to.rb +25 -0
  47. data/lib/rdf/n3/algebra/math/not_greater_than.rb +25 -0
  48. data/lib/rdf/n3/algebra/math/not_less_than.rb +25 -0
  49. data/lib/rdf/n3/algebra/math/product.rb +20 -0
  50. data/lib/rdf/n3/algebra/math/quotient.rb +36 -0
  51. data/lib/rdf/n3/algebra/math/remainder.rb +35 -0
  52. data/lib/rdf/n3/algebra/math/rounded.rb +26 -0
  53. data/lib/rdf/n3/algebra/math/sin.rb +40 -0
  54. data/lib/rdf/n3/algebra/math/sinh.rb +38 -0
  55. data/lib/rdf/n3/algebra/math/sum.rb +40 -0
  56. data/lib/rdf/n3/algebra/math/tan.rb +40 -0
  57. data/lib/rdf/n3/algebra/math/tanh.rb +38 -0
  58. data/lib/rdf/n3/algebra/not_implemented.rb +13 -0
  59. data/lib/rdf/n3/algebra/resource_operator.rb +122 -0
  60. data/lib/rdf/n3/algebra/str/concatenation.rb +27 -0
  61. data/lib/rdf/n3/algebra/str/contains.rb +33 -0
  62. data/lib/rdf/n3/algebra/str/contains_ignoring_case.rb +33 -0
  63. data/lib/rdf/n3/algebra/str/ends_with.rb +33 -0
  64. data/lib/rdf/n3/algebra/str/equal_ignoring_case.rb +34 -0
  65. data/lib/rdf/n3/algebra/str/format.rb +17 -0
  66. data/lib/rdf/n3/algebra/str/greater_than.rb +38 -0
  67. data/lib/rdf/n3/algebra/str/less_than.rb +33 -0
  68. data/lib/rdf/n3/algebra/str/matches.rb +37 -0
  69. data/lib/rdf/n3/algebra/str/not_equal_ignoring_case.rb +17 -0
  70. data/lib/rdf/n3/algebra/str/not_greater_than.rb +17 -0
  71. data/lib/rdf/n3/algebra/str/not_less_than.rb +17 -0
  72. data/lib/rdf/n3/algebra/str/not_matches.rb +18 -0
  73. data/lib/rdf/n3/algebra/str/replace.rb +35 -0
  74. data/lib/rdf/n3/algebra/str/scrape.rb +35 -0
  75. data/lib/rdf/n3/algebra/str/starts_with.rb +33 -0
  76. data/lib/rdf/n3/algebra/time/day.rb +35 -0
  77. data/lib/rdf/n3/algebra/time/day_of_week.rb +27 -0
  78. data/lib/rdf/n3/algebra/time/gm_time.rb +29 -0
  79. data/lib/rdf/n3/algebra/time/hour.rb +35 -0
  80. data/lib/rdf/n3/algebra/time/in_seconds.rb +59 -0
  81. data/lib/rdf/n3/algebra/time/local_time.rb +29 -0
  82. data/lib/rdf/n3/algebra/time/minute.rb +35 -0
  83. data/lib/rdf/n3/algebra/time/month.rb +35 -0
  84. data/lib/rdf/n3/algebra/time/second.rb +35 -0
  85. data/lib/rdf/n3/algebra/time/timezone.rb +36 -0
  86. data/lib/rdf/n3/algebra/time/year.rb +29 -0
  87. data/lib/rdf/n3/algebra.rb +210 -0
  88. data/lib/rdf/n3/extensions.rb +221 -0
  89. data/lib/rdf/n3/format.rb +66 -1
  90. data/lib/rdf/n3/list.rb +630 -0
  91. data/lib/rdf/n3/reader.rb +774 -497
  92. data/lib/rdf/n3/reasoner.rb +282 -0
  93. data/lib/rdf/n3/refinements.rb +178 -0
  94. data/lib/rdf/n3/repository.rb +332 -0
  95. data/lib/rdf/n3/terminals.rb +78 -0
  96. data/lib/rdf/n3/vocab.rb +36 -3
  97. data/lib/rdf/n3/writer.rb +461 -250
  98. data/lib/rdf/n3.rb +11 -8
  99. metadata +177 -49
  100. data/AUTHORS +0 -1
  101. data/History.markdown +0 -99
  102. data/lib/rdf/n3/patches/array_hacks.rb +0 -53
  103. data/lib/rdf/n3/reader/meta.rb +0 -641
  104. data/lib/rdf/n3/reader/parser.rb +0 -237
@@ -0,0 +1,40 @@
1
+ module RDF::N3::Algebra::Log
2
+ ##
3
+ # The subject is a key and the object is a string, where the strings are to be output in the order of the keys.
4
+ class OutputString < RDF::N3::Algebra::ResourceOperator
5
+ NAME = :logOutputString
6
+ URI = RDF::N3::Log.outputString
7
+
8
+ ##
9
+ # Resolves inputs as strings.
10
+ #
11
+ # @param [RDF::Term] resource
12
+ # @param [:subject, :object] position
13
+ # @return [RDF::Term]
14
+ # @see RDF::N3::ResourceOperator#evaluate
15
+ def resolve(resource, position:)
16
+ SPARQL::Algebra::Expression.cast(RDF::XSD.string, resource) if resource.term?
17
+ end
18
+
19
+ ##
20
+ # Returns `term2`, but adds `term2` as an output keyed on `term1`.
21
+ #
22
+ # @param [RDF::Term] term1
23
+ # an RDF term
24
+ # @param [RDF::Term] term2
25
+ # an RDF term
26
+ # @return [RDF::Literal::Boolean] `true` or `false`
27
+ # @raise [TypeError] if either operand is not an RDF term or operands are not comperable
28
+ #
29
+ # @see RDF::Term#==
30
+ def apply(term1, term2)
31
+ (@options[:strings][term1.to_s] ||= []) << term2.to_s
32
+ term2
33
+ end
34
+
35
+ # Both subject and object are inputs.
36
+ def input_operand
37
+ RDF::N3::List.new(values: operands)
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,36 @@
1
+ module RDF::N3::Algebra::Log
2
+ ##
3
+ # The subject string, parsed as N3, gives this formula.
4
+ class ParsedAsN3 < RDF::N3::Algebra::ResourceOperator
5
+ NAME = :logParsedAsN3
6
+ URI = RDF::N3::Log.parsedAsN3
7
+
8
+ ##
9
+ # Parses the subject into a new formula.
10
+ #
11
+ # Returns nil if resource does not validate, given its position
12
+ #
13
+ # @param [RDF::N3::List] resource
14
+ # @return [RDF::Term]
15
+ def resolve(resource, position: :subject)
16
+ case position
17
+ when :subject
18
+ return nil unless resource.literal?
19
+ begin
20
+ repo = RDF::N3::Repository.new
21
+ repo << RDF::N3::Reader.new(resource.to_s, **@options.merge(list_terms: true, logger: false))
22
+ log_debug("logParsedAsN3") {SXP::Generator.string repo.statements.to_sxp_bin}
23
+ content_hash = resource.hash # used as name of resulting formula
24
+ form = RDF::N3::Algebra::Formula.from_enumerable(repo, graph_name: RDF::Node.intern(content_hash))
25
+ log_info(NAME) {"form hash (#{resource}): #{form.hash}"}
26
+ form
27
+ rescue RDF::ReaderError
28
+ nil
29
+ end
30
+ when :object
31
+ return nil unless resource.literal? || resource.is_a?(RDF::Query::Variable)
32
+ resource
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,40 @@
1
+ module RDF::N3::Algebra::Log
2
+ ##
3
+ # The log:semantics of a document is the formula. achieved by parsing representation of the document. For a document in Notation3, log:semantics is the log:parsedAsN3 of the log:contents of the document. For a document in RDF/XML, it is parsed according to the RDF/XML specification to yield an RDF formula (a subclass of N3 log:Formula).
4
+ #
5
+ # [Aside: Philosophers will be distracted here into worrying about the meaning of meaning. At least we didn't call this function "meaning"! In as much as N3 is used as an interlingua for interoperability for different systems, this for an N3 based system is the meaning expressed by a document.]
6
+ #
7
+ # (Cwm knows how to go get a document and parse N3 and RDF/XML it in order to evaluate this. Other languages for web documents may be defined whose N3 semantics are therefore also calculable, and so they could be added in due course. See for example GRDDL, RDFa, etc)
8
+ class Semantics < RDF::N3::Algebra::ResourceOperator
9
+ NAME = :logSemantics
10
+ URI = RDF::N3::Log.semantics
11
+
12
+ ##
13
+ # Parses the subject into a new formula.
14
+ #
15
+ # Returns nil if resource does not validate, given its position
16
+ #
17
+ # @param [RDF::N3::List] resource
18
+ # @return [RDF::Term]
19
+ def resolve(resource, position: :subject)
20
+ case position
21
+ when :subject
22
+ return nil unless resource.literal? || resource.uri?
23
+ begin
24
+ repo = RDF::N3::Repository.new
25
+ repo << RDF::Reader.open(resource, **@options.merge(list_terms: true, base_uri: resource, logger: false))
26
+ content_hash = repo.statements.hash # used as name of resulting formula
27
+ form = RDF::N3::Algebra::Formula.from_enumerable(repo, graph_name: RDF::Node.intern(content_hash))
28
+ log_debug(NAME) {"form hash (#{resource}): #{form.hash}"}
29
+ form
30
+ rescue IOError, RDF::ReaderError => e
31
+ log_error(NAME) {"error loading #{resource}: #{e}"}
32
+ nil
33
+ end
34
+ when :object
35
+ return nil unless resource.literal? || resource.variable?
36
+ resource
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,36 @@
1
+ module RDF::N3::Algebra::Math
2
+ ##
3
+ # The object is calulated as the absolute value of the subject.
4
+ #
5
+ # @see https://www.w3.org/TR/xpath-functions/#func-abs
6
+ class AbsoluteValue < RDF::N3::Algebra::ResourceOperator
7
+ NAME = :mathAbsoluteValue
8
+ URI = RDF::N3::Math.absoluteValue
9
+
10
+ ##
11
+ # The math:absoluteValue operator takes string or number and calculates its absolute value.
12
+ #
13
+ # @param [RDF::Term] resource
14
+ # @param [:subject, :object] position
15
+ # @return [RDF::Term]
16
+ # @see RDF::N3::ResourceOperator#evaluate
17
+ def resolve(resource, position:)
18
+ case position
19
+ when :subject
20
+ return nil unless resource.literal?
21
+ as_literal(resource.as_number.abs)
22
+ when :object
23
+ return nil unless resource.literal? || resource.variable?
24
+ resource
25
+ end
26
+ end
27
+
28
+ ##
29
+ # Input is either the subject or object
30
+ #
31
+ # @return [RDF::Term]
32
+ def input_operand
33
+ RDF::N3::List.new(values: operands)
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,26 @@
1
+ module RDF::N3::Algebra::Math
2
+ ##
3
+ # The object is calulated as the arc cosine value of the subject.
4
+ class ACos < RDF::N3::Algebra::ResourceOperator
5
+ NAME = :mathACos
6
+ URI = RDF::N3::Math.acos
7
+
8
+ ##
9
+ # The math:acos operator takes string or number and calculates its arc cosine.
10
+ #
11
+ # @param [RDF::Term] resource
12
+ # @param [:subject, :object] position
13
+ # @return [RDF::Term]
14
+ # @see RDF::N3::ResourceOperator#evaluate
15
+ def resolve(resource, position:)
16
+ case position
17
+ when :subject
18
+ return nil unless resource.literal?
19
+ as_literal(Math.acos(resource.as_number.object))
20
+ when :object
21
+ return nil unless resource.literal? || resource.variable?
22
+ resource
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,26 @@
1
+ module RDF::N3::Algebra::Math
2
+ ##
3
+ # The object is calulated as the inverse hyperbolic cosine value of the subject.
4
+ class ACosH < RDF::N3::Algebra::ResourceOperator
5
+ NAME = :mathACosH
6
+ URI = RDF::N3::Math.acosh
7
+
8
+ ##
9
+ # The math:acosh operator takes string or number and calculates its inverse hyperbolic cosine.
10
+ #
11
+ # @param [RDF::Term] resource
12
+ # @param [:subject, :object] position
13
+ # @return [RDF::Term]
14
+ # @see RDF::N3::ResourceOperator#evaluate
15
+ def resolve(resource, position:)
16
+ case position
17
+ when :subject
18
+ return nil unless resource.literal?
19
+ as_literal(Math.acosh(resource.as_number.object))
20
+ when :object
21
+ return nil unless resource.literal? || resource.variable?
22
+ resource
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,26 @@
1
+ module RDF::N3::Algebra::Math
2
+ ##
3
+ # The object is calulated as the arc sine value of the subject.
4
+ class ASin < RDF::N3::Algebra::ResourceOperator
5
+ NAME = :mathASin
6
+ URI = RDF::N3::Math.asin
7
+
8
+ ##
9
+ # The math:asin operator takes string or number and calculates its arc sine.
10
+ #
11
+ # @param [RDF::Term] resource
12
+ # @param [:subject, :object] position
13
+ # @return [RDF::Term]
14
+ # @see RDF::N3::ResourceOperator#evaluate
15
+ def resolve(resource, position:)
16
+ case position
17
+ when :subject
18
+ return nil unless resource.literal?
19
+ as_literal(Math.asin(resource.as_number.object))
20
+ when :object
21
+ return nil unless resource.literal? || resource.variable?
22
+ resource
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,26 @@
1
+ module RDF::N3::Algebra::Math
2
+ ##
3
+ # The object is calulated as the inverse hyperbolic sine value of the subject.
4
+ class ASinH < RDF::N3::Algebra::ResourceOperator
5
+ NAME = :mathASinH
6
+ URI = RDF::N3::Math.asinh
7
+
8
+ ##
9
+ # The math:asinh operator takes string or number and calculates its inverse hyperbolic sine.
10
+ #
11
+ # @param [RDF::Term] resource
12
+ # @param [:subject, :object] position
13
+ # @return [RDF::Term]
14
+ # @see RDF::N3::ResourceOperator#evaluate
15
+ def resolve(resource, position:)
16
+ case position
17
+ when :subject
18
+ return nil unless resource.literal?
19
+ as_literal(Math.asinh(resource.as_number.object))
20
+ when :object
21
+ return nil unless resource.literal? || resource.variable?
22
+ resource
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,26 @@
1
+ module RDF::N3::Algebra::Math
2
+ ##
3
+ # The object is calulated as the arc tangent value of the subject.
4
+ class ATan < RDF::N3::Algebra::ResourceOperator
5
+ NAME = :mathATan
6
+ URI = RDF::N3::Math.atan
7
+
8
+ ##
9
+ # The math:atan operator takes string or number and calculates its arc tangent.
10
+ #
11
+ # @param [RDF::Term] resource
12
+ # @param [:subject, :object] position
13
+ # @return [RDF::Term]
14
+ # @see RDF::N3::ResourceOperator#evaluate
15
+ def resolve(resource, position:)
16
+ case position
17
+ when :subject
18
+ return nil unless resource.literal?
19
+ as_literal(Math.atan(resource.as_number.object))
20
+ when :object
21
+ return nil unless resource.literal? || resource.variable?
22
+ resource
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,26 @@
1
+ module RDF::N3::Algebra::Math
2
+ ##
3
+ # The object is calulated as the inverse hyperbolic tangent value of the subject.
4
+ class ATanH < RDF::N3::Algebra::ResourceOperator
5
+ NAME = :mathATanH
6
+ URI = RDF::N3::Math.atanh
7
+
8
+ ##
9
+ # The math:atanh operator takes string or number and calculates its inverse hyperbolic tangent.
10
+ #
11
+ # @param [RDF::Term] resource
12
+ # @param [:subject, :object] position
13
+ # @return [RDF::Term]
14
+ # @see RDF::N3::ResourceOperator#evaluate
15
+ def resolve(resource, position:)
16
+ case position
17
+ when :subject
18
+ return nil unless resource.literal?
19
+ as_literal(Math.atanh(resource.as_number.object))
20
+ when :object
21
+ return nil unless resource.literal? || resource.variable?
22
+ resource
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,28 @@
1
+ module RDF::N3::Algebra::Math
2
+ ##
3
+ # The object is calculated as the subject upwards to a whole number.
4
+ #
5
+ # @see https://www.w3.org/TR/xpath-functions/#func-ceiling
6
+ class Ceiling < RDF::N3::Algebra::ResourceOperator
7
+ NAME = :mathCeiling
8
+ URI = RDF::N3::Math.ceiling
9
+
10
+ ##
11
+ # The math:ceiling operator takes string or number and calculates its ceiling.
12
+ #
13
+ # @param [RDF::Term] resource
14
+ # @param [:subject, :object] position
15
+ # @return [RDF::Term]
16
+ # @see RDF::N3::ResourceOperator#evaluate
17
+ def resolve(resource, position:)
18
+ case position
19
+ when :subject
20
+ return nil unless resource.literal?
21
+ as_literal(resource.as_number.ceil)
22
+ when :object
23
+ return nil unless resource.literal? || resource.variable?
24
+ resource
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,40 @@
1
+ module RDF::N3::Algebra::Math
2
+ ##
3
+ # The subject is an angle expressed in radians. The object is calulated as the cosine value of the subject.
4
+ #
5
+ # @see https://www.w3.org/TR/xpath-functions/#func-math-cos
6
+ class Cos < RDF::N3::Algebra::ResourceOperator
7
+ NAME = :mathCos
8
+ URI = RDF::N3::Math.cos
9
+
10
+ ##
11
+ # The math:cos operator takes string or number and calculates its cosine. The arc cosine of a concrete object can also calculate a variable subject.
12
+ #
13
+ # @param [RDF::Term] resource
14
+ # @param [:subject, :object] position
15
+ # @return [RDF::Term]
16
+ # @see RDF::N3::ResourceOperator#evaluate
17
+ def resolve(resource, position:)
18
+ case resource
19
+ when RDF::Query::Variable then resource
20
+ when RDF::Literal
21
+ case position
22
+ when :subject
23
+ as_literal(Math.cos(resource.as_number.object))
24
+ when :object
25
+ as_literal(Math.acos(resource.as_number.object))
26
+ end
27
+ else
28
+ nil
29
+ end
30
+ end
31
+
32
+ ##
33
+ # Input is either the subject or object
34
+ #
35
+ # @return [RDF::Term]
36
+ def input_operand
37
+ RDF::N3::List.new(values: operands)
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,38 @@
1
+ module RDF::N3::Algebra::Math
2
+ ##
3
+ # The subject is an angle expressed in radians. The object is calulated as the hyperbolic cosine value of the subject.
4
+ class CosH < RDF::N3::Algebra::ResourceOperator
5
+ NAME = :mathCosH
6
+ URI = RDF::N3::Math.cosh
7
+
8
+ ##
9
+ # The math:cosh operator takes string or number and calculates its hyperbolic cosine. The inverse hyperbolic cosine of a concrete object can also calculate a variable subject.
10
+ #
11
+ # @param [RDF::Term] resource
12
+ # @param [:subject, :object] position
13
+ # @return [RDF::Term]
14
+ # @see RDF::N3::ResourceOperator#evaluate
15
+ def resolve(resource, position:)
16
+ case resource
17
+ when RDF::Query::Variable then resource
18
+ when RDF::Literal
19
+ case position
20
+ when :subject
21
+ as_literal(Math.cosh(resource.as_number.object))
22
+ when :object
23
+ as_literal(Math.acosh(resource.as_number.object))
24
+ end
25
+ else
26
+ nil
27
+ end
28
+ end
29
+
30
+ ##
31
+ # Input is either the subject or object
32
+ #
33
+ # @return [RDF::Term]
34
+ def input_operand
35
+ RDF::N3::List.new(values: operands)
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,40 @@
1
+ module RDF::N3::Algebra::Math
2
+ ##
3
+ # The subject is a pair of numbers. The object is calculated by subtracting the second number of the pair from the first.
4
+ #
5
+ # @example
6
+ # { ("8" "3") math:difference ?x} => { ?x :valueOf "8 - 3" } .
7
+ # { ("8") math:difference ?x } => { ?x :valueOf "8 - (error?)" } .
8
+ # { (8 3) math:difference ?x} => { ?x :valueOf "8 - 3" } .
9
+ #
10
+ # @see https://www.w3.org/TR/xpath-functions/#func-numeric-subtract
11
+ class Difference < RDF::N3::Algebra::ListOperator
12
+ NAME = :mathDifference
13
+ URI = RDF::N3::Math.difference
14
+
15
+ ##
16
+ # The math:difference operator takes a pair of strings or numbers and calculates their difference.
17
+ #
18
+ # @param [RDF::N3::List] list
19
+ # @return [RDF::Term]
20
+ # @see RDF::N3::ListOperator#evaluate
21
+ def resolve(list)
22
+ list.to_a.map(&:as_number).reduce(&:-)
23
+ end
24
+
25
+ ##
26
+ # The list argument must be a pair of literals.
27
+ #
28
+ # @param [RDF::N3::List] list
29
+ # @return [Boolean]
30
+ # @see RDF::N3::ListOperator#validate
31
+ def validate(list)
32
+ if super && list.all?(&:literal?) && list.length == 2
33
+ true
34
+ else
35
+ log_error(NAME) {"list is not a pair of literals: #{list.to_sxp}"}
36
+ false
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,54 @@
1
+ module RDF::N3::Algebra::Math
2
+ ##
3
+ # **schema**:
4
+ # `$a1 math:equalTo $a2`
5
+ #
6
+ # **summary**:
7
+ # checks equality of numbers
8
+ #
9
+ # **definition**:
10
+ # `true` if and only if `$a1` is equal to `$a2`.
11
+ # Requires both arguments to be either concrete numerals, or variables bound to a numeral.
12
+ #
13
+ # **literal domains**:
14
+ #
15
+ # * `$a1`: `xs:decimal` (or its derived types), `xs:float`, or `xs:double` (see note on type promotion, and casting from string)
16
+ # * `$a2`: `xs:decimal` (or its derived types), `xs:float`, or `xs:double` (see note on type promotion, and casting from string)
17
+ #
18
+ # @see https://www.w3.org/TR/xpath-functions/#func-numeric-equal
19
+ class EqualTo < RDF::N3::Algebra::ResourceOperator
20
+ NAME = :mathEqualTo
21
+ URI = RDF::N3::Math.equalTo
22
+
23
+ ##
24
+ # Resolves inputs as numbers.
25
+ #
26
+ # @param [RDF::Term] resource
27
+ # @param [:subject, :object] position
28
+ # @return [RDF::Term]
29
+ # @see RDF::N3::ResourceOperator#evaluate
30
+ def resolve(resource, position:)
31
+ resource.as_number if resource.term?
32
+ end
33
+
34
+ # Both subject and object are inputs.
35
+ def input_operand
36
+ RDF::N3::List.new(values: operands)
37
+ end
38
+
39
+ ##
40
+ # Returns TRUE if `term1` and `term2` are the same numeric value.
41
+ #
42
+ # @param [RDF::Term] term1
43
+ # an RDF term
44
+ # @param [RDF::Term] term2
45
+ # an RDF term
46
+ # @return [RDF::Literal::Boolean] `true` or `false`
47
+ # @raise [TypeError] if either operand is not an RDF term or operands are not comperable
48
+ #
49
+ # @see RDF::Term#==
50
+ def apply(term1, term2)
51
+ RDF::Literal(term1 == term2)
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,35 @@
1
+ module RDF::N3::Algebra::Math
2
+ ##
3
+ # The subject is a pair of numbers. The object is calculated by raising the first number of the power of the second.
4
+ #
5
+ # @see https://www.w3.org/TR/xpath-functions/#func-math-exp
6
+ class Exponentiation < RDF::N3::Algebra::ListOperator
7
+ NAME = :mathExponentiation
8
+ URI = RDF::N3::Math.exponentiation
9
+
10
+ ##
11
+ # The math:difference operator takes a pair of strings or numbers and calculates the exponent.
12
+ #
13
+ # @param [RDF::N3::List] list
14
+ # @return [RDF::Term]
15
+ # @see RDF::N3::ListOperator#evaluate
16
+ def resolve(list)
17
+ list.to_a.map(&:as_number).reduce(&:**)
18
+ end
19
+
20
+ ##
21
+ # The list argument must be a pair of literals.
22
+ #
23
+ # @param [RDF::N3::List] list
24
+ # @return [Boolean]
25
+ # @see RDF::N3::ListOperator#validate
26
+ def validate(list)
27
+ if super && list.all?(&:literal?) && list.length == 2
28
+ true
29
+ else
30
+ log_error(NAME) {"list is not a pair of literals: #{list.to_sxp}"}
31
+ false
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,28 @@
1
+ module RDF::N3::Algebra::Math
2
+ ##
3
+ # The object is calculated as the subject downwards to a whole number.
4
+ #
5
+ # @see https://www.w3.org/TR/xpath-functions/#func-floor
6
+ class Floor < RDF::N3::Algebra::ResourceOperator
7
+ NAME = :mathFloor
8
+ URI = RDF::N3::Math.floor
9
+
10
+ ##
11
+ # The math:floor operator takes string or number and calculates its floor.
12
+ #
13
+ # @param [RDF::Term] resource
14
+ # @param [:subject, :object] position
15
+ # @return [RDF::Term]
16
+ # @see RDF::N3::ResourceOperator#evaluate
17
+ def resolve(resource, position:)
18
+ case position
19
+ when :subject
20
+ return nil unless resource.literal?
21
+ RDF::Literal(resource.as_number.floor)
22
+ when :object
23
+ return nil unless resource.literal? || resource.variable?
24
+ resource
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,41 @@
1
+ module RDF::N3::Algebra::Math
2
+ ##
3
+ # True iff the subject is a string representation of a number which is greater than the number of which the object is a string representation.
4
+ #
5
+ # @see https://www.w3.org/TR/xpath-functions/#func-numeric-greater-than
6
+ class GreaterThan < RDF::N3::Algebra::ResourceOperator
7
+ NAME = :mathGreaterThan
8
+ URI = RDF::N3::Math.greaterThan
9
+
10
+ ##
11
+ # Resolves inputs as numbers.
12
+ #
13
+ # @param [RDF::Term] resource
14
+ # @param [:subject, :object] position
15
+ # @return [RDF::Term]
16
+ # @see RDF::N3::ResourceOperator#evaluate
17
+ def resolve(resource, position:)
18
+ resource.as_number if resource.term?
19
+ end
20
+
21
+ # Both subject and object are inputs.
22
+ def input_operand
23
+ RDF::N3::List.new(values: operands)
24
+ end
25
+
26
+ ##
27
+ # Returns TRUE if `term1` is greater than `term2`.
28
+ #
29
+ # @param [RDF::Term] term1
30
+ # an RDF term
31
+ # @param [RDF::Term] term2
32
+ # an RDF term
33
+ # @return [RDF::Literal::Boolean] `true` or `false`
34
+ # @raise [TypeError] if either operand is not an RDF term or operands are not comperable
35
+ #
36
+ # @see RDF::Term#==
37
+ def apply(term1, term2)
38
+ RDF::Literal(term1 > term2)
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,41 @@
1
+ module RDF::N3::Algebra::Math
2
+ ##
3
+ # True iff the subject is a string representation of a number which is less than the number of which the object is a string representation.
4
+ #
5
+ # @see https://www.w3.org/TR/xpath-functions/#func-numeric-less-than
6
+ class LessThan < RDF::N3::Algebra::ResourceOperator
7
+ NAME = :mathLessThan
8
+ URI = RDF::N3::Math.lessThan
9
+
10
+ ##
11
+ # Resolves inputs as numbers.
12
+ #
13
+ # @param [RDF::Term] resource
14
+ # @param [:subject, :object] position
15
+ # @return [RDF::Term]
16
+ # @see RDF::N3::ResourceOperator#evaluate
17
+ def resolve(resource, position:)
18
+ resource.as_number if resource.term?
19
+ end
20
+
21
+ # Both subject and object are inputs.
22
+ def input_operand
23
+ RDF::N3::List.new(values: operands)
24
+ end
25
+
26
+ ##
27
+ # Returns TRUE if `term1` is less than `term2`.
28
+ #
29
+ # @param [RDF::Term] term1
30
+ # an RDF term
31
+ # @param [RDF::Term] term2
32
+ # an RDF term
33
+ # @return [RDF::Literal::Boolean] `true` or `false`
34
+ # @raise [TypeError] if either operand is not an RDF term or operands are not comperable
35
+ #
36
+ # @see RDF::Term#==
37
+ def apply(term1, term2)
38
+ RDF::Literal(term1 < term2)
39
+ end
40
+ end
41
+ end